一、模拟退火策略优化免疫算法简介

指导性搜索方法具有较强的通用性,无须利用问题的特殊信息,这也造成了对问题已知信息的浪费。尽管启发式算法对问题的依赖性强,但对特殊问题却能利用问题信息较快地构造解,其时间性能较为理想。所以,合理结合两者优点来构造新算法,对于实时性能和优化性能同样重要的柔性调度,具有很强的吸引力。笔者采取免疫算法和模拟退火算法混合的思想,互相取长补短,提出免疫模拟退火算法(immune simulated annealing algorithm,ISAA),将它用于FJSS问题的综合策略求解。尽管也有其他文献将免疫算法和模拟退火算法进行了混合,但是笔者构造的ISAA是针对FJSS问题提出的,不论构造思想还是算法流程都具有自身的独特性。ISAA流程结构如图1所示。

【优化分配】基于matlab模拟退火策略优化免疫算法求解无人机协同优化分配问题【含Matlab源码 1978期】_python

二、部分源代码

clear;clc;
%% 读取数据
X=xlsread('UAV.xlsx');
plane=struct('pos',0,'p',0,'num',0,'v',0);
plane.pos=X(:,1:2); %飞机的起始位置
plane.p=X(:,3); %飞机的打击成功率
plane.num=X(:,4); %飞机的最大任务数
plane.v=X(:,5); %飞机的飞行速率

X=xlsread('Target.xlsx');
target=struct('pos',0,'val',0,'win',0,'t',0,'num',0);
target.pos=X(:,1:2); %任务点的位置
target.val=X(:,3); %任务的价值
target.win=X(:,4:5); %任务的时间窗口
target.t=X(:,6); %任务的用时
target.num=X(:,7); %需要无人机的数量

%% 参数设定
maxgen=1000; %最大迭代次数
sizepop=100; %种群规模
sizemem=20; %记忆库容量
Bias=300; %偏置项,让适应度函数为正
%初始化抗体
antibody_len=sum(target.num(:));
antibody=zeros(sizepop,antibody_len);

for i=1:sizepop
antibody(i,:)=rand(1,antibody_len)*size(plane.num,1)+1;
end
affinity=zeros(1,sizepop);
%注意:此处应该为亲和度,不是适应度 免疫算法的适应度还要考虑抗体浓度

for i=1:sizepop
[cost,~]=Cost(plane,target,antibody(i,:));
affinity(i)=1/(cost+Bias);
end
axis([0,62,0,5.5]);%x轴 y轴的范围
set(gca,'xtick',0:2:62) ;%x轴的增长幅度
set(gca,'ytick',0:1:5.5) ;%y轴的增长幅度
xlabel('时间'),ylabel('无人机序号');%x轴 y轴的名称
title('无人机协同的最佳任务分配');%图形的标题
n_bay_nb=5;%无人机数目
n_task_nb = 27;%任务数目
%x轴 对应于画图位置的起始坐标x
n_start_time= [5.38 14.15 18.48 26.19 33.21 18.48 26.19 33.21 38.97 46.77 53.03 59.56 1.8 7.76 15.51 19.51 22.19 8.7 12.4 17.25 19.66 5 8.7 17.25 19.66 22.77 46.77];%每个任务的开始时间
%length 对应于每个图形在x轴方向的长度
n_duration_time =[1 1 2 2 2 2 2 2 2 2 1 1 1 2 2 1 1 2 2 1 1 1 2 1 1 2 2];%duration time of every task //每个工序的持续时间
%y轴 对应于画图位置的起始坐标y
n_bay_start=[1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 4 4 4 4 5 5 5 5 5 5]-1; %bay id of every task ==工序数目,即在哪一行画线
%工序号,可以根据工序号选择使用哪一种颜色
n_job_id=[7 11 12 14 2 12 14 2 10 16 13 17 1 20 18 15 9 8 4 5 19 3 8 5 19 6 16];%
rec=[0,0,0,0];%temp data space for every rectangle
color_list=[[1,0,0];[0,1,0];[0,0,1];[0.95,0.64,0.37];[1,1,0];[0.1333,0.7451,0.5333];[0.60,0.8,0.2];[0.8,0.36,0.36];[0.74,0.71,0.42];[0.52,0.81,0.98];[0.41,0.35,0.8];[0.4667,0.5333,0.6];[0.98,0.92,0.84];[0.94118,1,0.94118];[0.86,0.86,0.86];[0.5,1,0.83];[0.823,0.411,0.117];[0.63,0.13,0.94];[0.87,0.63,0.87];[0,1,1];[1,0.38,0];[0.4,0.1,0.9];[0,0.9,0.2]];
for i =1:n_task_nb
rec(1) = n_start_time(i);%矩形的横坐标
rec(2) = n_bay_start(i)+0.7; %矩形的纵坐标
rec(3) = n_duration_time(i); %矩形的x轴方向的长度
rec(4) = 0.6;
txt=sprintf('p(%d,%d)=%d',n_bay_start(i),n_job_id(i),n_duration_time(i));%将机器号,工序号,加工时间连城字符串
rectangle('Position',rec,'LineWidth',0.5,'LineStyle','-','FaceColor',color_list(n_job_id(i),:));%draw every rectangle
if n_duration_time(i)==1 && n_job_id(i)>=10
text(n_start_time(i)+0.12,(n_bay_start(i)+1),num2str(n_job_id(i)),'FontWeight','Bold','FontSize',10);%label the id of every task ,字体的坐标和其它特性
end
if n_duration_time(i)==1 && n_job_id(i)<10
text(n_start_time(i)+0.3,(n_bay_start(i)+1),num2str(n_job_id(i)),'FontWeight','Bold','FontSize',10);%label the id of every task ,字体的坐标和其它特性
end
if n_duration_time(i)==2 && n_job_id(i)>=10
text(n_start_time(i)+0.6,(n_bay_start(i)+1),num2str(n_job_id(i)),'FontWeight','Bold','FontSize',10);%label the id of every task ,字体的坐标和其它特性
end
if n_duration_time(i)==2 && n_job_id(i)<10
text(n_start_time(i)+0.8,(n_bay_start(i)+1),num2str(n_job_id(i)),'FontWeight','Bold','FontSize',10);%label the id of every task ,字体的坐标和其它特性
end
end

三、运行结果

【优化分配】基于matlab模拟退火策略优化免疫算法求解无人机协同优化分配问题【含Matlab源码 1978期】_模拟退火算法_02


【优化分配】基于matlab模拟退火策略优化免疫算法求解无人机协同优化分配问题【含Matlab源码 1978期】_算法_03

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 余建军,徐学军.基于免疫和模拟退火原理的柔性Job-Shop调度研究[J].计算机应用研究. 2010,27(11)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除