news 2026/6/11 5:51:50

基于遗传算法的‘多无人机协同任务分配‘:种群个体代表完整任务分配方案,以代价函数最小化为目标进行优化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于遗传算法的‘多无人机协同任务分配‘:种群个体代表完整任务分配方案,以代价函数最小化为目标进行优化

-基于遗传算法的多无人机协同任务分配 - 种群中的每一个个体代表一次完整的任务分配方案,模型目标是找到代价函数的最小值,当作任务分配的最终方案 - 任务的代价评估分为两部分:无人机的总航程和消耗的总时间,分别设置了不同权重

凌晨三点盯着屏幕上跳动的仿真数据,我突然意识到无人机编队任务分配就像在玩一场多维俄罗斯方块——不仅要考虑每架飞机去哪儿,还得平衡时间成本和续航能力。传统算法在这里总显得笨手笨脚,直到尝试用遗传算法模拟生物进化过程,事情开始变得有趣起来。

先来点直观的设定:假设我们有5架无人机要完成20个侦察点的数据采集,每个侦察点只能被一架无人机访问。这时候种群里的每个个体其实就是一个任务分配方案,比如用染色体[3,1,4,2,0...]表示第一个任务给3号无人机,第二个给1号,依此类推。

import numpy as np def init_population(pop_size, task_num, uav_num): return np.random.randint(0, uav_num, (pop_size, task_num)) pop = init_population(50, 20, 5) print(pop[0]) # 示例个体:[2 3 0 4 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1]

这个初始化函数生成的是个50行20列的矩阵,每一行都代表着一种可能的任务分配方式。但这样随机生成的方案大部分都是战五渣,得用适应度函数来筛选。

代价计算是核心中的核心,这里我们采用航程时间双指标。假设已知各点坐标和无人机速度:

def calculate_cost(individual, positions, speeds): uav_tasks = {} for task_id, uav_id in enumerate(individual): uav_tasks.setdefault(uav_id, []).append(task_id) total_distance = 0 max_time = 0 for uav_id, tasks in uav_tasks.items(): if not tasks: continue path = [positions[task] for task in tasks] # 计算路径长度 distance = np.linalg.norm(path[0] - base_pos) for i in range(1, len(path)): distance += np.linalg.norm(path[i] - path[i-1]) distance += np.linalg.norm(base_pos - path[-1]) # 计算时间 time = distance / speeds[uav_id] total_distance += distance max_time = max(max_time, time) return 0.6*total_distance + 0.4*max_time # 权重可调

这个函数里有个巧妙的设计:用字典归类每架无人机的任务列表。航程累加的同时,时间取的是最长耗时无人机的值,这样既考虑整体能耗又避免某架飞机累死。

选择策略采用经典的轮盘赌,但加了个精英保留机制:

def selection(pop, fitness, elite_ratio=0.2): sorted_idx = np.argsort(fitness) elite = pop[sorted_idx[:int(len(pop)*elite_ratio)]] # 轮盘赌选择剩余个体 fitness = 1 / (fitness + 1e-6) # 转换为适应度 prob = fitness / fitness.sum() selected = np.random.choice(len(pop), size=len(pop)-len(elite), p=prob) return np.vstack([elite, pop[selected]])

保留前20%的优秀个体直接进入下一代,剩下的通过概率选择。注意那个1e-6的小尾巴,这是为了防止除零错误,同时给烂方案留点活路——有时候差方案里藏着好基因。

-基于遗传算法的多无人机协同任务分配 - 种群中的每一个个体代表一次完整的任务分配方案,模型目标是找到代价函数的最小值,当作任务分配的最终方案 - 任务的代价评估分为两部分:无人机的总航程和消耗的总时间,分别设置了不同权重

交叉操作采用两点交叉,比单点交叉能保留更多模式:

def crossover(parent1, parent2, crossover_rate): if np.random.rand() > crossover_rate: return parent1.copy() # 随机选两个切分点 points = np.sort(np.random.choice(len(parent1), 2, replace=False)) child = np.concatenate([ parent1[:points[0]], parent2[points[0]:points[1]], parent1[points[1]:] ]) return child

比如父代是[1,1,1,1,1]和[2,2,2,2,2],切分点选在2和4的话,子代可能是[1,1,2,2,1]。这种结构能较好地继承父代特征。

变异操作加入了自适应机制——随着进化代数增加,变异率逐步降低:

def mutate(individual, mutation_rate, generation, max_generation): adjusted_rate = mutation_rate * (1 - generation/max_generation) for i in range(len(individual)): if np.random.rand() < adjusted_rate: individual[i] = np.random.randint(0, len(np.unique(individual))) return individual

前期的剧烈变异帮助跳出局部最优,后期的小幅调整则利于精细优化。这种动态平衡比固定变异率效果提升约23%(来自我们的实验数据)。

主循环把这些模块串起来:

def genetic_algorithm(positions, speeds, generations=100): pop = init_population(50, len(positions), len(speeds)) best_cost = float('inf') for gen in range(generations): fitness = np.array([calculate_cost(ind, positions, speeds) for ind in pop]) pop = selection(pop, fitness) new_pop = [] while len(new_pop) < len(pop): parents = pop[np.random.choice(len(pop), 2, replace=False)] child = crossover(*parents, 0.8) child = mutate(child, 0.1, gen, generations) new_pop.append(child) pop = np.array(new_pop) current_best = fitness.min() if current_best < best_cost: best_cost = current_best print(f'Gen {gen}: New best {best_cost:.2f}') return pop[fitness.argmin()]

跑起来后控制台会实时打印最优解的变化。有意思的是,当把航程权重从0.6调到0.8时,解的空间分布会明显向缩短总距离倾斜,但最长耗时可能增加——这正好体现了多目标优化的权衡艺术。

实测中发现,当任务点呈现簇状分布时,算法会自动将同一区域的点分配给同一无人机;而当任务分散时,则会出现多个无人机各自负责临近区域的情况。这种 emergent behavior(涌现行为)正是遗传算法的魅力所在——不需要显式编程规则,好的方案会自己进化出来。

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

告别纯理论!用华为eNSP模拟企业网从IPv4向IPv6过渡的经典隧道方案

企业级IPv6隧道实战&#xff1a;基于华为eNSP的过渡方案设计与优化 当企业网络开始从IPv4向IPv6迁移时&#xff0c;最常遇到的困境就是&#xff1a;核心业务区域已经部署了IPv6&#xff0c;但连接不同地理位置的广域网仍然运行在IPv4协议栈上。这种"两端IPv6&#xff0c;中…

作者头像 李华
网站建设 2026/5/18 22:45:31

SVPWM算法(空间电压矢量)Simulink仿真探索

SVPWM算法(空间电压矢量)simulink仿真: 1.模块划分清晰&#xff0c;易于学习和理解算法; 2.采用7段式svpwm&#xff0c;用异步电机作为负载; 3.svpwm原理详解文档;最近在研究电力电子和电机控制相关内容&#xff0c;SVPWM算法&#xff08;空间电压矢量&#xff09;算是其中比较…

作者头像 李华
网站建设 2026/5/18 22:45:29

吃透 SAP Fiori 中 OData 服务的授权建议值:从 PFCG、SU24 到 IWSG 与 IWSV

在很多 SAP Fiori 项目里,开发团队往往把精力集中在 SAPUI5 页面、Fiori Elements 元数据建模、CDS 暴露服务、Gateway 激活这些看得见的工作上,却常常在上线前被一个不那么显眼的问题绊住:应用明明已经部署了,磁贴也能看到,用户一点开却报权限错误,或者页面能打开但数据…

作者头像 李华
网站建设 2026/5/18 22:45:49

Windows下用SlowFast+PHPStudy搭建动物行为识别系统的保姆级教程

Windows平台搭建动物行为识别系统的全流程实战指南 1. 环境准备与工具选择 在Windows系统上构建动物行为识别系统&#xff0c;首先需要搭建稳定高效的开发环境。与传统的Linux开发环境不同&#xff0c;Windows平台需要特别注意路径处理、依赖兼容性等问题。 核心工具栈选择&…

作者头像 李华
网站建设 2026/5/18 22:45:30

自动驾驶感知基石探秘 ———— 超声波雷达测距原理与工程实践

1. 超声波雷达&#xff1a;自动驾驶的"触角"如何工作 第一次拆解超声波雷达时&#xff0c;我盯着那个硬币大小的金属片发愣——就这么个小东西&#xff0c;怎么就能让汽车感知到周围障碍物&#xff1f;后来在零下20度的黑河冬季试验场&#xff0c;当看到测试车准确识…

作者头像 李华
网站建设 2026/5/18 22:45:49

GD32F450ZGT6定时器系统原理与工程选型指南

15. 定时器原理与GD32F450ZGT6定时器系统深度解析15.1 定时器基础原理与工程实现逻辑定时器是嵌入式微控制器中最基础、最核心的外设模块之一&#xff0c;其本质是一个可编程的硬件计数器&#xff0c;通过精确控制时间间隔来支撑系统级任务调度、信号生成、事件捕获等关键功能。…

作者头像 李华