clc;
clear;
close all;
tic
%% 数据录入
Box=[2.33 1.78 2.197 5000]; % 货箱数据
Cargo=[0.94 0.68 0.39 0.249288 270.5 6;0.81 1.02 0.6 0.495720 896 2;...
0.81 1.02 0.70 0.578340 868 4;0.73 0.69 0.80 0.40296 240 2;...
1.20 0.72 0.72 0.622080 280 2;1.10 0.84 0.26 0.24024 80 1;...
0.80 0.74 0.72 0.426240 180 1;1.60 1.07 0.75 1.28400 774 12;...
1.19 1.11 1.08 1.426572 960 11;1.19 1.11 0.9 1.18810 800 10;...
1.40 1.16 1.20 1.948800 420 8;0.82 0.37 0.18 0.54612 40 5]; % 货物数据
save Box Box
save Cargo Cargo
toc
%% 模拟退火参数
tic
T0=1000; % 初始温度
Tend=1e-3; % 终止温度
L=10; % 各温度下的迭代次数(链长)
q=0.8; %降温速率
%% 遗传参数
Pc=0.9; %交叉概率
Pm=0.05; %变异概率
GGAP=0.9; %代沟
%% 加载数据
load Box
load Cargo
%%
N=size(Cargo,1); % 待装箱类别数
%% 初始解
S1=randperm(N); %随机产生一个装箱顺序
[RestSpace,LoadOrder]=IniOrder(S1,Box,Cargo);
fitness=FitFun(RestSpace,LoadOrder);
%% 计算迭代的次数 Time
Time=ceil(double(solve(['1000*(0.8)^x=',num2str(Tend)])));
count=0; %迭代计数
%Obj=zeros(Time,1); %目标值矩阵初始化
%track=zeros(Time,N); %每代的最优路线矩阵初始化
Obj=[]; %目标值矩阵初始化
track=[]; %每代的最优路线矩阵初始化
BestLoad=[];t=1;
%% 迭代
while T0>Tend
count=count+1; %更新迭代次数
% temp=zeros(L,N+1);
% TempLoad={};
if t>1
Fit=temp(:,end);
%% 选择
SelCh=Select(Order,Fit,GGAP);
%% 交叉操作
SelCh=Recombin(SelCh,Pc);
%% 变异
SelCh=Mutate(SelCh,Pm);
%% 重插入子代的新种群
Order=Reins(Order,SelCh,Fit);
end
temp=zeros(L,N+1);
TempLoad={};
for k=1:L
%% 产生新解
if t>1
S1=Order(k,:);
end
Rindex=rand;
flag=0;
% S2=New Answer1(S1);
if Rindex>0.3
S2=NewAnswer1(S1);
else
NewAnswer2(S1);
flag=1;
end
%% Metropolis 法则判断是否接受新解
if flag==1
load Cargo1
[S1,R,Load]=Metropolis1(S1,Box,Cargo,Cargo1,T0); %Metropolis 抽样算法
else
[S1,R,Load]=Metropolis2(S1,S2,Box,Cargo,T0); %Metropolis 抽样算法
end
temp(k,:)=[S1 R]; %记录下一解及其适应度值
TempLoad{k}=Load;
Order(k,:)=S1;
end
%% 记录每次迭代过程的最优解
[d0,index]=max(temp(:,end)); %找出当前温度下最优解
if count==1 || d0>Obj(count-1)
Obj(count)=d0;
BestLoad=TempLoad{index};
else
Obj(count)=Obj(count-1);
end
a=Obj(count);
a
track(count,:)=temp(index,1:end-1); %记录当前温度的最优解
T0=q*T0; %降温
fprintf(1,'%d\n',count) %输出当前迭代次数
t=t+1;
end
%% 优化过程迭代图
save Best Load Best Load
figure
plot(1:length(Obj),Obj)
xlabel('迭代次数')
ylabel('目标han数值')
title('youhua')
评论16