@@ -37,32 +37,43 @@ object Solver {
3737 }
3838
3939 private def nextStep (problem : ProblemDefinition , knowledge : KnowledgeHolder ): Step =
40- var ede = Map .empty[(Int , Int ), Seq [Int ]]
40+ // (room, door in that room) -> (possible destination rooms)
41+ var roomAndDoorToPossibleRooms = Map .empty[(Int , Int ), Seq [Int ]]
4142
4243 for (j <- knowledge.visitedRoutes.indices) {
4344 val plan = knowledge.visitedRoutes(j)
44- val rooms = knowledge.results (j)
45+ val rooms = knowledge.visitedRooms (j)
4546
4647 for (i <- plan.indices) {
4748 val door = plan(i)
48- val enter = rooms(i)
49- val exit = rooms(i + 1 )
49+ val roomFrom = rooms(i)
50+ val roomTo = rooms(i + 1 )
5051
51- val key = (enter , door)
52+ val key = (roomFrom , door)
5253
53- if (! ede .contains(key)) {
54- ede += (key -> Seq (exit ))
55- } else if (! ede (key).contains(exit )) {
56- ede += (key -> (ede (key) :+ exit ))
54+ if (! roomAndDoorToPossibleRooms .contains(key)) {
55+ roomAndDoorToPossibleRooms += (key -> Seq (roomTo ))
56+ } else if (! roomAndDoorToPossibleRooms (key).contains(roomTo )) {
57+ roomAndDoorToPossibleRooms += (key -> (roomAndDoorToPossibleRooms (key) :+ roomTo ))
5758 }
5859 }
5960 }
60-
61- val eded : Map [(Int , Int ), Seq [(Int , Int )]] =
62- ede.map { case (key @ (a, b), exits) =>
63- val relatedKeys = ede.keys.filter { case (x, y) => exits.contains(x) && ede(x, y).contains(a) }.toSeq
64- key -> relatedKeys
65- }
61+ // for ((key, roomsTo) <- roomAndDoorToPossibleRooms)
62+ // println(s"$key => $roomsTo")
63+
64+ // (room) -> (room from which we could come into room in key, door in source room)
65+ var roomToPossibleRoomAndDoorFrom = Map .empty[Int , Set [(Int ,Int )]]
66+ for ((key, roomsTo) <- roomAndDoorToPossibleRooms) {
67+ val roomFrom = key._1
68+ val relatedKeys : Set [(Int ,Int )] = roomAndDoorToPossibleRooms.keys.filter { case (room, door) => roomsTo.contains(room) && roomAndDoorToPossibleRooms(room, door).contains(roomFrom) }.toSet
69+ if (! roomToPossibleRoomAndDoorFrom.contains(roomFrom)) {
70+ roomToPossibleRoomAndDoorFrom += (roomFrom -> relatedKeys)
71+ } else {
72+ roomToPossibleRoomAndDoorFrom += (roomFrom -> (roomToPossibleRoomAndDoorFrom(roomFrom) ++ relatedKeys))
73+ }
74+ }
75+ // for ((key, value) <- roomToPossibleRoomAndDoorFrom)
76+ // println(s"$key => $value")
6677
6778 // I did not implemented it, but someone moore clever than me can implement the following approach:
6879 // 1) make a walk using routes and map of exit-door <-> possible enter-doors (eded var)
@@ -88,6 +99,6 @@ object Solver {
8899private def explore (problem : ProblemDefinition , knowledge : KnowledgeHolder , plans : Seq [Seq [Int ]]): KnowledgeHolder =
89100 println(" Exploring the labyrinth..." )
90101 println(" Plans:\n " + plans.map(_.mkString(" " )).mkString(start = " - " , sep = " \n " , end = " " ))
91- val results = Ædificium.explore(plans)
92- println(" Exploration results:\n " + results .map(_.mkString(" " )).mkString(start = " - " , sep = " \n " , end = " " ))
93- knowledge.incorporateKnowledge(plans, results )
102+ val visitedRooms = Ædificium.explore(plans)
103+ println(" Exploration results:\n " + visitedRooms .map(_.mkString(" " )).mkString(start = " - " , sep = " \n " , end = " " ))
104+ knowledge.incorporateKnowledge(plans, visitedRooms )
0 commit comments