我对使用 scala 和 akka 进行编程比较陌生,我尝试使用 akka 演员为 n-queens 问题编写解决方案。不幸的是,我的想法效果不佳:与顺序方法相比,计算所有解决方案需要更长的时间,并且程序永远不会终止。但是,一些正确的解决方案会打印到控制台。这是我的代码:
case class Work(list: List[Point])
case class Reply(list: List[Point])
class QueenWorker(val master: ActorRef) extends Actor {
override def preStart() = {
println("new worker")
}
def receive = {
case Work(list) =>
val len = list.length
if (len < size) {
val actors = for (
i <- 0 until size if (!list.exists(_.y == i))
) yield (context.actorOf(Props(new QueenWorker(master))), i)
actors.foreach { case (actor, pos) => actor ! Work(list :+ (new Point(len, pos))) }
} else {
if (check(list)) { //check() checks whether the solution is valid
master ! Reply(list)
println("solution found!")
}
//else sender ! Reply(List[List[Point]]())
}
//context.stop(self) //when do I have to use it?
//println("worker stopped - len "+len)
}
}
class QueenMaster extends Actor {
override def preStart() = {
println("preStart")
context.actorOf(Props(new QueenWorker(self))) ! Work(List[Point]())
}
def receive = {//print solution to console
case Reply(list) =>
for (x <- 0 until size) {
for (y <- 0 until size) {
if (list.exists(p => p.x == x && p.y == y)) print("x ") else print("o ")
}
println()
}
println()
}
}
def runParallel {
val system = ActorSystem("QueenSystem")
val queenMaster = system.actorOf(Props[QueenMaster])
}
我的意图是为每个新的回溯迭代创建一个新的演员。如果一个参与者找到了一个有效的解决方案,它将被发送给将其打印到控制台的主控。
- 程序永远不会终止。但是,如果我删除 //context.stop(self) 周围的评论,根本找不到解决方案。我该如何解决这个问题?
- 我的整个方法似乎是错误的。有什么更好的呢?
- 是否有可能找到使用期货而不是演员的并行解决方案?
提前致谢!