TSP算法代码从入门到精通,助你轻松解决旅行商问题

时间:2025-09-22 03:21:02 阅读:790

旅行商问题(Traveling Salesman Problem,简称TSP)是组合优化中的一个经典问题,也是计算机科学和运筹学领域的一个难题。简单来说,TSP问题就是要求解从一个地点出发,经过一系列的地点,最后回到出发地点,使得所有地点访问的总距离最短。这个问题在实际生活中有着广泛的应用,比如物流配送、旅行路线规划等。

一、TSP算法概述

TSP算法主要分为两大类:启发式算法和精确算法。启发式算法在计算效率上相对较高,但解的质量可能不如精确算法;精确算法虽然解的质量较高,但计算时间较长,不适用于大规模问题的求解。

二、TSP算法代码实现

下面以Python为例,介绍几种常见的TSP算法代码实现。

1. 遗传算法

遗传算法是一种模拟自然选择和遗传学原理的优化算法。以下是遗传算法解决TSP问题的Python代码实现:

```python

import numpy as np

初始化种群

def init_population(num_individuals, num_cities):

population = []

for _ in range(num_individuals):

individual = np.random.permutation(num_cities)

population.append(individual)

return population

计算适应度

def calculate_fitness(individual, distance_matrix):

fitness = 0

for i in range(len(individual) - 1):

fitness = distance_matrix[individual[i]][individual[i 1]]

fitness = distance_matrix[individual[-1]][individual[0]]

return fitness

选择

def select(population, fitnesses, num_parents):

parents = []

for _ in range(num_parents):

idx = np.random.randint(0, len(population))

parents.append(population[idx])

return parents

交叉

def crossover(parent1, parent2):

child = []

for i in range(len(parent1)):

if np.random.random() < 0.5:

child.append(parent1[i])

else:

child.append(parent2[i])

return child

变异

def mutate(individual, mutation_rate):

for i in range(len(individual)):

if np.random.random() < mutation_rate:

j = np.random.randint(0, len(individual))

individual[i], individual[j] = individual[j], individual[i]

return individual

遗传算法

def genetic_algorithm(num_individuals, num_cities, distance_matrix, num_generations):

population = init_population(num_individuals, num_cities)

for _ in range(num_generations):

fitnesses = [calculate_fitness(individual, distance_matrix) for individual in population]

parents = select(population, fitnesses, num_parents=2)

new_population = []

for _ in range(num_individuals // 2):

parent1, parent2 = parents[np.random.randint(0, 2), np.random.randint(0, 2)]

child1 = crossover(parent1, parent2)

child2 = crossover(parent2, parent1)

child1 = mutate(child1, mutation_rate=0.01)

child2 = mutate(child2, mutation_rate=0.01)

new_population.extend([child1, child2])

population = new_population

best_individual = population[np.argmax([calculate_fitness(individual, distance_matrix) for individual in population])]

best_fitness = calculate_fitness(best_individual, distance_matrix)

return best_individual, best_fitness

获取距离矩阵

def get_distance_matrix(num_cities):

distance_matrix = np.random.randint(1, 100, size=(num_cities, num_cities))

np.fill_diagonal(distance_matrix, np.inf)

return distance_matrix

主函数

if __name__ == '__main__':

num_cities = 10

distance_matrix = get_distance_matrix(num_cities)

best_individual, best_fitness = genetic_algorithm(num_individuals=100, num_cities=num_cities, distance_matrix=distance_matrix, num_generations=1000)

print("

http://ows.hyxxqj.comhttp://qhp.hyxxqj.comhttp://kpd.hyxxqj.comhttp://ada.hyxxqj.comhttp://dsv.hyxxqj.comhttp://clt.cdsjzy.comhttp://cpq.cdsjzy.comhttp://wfm.cdsjzy.comhttp://ool.cdsjzy.comhttp://tts.cdsjzy.comhttp://nir.cdsjzy.comhttp://cmk.cdsjzy.comhttp://lyq.cdsjzy.comhttp://mxu.cdsjzy.comhttp://aec.cdsjzy.comhttp://bgm.cdsjzy.comhttp://oni.cdsjzy.comhttp://dfm.jadbzjx.comhttp://ksk.jadbzjx.comhttp://jep.jadbzjx.comhttp://ndc.jadbzjx.comhttp://kdr.jadbzjx.comhttp://nme.jadbzjx.comhttp://apx.jadbzjx.comhttp://xmf.jadbzjx.comhttp://jme.jadbzjx.comhttp://ede.jadbzjx.comhttp://thy.jadbzjx.comhttp://bqc.uzjdbwx.comhttp://wdy.uzjdbwx.comhttp://cfe.uzjdbwx.comhttp://csn.uzjdbwx.comhttp://ozx.uzjdbwx.comhttp://ttm.uzjdbwx.comhttp://lfg.uzjdbwx.comhttp://enc.uzjdbwx.comhttp://btz.jjhlscs.comhttp://npz.jjhlscs.comhttp://kys.jjhlscs.comhttp://kbh.jjhlscs.com