无向图

时间:2011-09-13 03:47:56

标签: java algorithm graph a-star

我正在尝试使用Java进行分配,但我对如何设置/下图的节点感到困惑。基本上,它是笔式绘图仪问题,或更常见的旅行商问题。我的以下输入是:

Line between 4 1 and 4 4    
Line between 4 4 and 4 7    
Line between 2 6 and 4 4   
Line between 4 4 and 6 2  
Line between 6 6 and 4 4   
Line between 2 2 and 4 4   

我的输出结果如下:

<n> nodes explored
cost = 24.61
Move from 0 0 to 2 2
Draw from 2 2 to 4 4
Draw from 4 4 to 6 6
Move from 6 6 to 4 7
Draw from 4 7 to 4 4
Draw from 4 4 to 4 1
Move from 4 1 to 6 2
Draw from 6 2 to 4 4
Draw from 4 4 to 2 6

假设纸张的左下角是您的开始(0,0)并且它在坐标中上升,每个坐标是一个节点,我将如何确定何时移动并绘制一条线。我知道我应该使用带有A *的无向图,但我仍然很困惑哪些是节点(顶点)以及我如何确定何时移动以及何时绘制线条,有人可以给我一些建议吗? / p>

编辑:请注意,它指的是整个搜索过程中探索的节点数量/数量。

2 个答案:

答案 0 :(得分:1)

要使用A *,首先需要admissible heuristic function。 [解释本回答的末尾附有什么]。

问题作为A的图表:*
将G =(V,E)定义为图形,这样:
V={all possible drawings prefixes} [即所有可能的'快照'每个可能的抽奖]。请注意,您不应该在内存中保存此图形,而是使用next()动态创建它,稍后将对此进行说明。 [请注意,实际上,对于每个州,您实际上只需要存储(1)当前笔在哪里(2)已经绘制的行所在的位置]
E={all possible changes from one 'snap shot' to another}
您还需要w:E->R [权重函数],它只是:w(point1,point2)=euclidian_distance(point1,point2)

您还应该定义next:V->P(V)next(v)={all snap shots you can get from v, using exactly one move/draw
最后,您还应该定义F:所有“结束”状态。 F={all the prefixes which all the lines are drawn}

如何运行A *: 从你的笔位于(0,0)的快照开始,并且没有绘制线[这是初始状态],并继续前进,直到找到最终状态之一。当你这样做时,如果你的启发式有效,你可以保证得到优化的解决方案,因为A *是admissible and optimized

(*)允许的启发式功能: 从顶点v开始h*(v)=real distance to target。 一个启发式函数h:如果V中的每个v h(v)<=h*(v),则V-> R是可接受的

您真正的挑战
TSP的难点在于找到可接受的h。它是如此困难,因为你不知道最短路径是什么,如果启发函数不被允许,则不能保证找到的解决方案将被优化。

<强>建议:
你可能想要使用一些any time algorithm,当我做了类似的事情时,[解决了多个代理的TSP]我也使用了A *,但是从无效的启发式开始,并迭代地减少它,所以,如果我有足够的时间,我找到了最佳解决方案,如果没有 - 我返回了我能找到的最佳解决方案。

答案 1 :(得分:0)

由于您要解决的问题是NP Hard,因此没有有效的方法来解决旅行商问题。首先要做的是将所有顶点对(from和to)存储在ArrayList中,并根据需要使用它们。

什么时候搬家:
每当你处于一个点并且你的ArrayList中没有一个起始节点时,你将不得不选择数组中的下一个元素并移动到那里。

你什么时候画画:
平局可以在两种情况下发生。移动到某一点后,将进行绘制。当您的线段的终点作为起点存在于线段中时,也会发生绘制。

每次绘制后,您都应该从ArrayList中删除该特定的线段。当你的桶中没有任何其他东西时,你会停止你的程序。