1

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

前もって感謝します!

4

1 に答える 1