问题:
您要进行长途旅行。您从0英里处的公路开始行驶。沿途有n个酒店,编号为1≤i≤n,在1英里处的a 1
有人知道我如何编写使用贪婪算法解决此问题的Java代码吗? 我已经是: 但是我不知道从这里去哪里。public static void greedy(int[] a) {
int[] hotel = a;
int[] cost = new int[hotel.length];
int[] stop = new int[hotel.length];
int dist = 0;
for (int i = 0; i < hotel.length - 1; i++) {
dist = a[i + 1] - a[i];
cost[i] = (int) (Math.pow((200 - hotel[i]), 2));
stop[i] = 0;
}
}
答案 0 :(得分:0)
这个编程问题看起来像是学校的练习;显然,我们鼓励您自己努力……无论如何,这里有一些提示。
我们首先需要选择一个贪婪算法,即基于某种启发式算法的算法,该算法允许我们基于对下一家酒店的局部最优选择(要执行的选择)来“优化”总成本在每一步中。)
因此,我们需要提供一个适用于每个步骤的规则,使我们能够选择下一家酒店。
作为一种局部最优选择:我们可以选择每天前进,如果从x
点开始,我们会停靠到最靠近x+200
点的下一家酒店。< / p>
使用某种伪代码:
//start from 0
cost=0
position=0
while(position<end)
//find the next best hotel h (based on the rule above)
h=...
//compute the daily_cost
daily_cost=(h-position)^2
//move to the selected hotel
position=h
//and increase the total cost:
total_cost=total_cost+daily_cost
当position=end
时:我们已经到达,并且我们已经根据该贪婪算法计算了total_cost
。
答案 1 :(得分:0)
据我所知,您需要覆盖的总距离为a(n)
。由于我们必须待在最后的酒店里,所以我想提出一种反向模式的贪婪解决方案。
如果a(n) - a(n-1)
不能大于200
英里。因此,我想选择一家a(i)
至a(n)
之间的旅馆a(n) - 200
。现在,当我们考虑采用贪婪的方法时,您需要选择该酒店并将该酒店保存在您的访问列表中。
现在,从那里向前移动,然后选择距离a(i)
和a(i) - 200
之间的下一家酒店,依此类推,直到到达起点。
我没有编写任何代码,因为我认为这是家庭作业。但是,我认为您明白了。希望有帮助!祝你好运。
答案 2 :(得分:0)
不要向前犁并立即开始编码:首先分析任务
贪婪表示尽可能采取下一步行动(从不回头;限制或不允许超前)。
假设dₓ是第x天的距离,然后看一下150、200、250英里处的酒店:
-如果费用为200-dₓ,
总费用为150,第一距离为200以及150
-如果费用为(200-dₓ)²,
总费用为22500(第一距离为200),只有12500(150):
最好使每个绝对差异尽可能接近所有其他差异
-如果没有(完整的)前瞻,则您不知道所有剩余的内容:
下一个差异应尽可能接近预期平均剩余量
-在其他所有条件相同的情况下,一日游的次数要多于一日游的次数
-提前1天,则可以选择费用为50和2500的单日游。
how I can write a Java code that solves this problem
?
再次访问 greedy 并考虑一个(更多)示例(与往常相同):
200 miles
是上限吗? (我可以切换方向吗?)//
行注释)