欢迎来到本博客❤️❤️
博主优势:博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
本文目录如下:
目录
⛳️赠与读者
1 概述
多目标免疫遗传算法在海上救援选址中的应用研究
一、引言
二、海上救援选址问题分析
(一)问题描述
(二)影响因素
(三)多目标特性
三、多目标免疫遗传算法原理
(一)遗传算法基础
(二)免疫遗传算法
(三)多目标免疫遗传算法
(四)NSGA - II算法
四、基于MATLAB的算法实现
(一)MATLAB简介
(二)实现步骤
五、实验结果与分析
(一)实验设置
(二)实验结果
(三)结果分析
六、结论与展望
(一)研究结论
(二)研究不足
(三)未来展望
2 运行结果
3 参考文献
4 Matlab代码实现
做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能解答你胸中升起的一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......
摘要:本研究聚焦于海上救援选址这一实际问题,提出运用多目标免疫遗传算法来进行较简化情况下的选址计算。海上救援选址需综合考虑多方面因素,属于复杂的多目标优化问题。多目标免疫遗传算法结合了免疫系统原理与遗传算法技术,能够有效应对此类问题。通过在MATLAB环境下实现该算法,为海上救援选址提供了优化方案,有助于提高救援效率和降低成本。
海上救援工作对于保障海上人员生命安全和财产至关重要。然而,在广阔的海域中确定合适的救援站点位置是一个极具挑战性的问题。合理的救援选址需要在多个目标之间进行平衡,如最小化救援时间、降低成本以及最大化覆盖范围等。传统方法在处理此类多目标、复杂的选址问题时存在一定局限性,因此,需要一种有效的优化算法来解决海上救援选址问题。多目标免疫遗传算法作为一种融合了生物免疫系统和遗传算法优势的算法,为解决该问题提供了新的思路。
海上救援选址问题旨在从广阔的海域中挑选出最佳的救援站点位置,以便在紧急情况发生时能够迅速响应并提供救援服务。由于海上事故发生地点具有不确定性,且救援资源有限,因此需要综合考虑多种因素来确定最优的选址方案。
海上救援选址问题是典型的多目标优化问题,上述各个目标之间往往存在冲突。例如,为了缩短救援时间可能需要在靠近事故高发区建设救援站点,但这可能会增加建设成本;而追求更大的覆盖范围可能会导致救援时间延长或成本上升。因此,无法同时实现所有目标的最优,需要找到一个在多个目标之间取得平衡的解决方案。
遗传算法(Genetic Algorithm,GA)是一种基于自然选择和遗传变异的启发式搜索算法 。它通过对一组个体(种群)进行迭代操作,模拟生物进化过程,逐步找到问题的最优解。遗传算法主要操作包括选择、交叉和变异 :
免疫遗传算法(Immune Genetic Algorithm,IGA)是遗传算法的变体,它将生物免疫系统的原理引入遗传算法中 。生物免疫系统具有识别、记忆和自我调节等功能,IGA通过模仿这些功能来增强算法的性能:
多目标免疫遗传算法(Multi - Objective Immune Genetic Algorithm,MOIGA)用于解决多目标优化问题 。在多目标优化中,由于存在多个目标函数,且这些目标之间可能相互冲突,因此不存在唯一的最优解,而是存在一组最优解,称为帕累托最优解集(Pareto optimal set)。MOIGA通过免疫机制和遗传操作,在多个目标之间进行权衡,逐步搜索帕累托最优解集:
本研究中使用的多目标免疫遗传算法具体实现采用了NSGA - II(Non - dominated Sorting Genetic Algorithm II)算法 。NSGA - II是一种广泛应用的多目标优化算法,它在解决多目标问题中的非支配排序和拥挤度比较方面具有良好的性能,能够产生一组均匀分布的最优解集合。其主要步骤如下:
MATLAB是MathWorks公司推出的一套高性能数值计算和可视化软件 。它集成了数值分析、矩阵计算、信号处理和图形显示等多种功能,拥有丰富的函数库和工具箱,为算法开发和工程应用提供了便利的平台。在本研究中,利用MATLAB的编程环境和相关工具箱来实现多目标免疫遗传算法的计算过程。
land_cost.mat
文件中,将事故发生位置相关数据存储在riskPosition.mat
文件中 。popinit.m
文件来实现种群初始化的功能 。fitness.m
文件来计算个体的适应度 。multiSorting.m
文件来实现非支配排序功能 。Mutation.m
文件来实现变异操作 。本研究将多目标免疫遗传算法应用于较简化的海上救援选址问题,通过在MATLAB环境下实现该算法,得到了一组在多个目标之间取得平衡的最优选址方案。实验结果表明,多目标免疫遗传算法在解决海上救援选址这类多目标优化问题上具有良好的性能,能够有效地提高救援效率、降低成本并扩大覆盖范围。与其他传统优化算法相比,该算法在收敛性、多样性和多目标平衡能力等方面具有明显优势。
综上所述,多目标免疫遗传算法在海上救援选址问题上具有广阔的应用前景,通过不断的研究和改进,有望为海上救援工作提供更加科学、合理的选址方案,提高海上救援的能力和水平。
部分代码:
%% 画出免疫算法收敛曲线
% 记录当代最佳个体和种群平均适应度
% 找出ranks为1的个体的索引
index1 = find(individuals.ranks == 1);
best_chrom = individuals.chrom(index1(1),:); % 找出最优个体
best_finess = individuals.fitness(index1(1),:);
average = mean(individuals.fitness); % 计算平均适应度
trace = [trace; best_finess, average]; % 记录
% 提取四个不同的目标函数值
objective1 = trace(:, [1, 4]); % 第一个目标函数
objective2 = 1./trace(:, [2, 5]); % 第二个目标函数
objective3 = trace(:, [3, 6]); % 第二个目标函数
% 创建迭代次数向量
iterations = 1:size(trace, 1);
% 第一个目标
subplot(1, 3, 1);
plot(iterations, objective1(:, 1), 'b', 'LineWidth', 0.7);
hold on;
plot(iterations, objective1(:, 2), 'r', 'LineWidth', 0.7);
xlabel('迭代次数');
ylabel('万元');
title('总成本');
% 第二个目标
subplot(1, 3, 2);
plot(iterations, objective2(:, 1), 'b', 'LineWidth', 0.7);
hold on;
plot(iterations, objective2(:, 2), 'r', 'LineWidth', 0.7);
xlabel('迭代次数');
ylabel('概率');
title('可靠性');
% 第三个目标
subplot(1, 3, 3);
plot(iterations, objective3(:, 1), 'b', 'LineWidth', 0.7);
hold on;
plot(iterations, objective3(:, 2), 'r', 'LineWidth', 0.7);
xlabel('迭代次数');
ylabel('小时');
title('救援总用时');
disp(['当前进化次数:',num2str(GEN)])
pause(0.0001);
end
combined_vector = [];
for i = 1:numel(fronts)
combined_vector = [combined_vector fronts{i}];
end
pareto_index = combined_vector(1:6);
pareto_fronts = individuals.chrom(pareto_index, :);
figure;
pareto = individuals.fitness;
scatter3(pareto(:,1), 1./pareto(:,2), pareto(:,3), 'o', 'filled');
xlabel('成本');
ylabel('可靠性');
zlabel('救援总用时');
title('帕累托前沿');
grid on;
% 加载仿真数据
islandPosition = load("islandPosition.mat").islandPosition; % 岛屿坐标
riskPosition = load("riskPosition.mat").riskPosition; % 风险点坐标
V = load("oilSpill.mat").oilSpill'; % 溢油量情况
c_l = load("constructionCost.mat").constructionCost; % 地形建设成本
figure;
num_solutions = size(pareto_fronts, 1);
for solution_idx = 1:num_solutions
% 提取当前方案
current_solution = pareto_fronts(solution_idx, :);
points = islandPosition(current_solution, :);
%找出最近集结点
num_points = nGenes;
distance_mat = zeros(size(riskPosition, 1), size(points, 1));
for i = 1:size(points, 1)
for j = 1:size(riskPosition, 1)
distance = norm(points(i, :) - riskPosition(j, :));
distance_mat(j, i) = distance;
end
end
[~,b1]=min(distance_mat');
temp_distance_mat = distance_mat;
for i = 1:size(riskPosition, 1)
temp_distance_mat(i,b1(i)) = inf;
end
[~,b2]=min(temp_distance_mat');
index1=cell(1,nGenes);
index2=cell(1,nGenes);
for i=1:nGenes
%计算各个集结点的目标
index1{i}=find(b1==i);
index2{i}=find(b2==i);
end
subplot(2, 3, solution_idx);
title(['方案 ' num2str(solution_idx)]); % 标题
cargox = islandPosition(current_solution, 1);
cargoy = islandPosition(current_solution, 2);
plot(islandPosition(:, 1), islandPosition(:, 2), 'o', 'LineWidth', 1, ...
'MarkerEdgeColor', 'y', ...
'MarkerFaceColor', 'y', ...
'MarkerSize', 5);
hold on;
plot(cargox, cargoy, 's', 'LineWidth', 1, ...
'MarkerEdgeColor', 'b', ...
'MarkerFaceColor', 'b', ...
'MarkerSize', 9);
% 绘制事故风险点
for i = 1:size(riskPosition, 1)
scatter(riskPosition(i, 1), riskPosition(i, 2), [], V(i), 'filled', 'MarkerEdgeColor', 'k');
end
% 设置图例和标签
colorbar;
colormap('jet');
for i = 1:size(riskPosition, 1)
x1 = [riskPosition(i, 1), islandPosition(current_solution(b1(i)), 1)];
y1 = [riskPosition(i, 2), islandPosition(current_solution(b1(i)), 2)];
plot(x1, y1, 'c', 'LineWidth', 1);
if plot_flag == 1
x2 = [riskPosition(i, 1), islandPosition(current_solution(b2(i)), 1)];
y2 = [riskPosition(i, 2), islandPosition(current_solution(b2(i)), 2)];
plot(x2, y2, 'g', 'LineWidth', 1);
end
text(riskPosition(i, 1), riskPosition(i, 2) + 5, num2str(i), 'HorizontalAlignment', 'center', 'VerticalAlignment', 'bottom');
hold on;
end
for i = 1:nGenes
text(islandPosition(current_solution(i), 1), islandPosition(current_solution(i), 2) - 30, num2str(i), ...
'HorizontalAlignment', 'center', 'VerticalAlignment', 'bottom', 'Color', 'r');
end
end
pareto_fitness = individuals.fitness(pareto_index, :);
disp('帕累托前沿:');
for i = 1:length(pareto_fitness)
disp(['方案',num2str(i)]);
disp(['成本:', num2str(pareto_fitness(i,1)),'万元']);
disp(['可靠性:', num2str(100/pareto_fitness(i,2)),'%']);
disp(['总救援时长:', num2str(pareto_fitness(i,3)),'小时']);
end
% 最优解
best_solution = pareto_fronts(1, :);
points = islandPosition(best_solution, :);
%找出最近集结点
num_points = nGenes;
distance_mat = zeros(size(riskPosition, 1), size(points, 1));
for i = 1:size(points, 1)
for j = 1:size(riskPosition, 1)
distance = norm(points(i, :) - riskPosition(j, :));
distance_mat(j, i) = distance;
end
end
[a1,b1]=min(distance_mat');
temp_distance_mat = distance_mat;
for i = 1:size(riskPosition, 1)
temp_distance_mat(i,b1(i)) = inf;
end
[a2,b2]=min(temp_distance_mat');
index1=cell(1,nGenes);
index2=cell(1,nGenes);
for i=1:nGenes
%计算各个集结点的目标
index1{i}=find(b1==i);
index2{i}=find(b2==i);
end
figure;
title('最优方案'); % 标题
cargox = islandPosition(best_solution, 1);
cargoy = islandPosition(best_solution, 2);
plot(islandPosition(:, 1), islandPosition(:, 2), 'o', 'LineWidth', 1, ...
'MarkerEdgeColor', 'y', ...
'MarkerFaceColor', 'y', ...
'MarkerSize', 5);
hold on;
plot(cargox, cargoy, 's', 'LineWidth', 1, ...
'MarkerEdgeColor', 'b', ...
'MarkerFaceColor', 'b', ...
'MarkerSize', 9);
% 绘制事故风险点
for i = 1:size(riskPosition, 1)
scatter(riskPosition(i, 1), riskPosition(i, 2), [], V(i), 'filled', 'MarkerEdgeColor', 'k');
end
% 设置图例和标签
colorbar;
colormap('jet');
for i = 1:size(riskPosition, 1)
x1 = [riskPosition(i, 1), islandPosition(best_solution(b1(i)), 1)];
y1 = [riskPosition(i, 2), islandPosition(best_solution(b1(i)), 2)];
plot(x1, y1, 'c', 'LineWidth', 1);
if plot_flag == 1
x2 = [riskPosition(i, 1), islandPosition(best_solution(b2(i)), 1)];
y2 = [riskPosition(i, 2), islandPosition(best_solution(b2(i)), 2)];
plot(x2, y2, 'g', 'LineWidth', 1);
end
text(riskPosition(i, 1), riskPosition(i, 2) + 5, num2str(i), 'HorizontalAlignment', 'center', 'VerticalAlignment', 'bottom');
hold on;
end
for i = 1:nGenes
text(islandPosition(best_solution(i), 1), islandPosition(best_solution(i), 2) - 50, num2str(i), ...
'HorizontalAlignment', 'center', 'VerticalAlignment', 'bottom', 'Color', 'r');
end
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。(文章内容仅供参考,具体效果以运行结果为准)
[1]胡宇博.基于多目标免疫进化算法的动态车辆路径优化研究[D].郑州大学[2025-02-06].
[2]刘金华.多目标遗传算法在企业能源规划中的应用研究[D].广东工业大学,2013.
[3]叶碎高,温进化,王士武.多目标免疫遗传算法在梯级水库优化调度中的应用研究[J].南水北调与水利科技, 2011, 9(1):4.
资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取