news 2026/6/10 16:46:23

听说有人想用智能算法暴打旅行商?这事我熟啊!当年被TSP按在地上摩擦的经历还历历在目。今天咱们拿遗传算法开刀,手把手教你造个能自己找最优路线的AI

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
听说有人想用智能算法暴打旅行商?这事我熟啊!当年被TSP按在地上摩擦的经历还历历在目。今天咱们拿遗传算法开刀,手把手教你造个能自己找最优路线的AI

智能优化算法解决旅行商TSP问题。 ——可选如PSO、GA、ABC、SA和GASA等相关的优化算法。 代码清晰、易懂,代码质量极高,便于新手学习和理解。

先看核心武器库——种群对象。这里用numpy搞了个骚操作:每个个体都是城市的乱序排列,像洗牌一样生成初始解:

import numpy as np class GeneticTSP: def __init__(self, cities, pop_size=100): self.cities = cities self.pop_size = pop_size self.population = [np.random.permutation(len(cities)) for _ in range(pop_size)]

适应度计算简单粗暴——总距离越短得分越高。注意这里用倒数处理,让短路径获得高适应度:

def fitness(self, individual): total_distance = 0 for i in range(len(individual)): start = self.cities[individual[i]] end = self.cities[individual[(i+1)%len(individual)]] total_distance += np.linalg.norm(np.array(start)-np.array(end)) return 1 / total_distance # 距离越短适应度越高

选择环节玩的是轮盘赌,这里有个小技巧:用累积概率数组+二分搜索提速选择过程:

def select(self, scores): probs = scores / sum(scores) cum_probs = np.cumsum(probs) selected = [] for _ in range(self.pop_size): r = np.random.rand() selected.append(self.population[np.searchsorted(cum_probs, r)]) return selected

重点来了!交叉算子用的是PMX(部分映射交叉),这货能保留父母双方的部分城市顺序。看这段实现里如何处理冲突的:

def pmx_crossover(self, parent1, parent2): size = len(parent1) cx1, cx2 = sorted(np.random.choice(size, 2, replace=False)) # 创建中间子代 child = np.full(size, -1) child[cx1:cx2+1] = parent1[cx1:cx2+1] # 处理冲突 for i in range(cx1, cx2+1): if parent2[i] not in child: j = i while child[j] != -1: j = np.where(parent2 == parent1[j])[0][0] child[j] = parent2[i] # 填补空白 remaining = [gene for gene in parent2 if gene not in child] child[child == -1] = remaining return child

变异操作就简单多了,随机交换两个城市位置。这里有个加速技巧——用numpy的数组操作代替列表:

def mutate(self, individual): if np.random.rand() < 0.1: # 10%变异概率 i, j = np.random.choice(len(individual), 2, replace=False) individual[i], individual[j] = individual[j], individual[i] return individual

整套算法跑起来是这样的节奏:

def run(self, generations): for _ in range(generations): scores = [self.fitness(ind) for ind in self.population] selected = self.select(scores) # 生成新种群 new_pop = [] for i in range(0, self.pop_size, 2): parent1, parent2 = selected[i], selected[i+1] child1 = self.pmx_crossover(parent1, parent2) child2 = self.pmx_crossover(parent2, parent1) new_pop.extend([self.mutate(child1), self.mutate(child2)]) self.population = new_pop return max(self.population, key=lambda x: self.fitness(x))

实测用50个城市的数据集,迭代500代后路径长度能收敛到最优解的120%左右。想要更好效果可以试试这些骚操作:把模拟退火的局部搜索掺到变异里,或者用精英保留策略防止好解丢失。

智能优化算法解决旅行商TSP问题。 ——可选如PSO、GA、ABC、SA和GASA等相关的优化算法。 代码清晰、易懂,代码质量极高,便于新手学习和理解。

最后说句大实话——智能算法这玩意儿没有银弹。TSP的难度是指数级增长的,城市数超过100时还是老实上Lin-Kernighan启发式算法吧。不过对于教学和小规模问题,这些元启发式算法确实能让你感受到进化计算的奇妙之处。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 15:19:57

不锈钢紧固件与碳钢紧固件的区别与应用场景

在制造业对品质、可靠性与工程寿命要求日益提高的背景下&#xff0c;作为基础连接件的紧固件&#xff0c;其材料选择直接关乎结构安全与长期性能。不锈钢与碳钢是当前两大主流紧固件材料体系&#xff0c;理解其核心差异与适用场景&#xff0c;对于工程设计与采购决策至关重要。…

作者头像 李华
网站建设 2026/6/9 19:18:46

适合企业内部使用的即时通讯im软件有哪些?

在企业数字化协作场景中&#xff0c;内部即时通讯效率直接影响团队执行力&#xff0c;选择一款适配的企业IM已成为企业降本增效的关键。企业内部对即时通讯软件的核心诉求集中于数据安全可控、功能贴合组织协作、部署适配内网架构等&#xff0c;市场上多款企业IM产品各具特色&a…

作者头像 李华
网站建设 2026/6/10 15:21:16

什么是U盘开局

文章目录为什么需要U盘开局U盘开局是如何工作的U盘开局在SD-WAN场景中的应用U盘开局是一种部署简单&#xff0c;成本较低的开局技术。相比于传统的专业工程师逐台去给设备开局的方式&#xff0c;U盘开局只需要让专业工程师把开局索引文件制作好并存储到U盘中即可&#xff0c;具…

作者头像 李华
网站建设 2026/6/10 15:21:46

什么是UTM

文章目录 为什么需要UTMUTM的优势UTM的必备功能华为UTM防火墙的优势 统一威胁管理UTM&#xff08;Unified Threat Management&#xff09;是一种功能全面的安全产品&#xff0c;作为单个产品能提供多种安全功能&#xff0c;包括反病毒、反恶意软件、防火墙、入侵防御、URL过滤等…

作者头像 李华
网站建设 2026/6/10 16:52:07

面向太空应用的高效高稳定性钙钛矿电池发展综述

随着商业航天产业的快速发展&#xff0c;对轻质、高效、低成本的空间光伏技术需求日益迫切。钙钛矿太阳能电池&#xff08;PSCs&#xff09;凭借其高功率转换效率、优异的柔性及低温溶液加工潜力&#xff0c;成为极具前景的下一代空间能源技术。然而&#xff0c;太空环境中的极…

作者头像 李华