gpt4 book ai didi

java - 使用曼哈顿距离的多点之间的最短路径

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:46:17 24 4
gpt4 key购买 nike

<分区>

这是我在学校布置的作业之一。任何类型的建议都将不胜感激。

我有一张街道 map ,其中每个十字路口都用坐标 = 整数元组 (x, y) 表示。两个坐标之间的长度等于它们之间的曼哈顿距离。我是出租车司机,我有每个客户的坐标他们想去的坐标,起始坐标和我可以在车上容纳的最大客户数量 。我需要找到最短的路径来将我的所有客户带到他们的目的地。客户只能在他们的最终目的地下车。 结果是客户的顺序,出租车员必须在其中接送他们。

我当前的解决方案使用递归来查找它们的所有路径,比较它们的长度并返回最短的路径。问题是,它太慢了。它需要在一秒钟内完成。

感谢您的帮助!

编辑1:函数:taxi = 当前出租车坐标,starti = 所有客户的上车坐标(starti[0] = 客户 1 的上车坐标),cilji = 所有客户的最终目的地(cilji[0] = 客户 1 的下车坐标),left = 剩余开车前往目的地的客户数量,index = just为得出最终结果,n = 出租车中的最大客户数,atm = 当时车内的客户数

public static int abs(int n) {
if (n < 0) {
return -n;
}
return n;
}
public static int razdalja(int[] a, int[] b) {
return abs(a[0] - b[0]) + abs(a[1] - b[1]);
}

public static int[] fun(int[] taxi, int[][] starti, int[][] cilji, int left, int m, int index, int n, int atm) {
int[] temp1;
int[] temp2;
int[] tab = new int[m*2+1];
int[] min = new int[m*2+1];
min[m*2] = Integer.MAX_VALUE;

if (left == 0) {
return tab;
}

for (int i = 0; i < m; i++) {

if (starti[i] != null && atm < n) {
temp1 = starti[i];
starti[i] = null;

tab = fun(temp1, starti, cilji, left, m, index+1, n, atm+1);
tab[index] = i+1;
tab[m*2] += razdalja(taxi, temp1);
starti[i] = temp1;

if (tab[m*2] < min[m*2]) {
min = tab;
}

}
else if (cilji[i] != null && starti[i] == null) {
temp2 = cilji[i];
cilji[i] = null;

tab = fun(temp2, starti, cilji, left-1, m, index+1, n, atm-1);
tab[index] = i+1;
tab[m*2] += razdalja(taxi, temp2);
cilji[i] = temp2;

if (tab[m*2] < min[m*2]) {
min = tab;
}

}



}

return min;
}

输入示例

6                      //max customers in car
148,128 //taxi starting coordinates
7 //number of customers
1,45,199,178,69 //first customer startX,startY,endX,endY
2,54,87,26,83 //and so on...
3,197,147,135,93
4,12,49,61,66
5,91,8,55,73
6,88,42,15,9
7,184,144,31,34

上面输入的正确输出(我的这些数字的函数返回表+表中的最后一个数字是路径的长度)

7,3,1,2,6,5,6,7,4,2,5,4,3,1

this means:
pick (customer) 7 (184,144)
pick 3 (197,147)
pick 1 ...
pick 2
pick 6
pick 5
drop 6
drop 7
pick 4
drop 2
drop 5
drop 4
drop 3
drop 1

编辑2:更重要的是,我注意到我可能会改进一些东西,但我不确定如何改进。函数中的 for 循环总是遍历所有 i 值,即使在很多情况下它什么也不做直到它达到足够高的“i”,因为 starti[i] 和 cilji[i] 对于大多数情况下都等于 null i 值,一旦我们在递归中足够深入。对于每个已交付的客户,都有一个不执行任何操作的迭代。


这是两个客户的树的样子: /image/P3irL.png圆圈坐标是出租车下客的地方(我忘了圈一个,很明显)。

input:
2
5,5
2
1,3,7,5,7
2,9,2,9,7

output:
1,1,2,2

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com