贪心算法(greedy algorithm)

前言

贪心算法是最基础的启发算法之一,原理简单,操作方便,其基本思想是每一步都作出当前的最优决策,它基本能够保证解的质量不会太差,但是对于解空间足够大的组合优化问题,要找到最优解基本不可能。在TSP问题中,贪婪的定义是每次都从当前城市选择一个距离最近的城市。

求解

使用贪心求解TSP问题,与之前整数规划使用的为同一数据。

import pandas as pd
from ortools.linear_solver import pywraplp

# 数据
distance = pd.read_table('distance.txt', header=None, index_col=None)
distance = distance.values.tolist()
city_num = len(distance)

# 初始化
traveled = [0 for i in range(city_num)]  # 城市是否访问
traveled_record = [-1 for i in range(city_num)]  # 记录访问城市
traveled_distance = 0  # 遍历总距离
cur_city = -1  # 当前所在城市

# 第一个访问的城市为0
traveled[0] = 1
traveled_record[0] = 0
cur_city = 0

# 贪婪地选择n-1个城市
for i in range(1, city_num):
    min_distance = 10000
    index = -1
    for j in range(city_num):
        # 已经访问过的不再访问
        if traveled[j]:
            continue
        # 不能访问当前城市
        if j == cur_city:
            continue
        # 选择一个最小距离作为下一个节点
        if distance[cur_city][j] < min_distance:
            min_distance = distance[cur_city][j]
            index = j
    # 更新当前节点、城市状态、遍历记录、总距离
    if index != -1:
        cur_city = index
        traveled[index] = 1
        traveled_record[i] = index
        traveled_distance += min_distance
    else:
        print('error:no distance smaller than min_distance')
# 回到城市0
traveled_distance += distance[traveled_record[city_num - 1]][0]
print('total length = ', traveled_distance)
print('the travel order is:')
for i in range(city_num):
    print(traveled_record[i])
print(0)

结果

求解结果为1112,GAP=(1112-937)/ 937=18.7%,可以看到和最优解之间的GAP还是比较大的,可以预想,对于更大规模的问题,GAP会更大。

total length =  1112
the travel order is:
0
14
13
9
10
12
11
8
6
7
15
18
19
17
16
20
21
25
22
23
24
2
1
3
4
5
0

Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值