一、研究核心问题
-
多目标优化问题:多机器人海上巡逻任务中,需同时最小化总巡逻路径长度、任务完成时间及高风险船舶的访问优先级。
-
挑战:存在多个帕累托最优解(同一路径的不同巡逻节点导致相同目标值),需抑制冗余解对种群多样性的影响,生成更多有实际意义的巡逻方案。
二、研究方法
-
学习启发免疫算法(LIA):
-
UCB变异:结合上置信界(UCB)平衡探索与利用,优先选择目标值优或出现频率低的基因。
-
演员-评论家启发交叉:通过历史奖励函数评估基因性能,动态选择优势基因。
-
历史信息高效利用:避免存储全部历史种群,仅记录基因奖励表现,节省计算资源。
-
三、主要研究成果
-
收敛性与性能:
-
LIA在减少冗余巡逻(Redundant Patrol)和重叠巡逻(Overlapping Patrol)方面显著优于前代算法NISFA(见图6)。
-
在6艘和10艘船舶场景下,LIA的帕累托解覆盖率(Coverage)和超体积指标(Hypervolume)均优于NNIA、NSGA-II和MOPSO(见图9-11)。
-
-
实际应用验证:生成多组帕累托最优巡逻方案(图7),满足不同决策需求(如最短路径、最快完成时间或高风险优先)。
四、创新之处
-
算法设计:
-
首次将UCB和演员-评论家机制引入免疫算法,解决多目标优化中的探索-利用权衡问题。
-
通过历史奖励函数动态评估基因性能,减少对全局种群的依赖。
-
-
资源效率:
-
仅需记录基因级历史信息,而非完整种群,大幅降低存储与计算开销。
-
五、研究局限
-
可扩展性:船舶数量增加时,编码长度呈指数增长,解空间爆炸导致算法效率下降。
-
应用范围:当前算法适用于中小规模问题,大规模场景需进一步优化(如结合自动编码器压缩解空间)。
-
参数敏感性:算法性能依赖超参数(如折扣因子 dd),需手动调参。
下面代码为简化版:
%% 参数设置
popSize = 50; % 种群大小
numGenes = 20; % 基因长度(示例)
maxGen = 30; % 最大迭代次数
mutationRate = 0.1; % 变异概率
UCB_C = 1; % 探索系数
%% 初始化
population = randi([0,1], popSize, numGenes); % 二进制编码
geneRewards = zeros(2, numGenes); % 记录每个基因位的历史奖励(0和1)
geneCounts = zeros(2, numGenes); % 记录每个基因位的出现次数
%% 多目标优化主循环
for gen = 1:maxGen
% 1. 评估目标函数(示例:假目标)
objectives = [sum(population,2), max(population,[],2)]; % 简化为两目标
% 2. 更新帕累托前沿
[paretoMask] = isParetoFront(objectives);
paretoPop = population(paretoMask,:);
% 3. UCB变异操作
for i = 1:popSize
for j = 1:numGenes
if rand() < mutationRate
% 计算当前基因位的UCB值
ucb0 = geneRewards(1,j) + UCB_C * sqrt(log(gen)/geneCounts(1,j));
ucb1 = geneRewards(2,j) + UCB_C * sqrt(log(gen)/geneCounts(2,j));
population(i,j) = (ucb1 > ucb0);
end
end
end
% 4. 演员-评论家交叉(简化版)
newPop = [];
for i = 1:2:popSize
p1 = population(i,:); p2 = population(i+1,:);
child = zeros(1,numGenes);
for j = 1:numGenes
% 选择历史奖励更高的基因
if geneRewards(1,j) > geneRewards(2,j)
child(j) = p1(j);
else
child(j) = p2(j);
end
end
newPop = [newPop; child];
end
population = newPop;
% 5. 更新基因历史数据(示例:假设奖励为支配计数)
for j = 1:numGenes
for bit = 0:1
mask = (population(:,j) == bit);
geneRewards(bit+1,j) = sum(paretoMask(mask)); % 支配个体数作为奖励
geneCounts(bit+1,j) = geneCounts(bit+1,j) + sum(mask);
end
end
end
%% 辅助函数:帕累托前沿筛选
function [mask] = isParetoFront(objectives)
n = size(objectives,1);
mask = true(n,1);
for i = 1:n
for j = 1:n
if all(objectives(j,:) <= objectives(i,:)) && any(objectives(j,:) < objectives(i,:))
mask(i) = false; break;
end
end
end
end
代码说明
-
核心操作:
-
UCB变异:通过历史奖励和出现次数平衡探索与利用,选择UCB值高的基因。
-
演员-评论家交叉:基于基因位的历史奖励选择优势基因(简化逻辑)。
-
历史更新:以帕累托前沿中的支配个体数作为基因奖励。
-
-
简化点:
-
目标函数简化为两个假目标(总和与最大值),实际需替换为路径规划的具体计算。
-
交叉操作省略了复杂的子种群分析,仅对比基因位的历史奖励。
-
基因编码采用二进制,未实现论文中的具体编码方案(如巡逻节点坐标)。
-
-
运行结果:
-
输出为最终种群中属于帕累托前沿的个体(
paretoPop
)。 -
可通过可视化展示目标空间的帕累托前沿分布:
-