news 2026/5/7 2:15:11

听说有人想用智能算法暴打旅行商?这事我熟啊!当年被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/5/1 12:35:04

Java计算机毕设之基于springboot的高校学生心理健康管理系统基于Springboot的大学生心理健康管理平台(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/1 14:03:05

Java毕设选题推荐:基于Springboot的大学生心理健康管理平台基于springboot的高校学生心理健康管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/1 7:13:53

im推荐-BeeWorks私有化部署的局域网即时通讯工具

IM推荐-BeeWorks私有化部署的局域网即时通讯工具在当今数字化办公时代&#xff0c;选择一款安全、高效且可控的企业IM&#xff08;即时通讯&#xff09;工具&#xff0c;是构建高效协作团队和保障信息资产安全的基石。面对公有云通讯工具在数据隐私和网络依赖上的固有风险&…

作者头像 李华
网站建设 2026/5/2 9:47:53

Java计算机毕设之基于SpringBoot+Vue的二手手机交易平台基于springboot的二手手机销售系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/5/6 22:09:56

Java毕设选题推荐:基于Spring Boot+Vue的二手手机销售的设计与实现基于springboot的二手手机销售系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华