matlab 无人舰艇路径优化,遗传算法和粒子群算法
用于优化的地图可以自行更换,通过将有颜色的图片转为黑白图片即可实现,例如:
function [model] = initModelOfRoute(dataSetName)
dataSetPath = '..\TestData\'; % 测试数据集所在路径
Map = imread([dataSetPath dataSetName]); % 载入数据
mapOfKey = 1 - im2bw(Map, 0.9);
model.mapOfKey = mapOfKey;
model.lengthOfMap = size(mapOfKey, 1);
model.widthOfMap = size(mapOfKey, 2);
model.pointOfStart = [1, 1]; % 起点
model.pointOfEnd = [model.lengthOfMap, model.widthOfMap]; % 终点
model.numOfDecVariables = sum(model.pointOfEnd) - sum(model.pointOfStart);
本资源采用了改进的遗传算法,进行,具体改进如下:
与传统的交叉和变异的遗传方式不同,这里提出一种改进遗传操作。具体步骤是设定一个变异概率p ,如图1所示,先在染色体中随机选择一个点G1,如G1=34。产生一个随机小数,若小于p,则第二个点G2来自同一个个体的另外一个任意点,如G2=52,然后点G1和G2之间的部分被倒置;若随机小数大于p,则从种群中任意再选择一个个体,找出G1=34在该个体中,上一个位置的点,如下一个点G3=3,则回到原来的个体,点34到3之间被倒置。这种遗传的思路在于,它能尽量利用种群中获得的信息,来指引个体的变异或者导致操作,最后使得遗传算子比较高效。
结果如下:
![](https://img-blog.csdnimg.cn/ff857bc40c4f4472ba666a0a437bd4f6.png
算法主函数如下:
% -------------------------------------------------------------------------
% 遗传算法(GA)求解
% -------------------------------------------------------------------------
%% 清空
clear; % 清除所有变量
close all; % 清图
clc; % 清屏
%% 参数配置
addpath(genpath('.\')); % 将当前文件夹下的所有文件夹都包括进调用函数的目录
% rand('state', 0);
populationSize = 30; % 种群规模
maxGeneration = 10000; % 最大进化代数
crossoverRate = 0.6; % 交叉概率
mutationRate = 0.01; % 变异概率
dataSetName = 'Map2.png'; % 数据集
[model] = initModelOfRoute(dataSetName); % 问题定义
%% 初始化
population = initialPopulation(populationSize, model); % 初始化种群
popFitness = getFitness(population, model); % 计算种群适应度
numOfDecVariables = size(population, 2); % 决策变量维度
bestIndividualSet = zeros(maxGeneration, numOfDecVariables); % 每代最优个体集合
bestFitnessSet = zeros(maxGeneration, 1); % 每代最高适应度集合
avgFitnessSet = zeros(maxGeneration, 1); % 每代平均适应度集合
%% 进化
for i = 1 : maxGeneration
newPopulation = selectionOperationOfTournament(population, popFitness); % 选择操作
newPopulation = crossoverOperation(newPopulation, crossoverRate); % 交叉操作
newPopulation = mutationOperationOfTsp(newPopulation, mutationRate); % 变异操作
newPopFitness = getFitness(newPopulation, model); % 子代种群适应度
[population, popFitness] = eliteStrategy(population, popFitness, newPopulation, newPopFitness, 2); % 精英策略
[bestIndividual, bestFitness, avgFitness] = getBestIndividualAndFitness(population, popFitness);
bestIndividualSet(i, :) = bestIndividual; % 第i代最优个体
bestFitnessSet(i) = bestFitness; % 第i代最高适应度
avgFitnessSet(i) = avgFitness; % 第i代种群平均适应度
fprintf('第%i代种群的最优值:%.3f\n', i, -bestFitness);
if mod(i, 5) == 0 % 每隔100代绘制一幅图,因为绘图代价较大
subplot(1,2,1);
showIndividual(bestIndividual, model); % 路线可视化
subplot(1,2,2);
showEvolCurve(10, i, bestFitnessSet, avgFitnessSet); % 显示进化曲线
% semilogy(bestFitnessSet,'Color','b');
end
end
%% 出图
pngName = sprintf('%s_%s_N%d_Gen%d.png', 'Ga', dataSetName, populationSize, maxGeneration);
dataSetPath = '..\Result\';
saveas(gcf, [dataSetPath pngName]);