💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab武动乾坤博客之家💞💞💞💞💞💞💞💞💞💥💥💥💥💥💥💥💥
🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀
🔊博主简介:985研究生,Matlab领域科研开发者;
🚅座右铭:行百里者,半于九十。
🏆代码获取方式:
优快云 Matlab武动乾坤—代码获取方式
更多Matlab优化求解仿真内容点击👇
①Matlab优化求解(进阶版)
⛳️关注优快云 Matlab武动乾坤,更多资源等你来!!
⛄一、遗传算法简介
1 引言
2 遗传算法理论
2.1 遗传算法的生物学基础
2.2 遗传算法的理论基础
2.3 遗传算法的基本概念
2.4 标准的遗传算法
2.5 遗传算法的特点
2.6 遗传算法的改进方向
3 遗传算法流程
4 关键参数说明
⛄二、部分源代码
%Name:Berth Allocation.m
clear
clc
close all
%% 遗传参数
popsize=100; %群体大小
MAXGEN=50; %最大遗传代数
vesselNum=7; %船舶数量
berthNum=2; %泊位数量
chromlength=8; %染色体长度
Pc=0.6; %交叉概率
Pm=0.001; %变异概率
GGAP=0.9; %选择概率
%% 初始化种群
pop=initGroup(popsize,chromlength,vesselNum,berthNum); %随机产生初始群体
%% 输出随机解的泊位调度方案和船舶在港总时间
disp(‘初始种群中的泊位调度方案:’)
OutputPath(pop); %画出路径函数
disp(‘初始随机解的船舶在港总时间:’)
objvalue=calobjvalue(pop,popsize,vesselNum,berthNum);
disp(objvalue(1))
disp(‘-------------------------------------------------------------’)
%% 优化
gen=0;
figure;
hold on;box on %display the boundary of the current axes.
xlim([0,MAXGEN]) %x在坐标轴的范围
title(‘优化过程’)
xlabel(‘迭代次数’)
ylabel(‘船舶在港时间每次迭代的最优解’)
objvalue=calobjvalue(pop,popsize,vesselNum,berthNum); %计算目标函数值
preobjvalue=min(objvalue);
while gen<MAXGEN
%% 计算适应度
objvalue=calobjvalue(pop,popsize,vesselNum,berthNum); %计算目标函数值
line([gen-1,gen],[preobjvalue,min(objvalue)]);pause(0.0001) %line([X1 X2],[Y1 Y2],S); %点A(X1,Y1)和点B(X2 Y2)之间画一条直线,S为其它属性(颜色,线的粗细等)
preobjvalue=min(objvalue);
fitvalue=fitness(objvalue,popsize); %计算适应度函数
%% 选择
newpop=Selection(pop,fitvalue,GGAP);
pop1=newpop; %pop1为选择过后的种群
%% 交叉
[newpop]=Crossover(pop1,Pc);
pop2=newpop; %pop2为交叉后的种群
%% 变异
[newpop]=Mutate(pop2,Pm);
%% 重插入子代
pop=Reins(pop,newpop,objvalue);
gen=gen+1;
end
[minobjvalue,minIndex]=min(objvalue); %[Y,U]=min(A):返回行向量Y和U,Y向量记录A的每列的最小值,U向量记录每列最小值的行号
minpop=pop(minIndex,:);
%% 输出最优解的泊位调度方案和船舶在港总时间
disp(‘最优解的泊位调度方案:’)
OutputPath(minpop);
disp(‘最优解的船舶在港总时间:’)
disp(min(objvalue));
disp(‘-------------------------------------------------------------’)
%Name:calobjvalue.m
%% 计算目标函数值
%输入变量:
%pop:初始种群
%popsize:种群大小(规模)
%vesselNum:船舶数量
%berthNum:泊位数量
%输出变量:
function objvalue=calobjvalue(pop,popsize,vesselNum,berthNum)
objvalue=zeros(popsize,1);
for k=1:popsize
chromsome=pop(k,:); %染色体
shipInfo=zeros(vesselNum+berthNum-1,5); %把染色体中各条船的编号存入shipInfo矩阵第一列中
i=1;
while i<=length (chromsome)
shipInfo(i,1)=chromsome(i);
i=i+1;
end
%% 读取船舶到港信息存入matrix矩阵-load ship
%第一列是船舶编号,第二列到港时间,第三列装卸箱时间
ship=[1 0 12
2 4 10
3 6 3
4 9 8
5 11 5
6 18 12
7 19 4];
matrix=ship(1:vesselNum,1:3);
%shipInfo矩阵第一列存放船舶编号(含分隔符0),
%第二列存放该船等待时间,第三列存放该船作业前的泊位空闲时间,
%第四列存放该船离港时间,第五列存放该船在港时间,
i=1;
j=1;
berthNo=1;
while i<=length(chromsome)
%按调度顺序计算泊位上第一条船的相关信息,先取船号,如果遇到分隔符0,则直接看下一个符号,同时前一条船的相关信息清零
vesselNo=shipInfo(i,1);
if vesselNo==0
j=0;
berthNo=berthNo+1;
else
%船舶号实际存在时才执行查找及后续操作,从matrix中查找vesselNo,以便提取出该船到港时间,装卸作业时间
m=find(matrix(:,1)vesselNo);
arrivetime=matrix(m,2); %船舶到港时间
loadtime=matrix(m,3); %船舶装卸箱作业时间
%计算该船的等待时间,作业前泊位空闲时间,离港时间,在港时间
if j1
shipInfo(i,2)=0; %等待时间(作业前等待的时间)
shipInfo(i,3)=arrivetime-0; %作业前泊位空闲时间
shipInfo(i,4)=arrivetime+loadtime; %离港时刻
shipInfo(i,5)=loadtime; %在港时间
else
if arrivetime<shipInfo(i-1,4)
%该船到港时刻>前一条船的离港时刻
shipInfo(i,2)=0;
shipInfo(i,3)=arrivetime-shipInfo(i-1,4);
shipInfo(i,4)=arrivetime+loadtime;
shipInfo(i,5) =loadtime;
end
end
end
i=i+1;
j=j+1;
end
end
%Name:Crossover.m
%% 交叉操作(两点交叉)
% 输入
%pop1 被选择的个体
%Pc 交叉概率
%输出:
% newpop 交叉后的个体
function [newpop]=Crossover(pop1,Pc)
Npop1=size(pop1,1);
newpop=pop1;
for i=1:2:Npop1- mod(Npop1,2)
if Pc>=rand %交叉概率Pc
[newpop(i,:),newpop(i+1,:)]=intercross(pop1(i,:),pop1(i+1,:));
end
end
%% 交叉算法采用部分匹配交叉
%输入:
%a和b为两个待交叉的个体
%输出:
%a和b为交叉后得到的两个个体
function [a,b]=intercross(a,b)
L=length(a);
r1=randsrc(1,1,[1:L]); %Generate random matrix using prescribed alphabet.
r2=randsrc(1,1,[1:L]);%OUT = RANDSRC(M,N,ALPHABET) generates an M-by-N random matrix, using the alphabet specified in ALPHABET.
if r1~=r2
a0=a;b0=b;
s=min([r1,r2]);
e=max([r1,r2]);
for i=s:e
a1=a;b1=b;
a(i)=b0(i);
b(i)=a0(i);
x=find(aa(i));
y=find(bb(i));
i1=x(x~=i);
i2=y(y~=i);
if ~isempty(i1)
a(i1)=a1(i);
end
if ~isempty(i2)
b(i2)=b1(i);
end
end
end
%% sus(随机通用采样(Stochastic Universal Sampling))
% 输入:
%fitvalue 个体的适应度值
%NSel 被选择个体的数目
% 输出:
%NewChrIx 被选择个体的索引号
function NewChrIx = Sus(fitvalue,NSel) %NewChr 被选择的个体 Ix(Index)索引号
[Nind,ans] = size(fitvalue);
cumfit = cumsum(fitvalue); %cumsum函数:Cumulative sum of elements.cumsum(A,1)按列/cumsum(A,2)按行
trials = cumfit(Nind) / NSel * (rand + (0:NSel-1)‘); %trials 试用
Mf = cumfit(:, ones(1, NSel));
Mt = trials(:, ones(1, Nind))’;
[NewChrIx, ans] = find(Mt < Mf & [ zeros(1, NSel); Mf(1:Nind-1, 😃 ] <= Mt);
[ans, shuf] = sort(rand(NSel, 1));
NewChrIx = NewChrIx(shuf);
%% RWS即轮盘赌(Roulette Wheel Selection)的选择方法,而SUS是随机通用采样.RWS的选择偏差往往比较大,而SUS可以在统计上避免选择偏差的存在。
⛄三、运行结果
⛄四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.
3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除
🍅 仿真咨询
1 各类智能优化算法改进及应用
生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化
2 机器学习和深度学习方面
卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断
3 图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知
4 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化
5 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配
6 无线传感器定位及布局方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化
7 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化
8 电力系统方面
微电网优化、无功优化、配电网重构、储能配置
9 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长
10 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合