我正在进行一项需要使用A *算法的作业,但我无法弄清楚如何。
分配是,想象一个邮递员将网格地图上的包裹从(0,0)
发送到无限。他在一天开始时列出任务列表,每个任务分配一个起点(x1,y1)
和一个终点(x2,y2)
。由于他不能同时处理两项任务,他将不得不安排这些任务,这样当他完成一项任务并从终点移动到下一个起点时,他可以在一整天内保持最小的行程距离。 。距离计算为曼哈顿距离d(x1,y1,x2,y2) = abs(x2 - x1) + abs(y2 - y1)
。
示例输入:
Job 3 3 to 5 3 # there is a job from (3,3) to (5,3)
Job 1 1 to 9 2 # there is a job from (1,1) to (9,2)
Job 3 5 to 2 7 # there is a job from (3,5) to (2,7)
Job 5 5 to 5 7 # there is a job from (5,5) to (5,7)
示例输出:
n nodes explored
cost = 31
Move from 0 0 to 1 1
Carry from 1 1 to 9 2
Move from 9 2 to 3 3
Carry from 3 3 to 5 3
Move from 5 3 to 5 5
Carry from 5 5 to 5 7
Move from 5 7 to 3 5
Carry from 3 5 to 2 7
在我看来,尽管这里提到了图形(或图),但它并不是必需的,因为唯一重要的部分是将这些任务分类到最小,同时可以很容易地计算距离。愚蠢的东西将是排列并选择成本最低的那个但从不采用那个。我也尝试过Greedy,但它可能无法获得全球最佳解决方案。
所以问题是,自A *算法。是为路径寻找而设计的,我们如何将这个或其变体应用于找到正确方法的问题?
答案 0 :(得分:0)
我认为您正试图解决旅行商问题(TSP)的变种 http://en.wikipedia.org/wiki/Travelling_salesman_problem
对于作业A和B,您可以计算A的终点和作业B的起点之间的曼哈顿距离,并将其视为从A到B的距离。此操作会将问题更改为TSP。
转型后,你的问题变成了“使用A *来解决旅行商问题”,这是一个完美的匹配:How can the A* algorithm be applied to the traveling salesman problem?
答案 1 :(得分:0)
取所有这些点并将其喂入kd树。您可以使用kd-tree查找任何点的最近邻居。
在运行A *算法时,使用最近邻居展开下一个节点。转到最近邻居表示的路径的末尾,然后再次展开。删除操作将采用O( log n )平均时间,我希望这将适合您的实现。
例如:
n个节点探索
费用= 31
查找(0,0)=>的最近邻居(1,1)强>
从0 0移至1 1
从1 1到9 2进行
查找最近邻居(9,2)=> (3,3)强>
从9 2移动到3 3
从3 3进行到5 3
查找(5,3)=>的最近邻居(5,5)强>
从5 3移动到5 5
从5 5进行到5 7
查找(5,7)=>的最近邻居(3,5)强>
从5 7移到3 5
从3 5进行到2 7
+++++++++++++++++++++++++++++++++++++++++
选中此项以获取kd-tree概述:http://en.wikipedia.org/wiki/Travelling_salesman_problem
并查看此视频,了解基于数组的kd-tree实现:http://www.youtube.com/watch?v=2SbVSxWGtpI
P.S: - 仅将每个路径的第一个节点插入树中。还有一件事......蛮力会给你带来全球最佳......但会耗费大量时间。