我正在尝试使用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>
编辑:请注意,它指的是整个搜索过程中探索的节点数量/数量。
答案 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中删除该特定的线段。当你的桶中没有任何其他东西时,你会停止你的程序。