我對scala和akka編程相對陌生,我試圖用akka actors爲n皇后問題寫一個解決方案。 不幸的是,我的想法並不奏效:與順序方法相比,計算所有 解決方案花費的時間更長,並且程序永不終止。然而,一些正確的解決方案被打印到控制檯。 這裏是我的代碼:用akka解決n皇后難題
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)周圍刪除註釋,則根本找不到解決方案。我該如何解決這個問題?
- 我的整個做法似乎都是錯誤的。什麼可能是更好的?
- 有可能找到一個使用期貨而不是演員的並行解決方案嗎?
提前感謝!
嗨@ user2250024,你不應該使用的答案就像一個談話。請閱讀[該網站的*關於*部分](http://stackoverflow.com/about)以熟悉網站的工作方式。 – 2013-04-08 22:15:32