具有条件的路径寻找算法

时间:2016-07-29 22:04:02

标签: java algorithm path graph-algorithm

我有三个Java模型类:MapRoomObject。这些是使用JAXB从以下XML文件映射的:

<map>
   <room id="1" name="Stairway" east="2"/>
   <room id="2" name="Kitchen" north="4" south="3" west="1">
       <object name="Hat"/>
   </room>
   <room id="3" name="Hallway" east="1" south="4">
       <object name="Money"/>
   </room>
   <room id="4" name="Bathroom" south="2"/>
</map>

Map包含Room个,Room可以包含Object个。每个Room都有一些属性,指示可以从那里(北/东/西/南)到达哪个Room
例如。来自房间3 的可能方向:
房间1 (东)
房间4 (南)

还有一个Object s的单独列表,我们称之为目标

目标是“收集”所有目标,这意味着创建一条包含目标的Room路径。
您可以将其视为带有节点(Map)和边(向北/东/西/南方向指向另一个Room)的图形(Room)。

public Route findRoute(Map map, Room startRoom, List<Object> targets) {
        // walk through the map, find all targets 
        // once found them all return the route
}

所以基本上我正在寻找一种干净的方法/算法来创建一个通过该图的路径,其中每个节点都包含来自我的目标列表的Object

我知道Dijkstra算法,但我认为它不适合我的用例,因为我必须满足条件(Room必须包含特定的Object)。其他路径查找算法很少,但我找不到解决我的特定问题的方法。

任何帮助表示感谢。

编辑:

任何路径都可以(最短路径是一个很好的,但不是强制性的),并且收集目标的顺序并不重要。

1 个答案:

答案 0 :(得分:0)

这是一个粗略的方法:

  1. 让入口成为最初的起点。
  2. 选择尚未到达的目标。
  3. 执行广度优先(或深度优先)搜索,找到该目标的路径,并标记沿该路径遇到的任何其他目标。
  4. 如果找到了所有目标,请停止。
  5. 让所选目标所在的房间成为下一个起点。
  6. 转到(2)。
  7. 根据我的理解,加入所有细分所形成的路径将满足您的要求。