算法5·贪婪算法(旅行商问题)

解释:
该算法用于需要计算所有的解,并从中找到最短的那一个
与狄克斯特拉算法不同的是:这里只输入了狄克斯特拉算法里面的cost


# 输入旅行表信息
distance = {}
distance['ab'] = distance['ba'] = 10
distance['ac'] = distance['ca'] = 12
distance['ad'] = distance['da'] = 16
distance['bc'] = distance['cb'] = 12
distance['bd'] = distance['db'] = 10
distance['cd'] = distance['dc'] = 8


def search2(data, will_del, end, count):

    lowest_distance = 1000
    lowest_distance_name = None

    for i in distance.keys():
        if i[0] == data and i[-1] != will_del:  # 选择出发打头的路线并且剔除返回路线
            if distance[i] < lowest_distance:
                lowest_distance = distance[i]
                lowest_distance_name = i
    print(lowest_distance_name[-1])
    print("|")
    data = lowest_distance_name[-1]
    will_del = lowest_distance_name[0]
    count += 1
    if count > end:  # 循环结束标志,即回到出发点
        print('Have a good day')
    else:
        search2(data, will_del, end, count)


def main():
    data = input('请自定义起始出发点:')
    counts = input("请输入旅行地点个数:")
    print("最佳旅行路线如下:")
    print(data)
    print("|")
    count = eval(counts)  # 地点数
    end = count + (count - 1)
    search2(data, "N1", end, count)  # 输入N1,所有路线全是英文字母,1有利于首次剔除


if __name__ == '__main__':
    main()

结果展示:


请自定义起始出发点:c
请输入旅行地点个数:4
最佳旅行路线如下:
c
|
d
|
b
|
a
|
c
|
Have a good day

添加删除,使得再次循环次数减少
该方法可以在大量路线循环时减少运算时间,但是结果只能趋近于最优解(如该代码中的出发地b),这也是贪婪算法的弊端所在


# 输入旅行表信息
distance = {}
distance['ab'] = distance['ba'] = 10
distance['ac'] = distance['ca'] = 12
distance['ad'] = distance['da'] = 16
distance['bc'] = distance['cb'] = 12
distance['bd'] = distance['db'] = 10
distance['cd'] = distance['dc'] = 8


def search(data, will_del, end, count):
    lowest_distance = 1000
    lowest_distance_name = None

    for i in list(distance.keys()):
        if i[0] == data and i[-1] != will_del:  # 选择出发打头的路线并且剔除返回路线
            if distance[i] < lowest_distance:
                lowest_distance = distance[i]
                lowest_distance_name = i
                del distance[i]                 # 删除已过滤的路线,使得下次循环次数减少
                del distance[i[::-1]]

    print("     " + lowest_distance_name[-1])
    print("     |")
    data = lowest_distance_name[-1]
    will_del = lowest_distance_name[0]
    count += 1
    if count > end:  # 循环结束标志,即回到出发点
        print('回到出发点:')
        print('     |')
    else:
        search(data, will_del, end, count)


def main():
    data = input('请自定义起始出发点:')
    counts = input("请输入旅行地点个数:")
    print("最佳旅行路线:")
    print('     ' + data)
    print("     |")
    count = eval(counts)  # 地点数
    end = count + (count - 2)
    search(data, "N1", end, count)  # 输入N1,所有路线全是英文字母,1有利于首次剔除
    print("     " + data)
    print("     |")
    print("Have a good day")


if __name__ == '__main__':
    main()

结果展示:


请自定义起始出发点:c
请输入旅行地点个数:4
最佳旅行路线:
     c
     |
     d
     |
     b
     |
     a
     |
回到出发点:
     |
     c
     |
Have a good day

Process finished with exit code 0

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值