003 matlab 无人舰艇路径优化,遗传算法和粒子群算法

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]);

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看那片云

嘿嘿嘿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值