私は 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) の周りのコメントを削除すると、解決策がまったく見つかりません。この問題を解決するにはどうすればよいですか?
- 私のアプローチ全体が間違っているようです。より良いものは何でしょうか?
- アクターの代わりに先物を使用して並列ソリューションを見つけることは可能でしょうか?
前もって感謝します!