代码A
基于python-tsp(https://github.com/fillipe-gsm/python-tsp/)
实现
# -*- encoding: utf-8 -*-
#基于 python-tsp
#https://github.com/fillipe-gsm/python-tsp/
#输入:带有2列数据的csv,第一列为x值,第二列为y值 position_xy_input.csv
#输出:带有2列数据的csv,第一列为x值,第二列为y值 position_xy_output.csv
import csv
import numpy as np
from python_tsp.distances import great_circle_distance_matrix
from python_tsp.exact import solve_tsp_dynamic_programming
from python_tsp.heuristics import solve_tsp_local_search, solve_tsp_simulated_annealing
def create_output_file(filename,data,indexes):
x = [data[i][0] for i in indexes]
y = [data[i][1] for i in indexes]
with open(filename,'w',newline='')as f:
writer = csv.writer(f)
for pos in zip(x, y):
writer.writerow(pos)
sources = np.genfromtxt('position_xy_input.csv',delimiter=',')
distance_matrix = great_circle_distance_matrix(sources) #获得距离矩阵
distance_matrix[:,0]=0 #不需要回到起点,所以将距离矩阵第一列所有元素设为零
permutation, distance = solve_tsp_simulated_annealing(distance_matrix)
permutation2, distance2 = solve_tsp_local_search(
distance_matrix, x0=permutation, perturbation_scheme="ps3"
)
oridata = sources.tolist()
create_output_file('position_xy_output.csv',oridata,permutation2)
代码B
参考https://github.com/425776024/TSP-GA.py
根据实际需求稍微改写了下TSP_GA.py
和 DW.py
两个文件
输入文件:pos_input.csv
输出文件:pos_output.csv
TSP_M.py
# -*- encoding: utf-8 -*-
#基于https://github.com/425776024/TSP-GA-py修改
#输入:带有2列数据的csv,第一列为x值,第二列为y值 position_xy_input.csv
#输出:带有2列数据的csv,第一列为x值,第二列为y值 position_xy_output.csv
import csv
import numpy as np
import pandas as pd
from numpy.linalg import norm
#windows
# from . import Draw
#linux
from DW_M import Draw
class TSP(object):
poss = np.array([])
pos_list = np.array([])
pop_size = 50
c_rate = 0.7
m_rate = 0.05
pop = np.array([])
fitness = np.array([])
pos_size = -1
ga_num = 500
best_dist = 1
best_gen = []
dw = Draw()
def __init__(self, c_rate, m_rate, pop_size, ga_num):
self.fitness = np.zeros(self.pop_size)
self.c_rate = c_rate
self.m_rate = m_rate
self.pop_size = pop_size
self.ga_num = ga_num
def init(self):
tsp = self
tsp.load_Position()
tsp.pop = tsp.creat_pop(tsp.pop_size)
tsp.fitness = tsp.get_fitness(tsp.pop)
tsp.dw.bound_x = [np.min(tsp.poss[:, 0]), np.max(tsp.poss[:, 0])]
tsp.dw.bound_y = [np.min(tsp.poss[:, 1]), np.max(tsp.poss[:, 1])]
tsp.dw.set_xybound(tsp.dw.bound_x, tsp.dw.bound_y)
# --------------------------------------
def creat_pop(self, size):
pop = []