【发布时间】:2017-01-19 18:36:21
【问题描述】:
def basic_greedy():
start = 1
mindist = d_dict[(1,2)]
m = 0
while len(tour)!=size:
tour.append(start)
for k in range(len(cities)):
if cities[k] not in tour:
if d_dict[(start,cities[k])]<mindist:
mindist = d_dict[(start,cities[k])]
m = k
start = cities[m]
return tour
这是我在 Python 中进行基本贪心搜索的代码。 start 是起始城市,tour 是一个列表,其中包含按访问顺序排列的城市,cities 是一个包含 1 中所有城市的列表size (1,2,3,4.....12..size) 其中 size 是城市的数量。 d_dict 是一个字典,包含每对可能的城市之间的距离。 mindist 和 m 只是临时变量,用于跟踪最近的邻居等。
我希望代码从城市 1 开始,移动到最近的邻居,然后到最近的邻居,直到每个城市都被覆盖一次。我希望这段代码的输出类似于城市 1 到 8 的 [1,5,3,8,4,6,2,7](访问所有城市恰好一次),但我得到 [1,7,7,7,7,7,7,7]。怎么了?
【问题讨论】:
-
d_dict 是否包括城市与城市之间的距离?看起来你可能会以 7 为结尾,因为 7 最接近它自己。此外,您可能想在下一个循环开始之前重置 mindist;如果我从 city1 到 city2 并且距离为 1 个单位,然后从 city2 到任何地方的距离为 >1 个单位,会发生什么情况。
-
@AlbertRothman 刚刚重置 mindist 有效:D 我刚开始时包括 mindist = 99。休息照原样。非常感谢!
-
很高兴工作。为了使它更好,您可以搜索字典并找到最大的距离,然后在其中添加一个,并在每个循环开始时将其用作思维器;这样您的大距离就不会被硬编码(因此您可以添加比 99 更远的城市并且仍然可以获得解决方案)。
标签: python loops infinite-loop greedy traveling-salesman