news 2026/5/11 15:15:19

直接上代码!咱们先搞明白怎么用坐标算曼哈顿距离。比如机器人坐标(3,5),任务点(7,2),距离就是|x1-x2|+|y1-y2|=4+3=7

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
直接上代码!咱们先搞明白怎么用坐标算曼哈顿距离。比如机器人坐标(3,5),任务点(7,2),距离就是|x1-x2|+|y1-y2|=4+3=7

基于遗传算法的任务分配 可以修改机器人和任务坐标 根据曼哈顿距离实现全体路程代价最小最优分配 有代码注释 有流程图

def manhattan_dist(a, b): # 两个坐标点a和b的曼哈顿距离计算 return abs(a[0]-b[0]) + abs(a[1]-b[1])

现在要解决的是多个机器人分配多个任务的最优匹配问题。遗传算法就像生物进化,通过不断迭代找到最优解。先初始化20个随机分配方案(种群),每个方案就是个任务分配序列:

import random def init_population(robot_count, task_count, pop_size=20): # 生成初始种群,每个个体是0到task_count-1的乱序排列 return [random.sample(range(task_count), task_count) for _ in range(pop_size)]

适应度函数是关键!总路程代价越小得分越高,这里用倒数处理:

def fitness(individual, robots, tasks): total_cost = 0 for robot_idx, task_idx in enumerate(individual): # 每个机器人按分配顺序走对应的任务点 robot_pos = robots[robot_idx % len(robots)] # 机器人循环分配 task_pos = tasks[task_idx] total_cost += manhattan_dist(robot_pos, task_pos) return 1 / total_cost # 代价越小适应度越高

交叉操作像父母基因重组。这里用两点交叉,随机选两个切分点交换基因片段:

def crossover(parent1, parent2): # 两点交叉,保留中间段,两端用对方基因补充 size = len(parent1) cx1, cx2 = sorted(random.sample(range(size), 2)) child = parent1[cx1:cx2] for gene in parent2: if gene not in child: child.append(gene) return child

变异操作随机打乱部分基因,增加种群多样性:

def mutate(individual, mutation_rate=0.1): # 按概率随机交换两个任务分配 if random.random() < mutation_rate: i, j = random.sample(range(len(individual)), 2) individual[i], individual[j] = individual[j], individual[i] return individual

整个流程像这样运转(伪流程图):

  1. 初始化种群
  2. While 未达到迭代次数:
    a. 计算每个个体的适应度
    b. 轮盘赌选择优秀个体
    c. 交叉产生新个体
    d. 按概率变异
  3. 输出最优解

测试运行效果:

# 假设3个机器人,5个任务点 robots = [(0,0), (2,4), (5,1)] tasks = [(3,3), (1,5), (4,2), (6,0), (2,1)] best_solution = genetic_algorithm(robots, tasks) print(f"最优分配方案:{best_solution}") # 可能输出:[2, 0, 4, 1, 3] 表示任务分配顺序

代码跑起来后可以观察到总路程代价逐步下降的过程。调整变异率和种群规模能平衡收敛速度与陷入局部最优的风险。实际应用时记得根据硬件性能调整迭代次数,通常200-500代就能稳定输出优质解。

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

Java是当今最优雅的开发语言

我认为Java是当今最优雅的开发语言&#xff01;天然成熟的生态 &#xff01;&#xff01;项目内部代码都各种积木化(模块化) (离不开spring boot的加持)我也曾用过Delphi ,C#,Python 开发 &#xff01;随感而发&#xff0c;不喜勿喷#嵌入式 #电子信息 #编程 #软件设计与开发 #找…

作者头像 李华
网站建设 2026/5/5 8:09:50

2026年最值得学习的十大 SAP 开发技术

笔者之前曾经转发过另一位技术博主的文章:被 SAP 弃用的十大开发技术盘点。 在这辞旧迎新之际,我想和大家聊聊我心中的2026年我仍然愿意持续投入时间去学习的一些 SAP 开发技术。 因为笔者水平和视野局限,加上这份清单有笔者主观兴趣爱好在内,可能大家对清单上罗列的技术…

作者头像 李华
网站建设 2026/5/10 21:58:03

Nodejs-HardCore: 模块管理与I/O操作详解

模块管理1 ) 安装与加载模块 // 通过require加载内置模块 const fs require(fs);// 加载第三方模块&#xff08;需先安装&#xff09; // npm install lodash const _ require(lodash);// 加载本地模块 const myModule require(./myModule);关键点&#xff1a; Node.js 使用…

作者头像 李华
网站建设 2026/5/9 22:40:16

JSP Session管理详解

JSP Session管理详解 引言 在JavaServer Pages(JSP)技术中,Session是服务器端用于存储特定用户会话所需属性及配置信息的类。Session可以看作是Web应用中的一种存储机制,用于跟踪用户的会话状态。本文将详细介绍JSP Session的概念、生命周期、创建、配置以及如何使用它。…

作者头像 李华
网站建设 2026/5/10 19:31:47

FPGA应用开发和仿真【2.2】

3.3.5 带有信号和波形的例子 现在,在前面例子的基础上修改代码,以代码3-10第11行定义的二进制码-格雷码转换模块为DUT,编写Testbench测试它。 依照3.3.3节的方法,新建一个名为“bin2gray.sv”的SystemVerilog文件并编辑它,在其中输入代码3-10第11~21行内容(即完整的bi…

作者头像 李华
网站建设 2026/4/18 3:28:21

CompletionService:Java并发工具包

Java并发编程利器&#xff1a;CompletionService实现原理解析引言&#xff1a;为什么需要CompletionService&#xff1f;在多线程编程中&#xff0c;我们常常需要提交一批任务并收集它们的结果。传统的做法是使用ExecutorService提交任务&#xff0c;获得Future对象集合&#x…

作者头像 李华