我的作业有一个MxN网格
例如
M = 5,N = 8
KKKK....
.###...X
.XX#...X
...#....
........
K-起点,X-终点,#-障碍物
我需要找到最小的数量来搬运包裹,从起点到终点。 我们一次只能携带1个包裹,而且不能对角移动。
此示例的答案为20。
我的建议是实施A *算法并针对每种可能性启动它(计算从每个起点到每个终点的最小移动量),并选择最小的一个,考虑到事实1包涵盖了1个端点。
是否有更好的方法来实现?
答案 0 :(得分:1)
尽管我对此的实际理解是有限的,但我将尝试将问题表达为minimum-cost flow problem。将每个起点视为一个源,将每个终点视为一个宿。在特定边缘上发送流f
的成本为f * a
,其中a
是边缘的成本。处理多个源和接收器的一种常用方法是将每个组连接到另一个实例。
暂定公式:
致电n
作为起点或终点的数量。
使用流n
将所有起点连接到单个源,其中每个边的容量和流为1,成本为0。
将所有终点连接到一个水槽,每个边的容量为1,成本为0。
所有其他边均具有无限容量(至少n
似乎可以解决)并花费1。
找到通过网络实现流量n
的最低费用。
图:
imaginary source
with edge to each
S with capacity 1
/ /|\
S1S-S1S2.2.2.2.
2 | | | 2 imaginary sink
. # # # .-.-.-T -- with edge to
2 | | | 1 each T with
.2T1T # .-.-.-T -- capacity 1
| |
. . . # . . . .
. . . . . . . .
(图中的数字是通过每个边缘的最佳流量,它们总计为20。)