旅行商

'''
此程序是旅行商问题,有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)

猜你喜欢

转载自blog.csdn.net/weixin_42053726/article/details/88868199