'''
此程序是旅行商问题,有4个地点分别用0,1,2,3,表示,目前我处在0这个地点,问我要去其他三个地方使得路径最短
第一步:比较容易一些,初始化所有状态。
有一些状态具有隐秘性,比如目前我所处的状态。
'''
import numpy as np
# 初始化
namePoint=np.array([0,1,2,3]) #用一个列表存储所有地点的名字
# 用一个矩阵存储每两个地点的距离
Dis_each = np.array([[0,2,6,5],
[2,0,4,4],
[6,4,0,2],
[5,4,2,0]])
# 一下四个状态都是我要更新的,在每一步中
now_distance = 0 # 用一个int代表目前我走的距离
nowWhere_are_at = 0 #用一个int表示目前我所在的地点
tag = np.array([1,0,0,0]) #用一个和存储地点一样的数组存放走过的地方。
# print(namePoint[np.where(tag == 0)])
result = [0] # 用一个列表表示我走过的路线
# 以上是初始化所有变量。下面的变量都是临时存储的
'''
第一步 :查找第一个离我近的点:我发现查找一个点后,还要在查找,就必须使用循环了,循环终止条件是没有可以查找的点了
因此,下面代码就被写出来了。这个比较easy!!^v^
while True:
if 0 not in tag:
print('没有可用的点了')
break
第二步:完成每一次查找地点的处理方法了。
1,先把这些没有去过的地点拿出来。:这里就必须新建一个列表了临时存储了。temp
2,将这些点距我现在的距离都拿出来。注意要和地点打包在一起才可以,否则排序就穿帮了。
这里还要建一个临时列表存放这些。temp_dis_to_now
3,排序一下,找到距我现在距离最小的地点的名字。
4,将这个点加进我的result里,并且在距离上我在加上去,更新一下我所在的地点。最后标记一下我来到这个地方了。
'''
while True:
if 0 not in tag:
print('没有可用的点了')
break
# 找到没有被标记过的点,列表里面存放在点的名字这里是1,2,3
temp =namePoint[np.where(tag == 0)]
# 将他们的距离拿出来存放到 temp_dis_to_now
temp_dis_to_now= [] # 这里存放的是temp到我这里的距离
for i in temp:
temp_dis_to_now.append(Dis_each[nowWhere_are_at][i])
temp_dis_to_now=zip(temp_dis_to_now,temp)
# 将temp_dis_to_now这些距离最小的拿出来
# 排序
temp_dis_to_now = sorted(temp_dis_to_now)
# 拿出来最小值放到result里面
result.append(temp_dis_to_now[0][1])
tag[temp_dis_to_now[0][1]]=1
now_distance += temp_dis_to_now[0][0]
nowWhere_are_at = temp_dis_to_now[0][1] # 循环的最后目前我处于3这个点上,还没有回到0点
# 回到0点
result.append(0)
now_distance += Dis_each[0][nowWhere_are_at]
print(now_distance)
print(result)