当前位置: 首页 > news >正文

直接上代码!咱们先搞明白怎么用坐标算曼哈顿距离。比如机器人坐标(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代就能稳定输出优质解。

http://www.jsqmd.com/news/178256/

相关文章:

  • 教育AI架构师必学的4个机器学习算法,从线性回归到Transformer
  • 根据以上内容,适合的标题可以是:“MATLAB仿真模拟光纤激光器中耗散孤子共振(DSR)的演化...
  • 深度学习计算机毕设之基于YOLOv8的人物目标检测和分割(跟踪)
  • 威纶通触摸屏宏指令:简易红绿灯控制程序实战教程
  • 深度学习计算机毕设之基于随机森林的贷款可能性预测系统实现
  • 半桥LLC谐振变换器仿真模型,采用变频控制电压闭环控制,完美跟踪给定电压,可实现软开关
  • Numpy 数组操作
  • CST仿真超表面吸波器:全流程编码分束涡旋聚焦极化转换录屏教学
  • 学长亲荐8个AI论文网站,助你搞定本科生毕业论文!
  • Highcharts 配置语法详解
  • 深度学习毕设项目:基于YOLOv8的人物目标检测和分割(跟踪)
  • 【课程设计/毕业设计】基于随机森林的贷款可能性预测系统实现
  • FOC无刷电机控制方案:原理图、PCB及C语言代码源
  • Linux 文件与目录管理
  • 斜拉桥建模这事儿,得从材料属性开始抠细节。钢混组合梁的弹性模量可不能随便填,得按实际配筋率换算等效刚度。先上段材料定义的硬核操作
  • OpenEnler等Linux系统中安装git工具的方法
  • Go 语言基础语法
  • 【毕业设计】基于随机森林的贷款可能性预测系统实现
  • 【课程设计/毕业设计】基于YOLOv8的人物目标检测和分割(跟踪)
  • 如何通过数据分析实现精准市场营销
  • Razor C# 循环
  • Nodejs-HardCore: 模块管理与I/O操作详解
  • fast.ai携手AI:对话式工程解锁编程新纪元
  • 【毕业设计】基于YOLOv8的人物目标检测和分割(跟踪)
  • 生成式数据增强方法全解析
  • 深度学习毕设选题推荐:基于随机森林的贷款可能性预测系统实现
  • vscode c++可以找到声明却无法自动补全
  • Day5if单,双,多分支语句详解及其使用案例
  • 11. 图像轮廓
  • 手机照片视频太多怎么一键按年月分类整理并批量重命名?照片视频整理神器