前言
贪心算法是最基础的启发算法之一,原理简单,操作方便,其基本思想是每一步都作出当前的最优决策,它基本能够保证解的质量不会太差,但是对于解空间足够大的组合优化问题,要找到最优解基本不可能。在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