📄 coga2_c.m
字号:
% FS--计划航班编号序列,大小1*F(函数中没有出现,可以不用),FSt--计划航班类型序列,大小1*F(2表示大型机,1表示中型机,没有小型机);
% Fdashs--连续飞行的航班序列(为F的一个子集,表示为一个2进制串(大小1*F'),第i个位置为1表示连续航班序列包括第i个航班); --本函数没有用到
% FSu--计划航班序列的各个起飞机场,;FSd--计划航班序列的各个降落机场; --本函数没有用到,二者大小都是1*F;
% zs--各个航班是否取消的向量,为一个二进制串,大小1*F,第i个位置为1表示第i个航班取消,为0表示第i个航班不取消(这是一个决策向量);
% Cgf--地面延误的单位时间成本(对大型机); Caf--空中延误的单位时间成本(对大型机),这两个都是单一数字
% Tpdfs/Tprfs--这是计划航班序列的计划起飞和降落的时间段(都是1*F向量);
% Mgfs/Mafs--计划航班序列的依次最大地面/空中的等待时间数(都是1*F向量);--本函数没有用到
% TdfsM/TrfsM--计划航班序列的实际起飞/降落时间(为两个矩阵,大小都为F行T列,每一行代表一个航班的起(降)情况,且每行只有一个1,代表航班在该时刻位置起(降));
% Qfs--计划航班序列的取消成本,为1*F向量
% Only zs plays the role of j_v in this function
% F -- Num of total flights
% T -- Num of total time periods
% LagY & r -- Lagrangian Multiplexer
%%%%%%%%%%%%%%%%%%%%%%% Generating Test Data
FS = [];
T = 40;
% 只考虑单一机场的容量
FSu = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2;];
FSd = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1;];
F = length(FSu);
% 不连续航班的起降机场表,FSu表示起飞机场序列,FSu中的1表示考虑容量限制的机场,其他不考虑者一律用2表示;
% FSd表示降落的机场序列,和上面类似;
FSt = [2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1;];
% 飞机的类型序列,1表示中型飞机,2表示大型飞机
% Generate zs according to TdfsM & TrfsM
Cgf = 7;
Caf = 10;
Tpdfs = [13,13,13,14,14,15,15,15,16,16,16,16,16,16,16,17,17,17,18,18,18,19,19,19,19,19,20,20,20,20,20,20,20,8,3,3,8,8,7,7,6,1,5,3,10,5,9,1,10,9,3,5,11,9,6,13,13,11,11,12,12,8,6,13,13,12,2,7,16,13,12;];
Tprfs = [20,20,23,26,22,21,23,27,24,31,31,27,27,24,25,21,28,29,25,29,23,25,33,31,25,33,24,27,36,25,32,32,27,13,13,13,13,13,13,13,14,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,17,18,18,19,19,19,20,20,20,20,20,20,20,20,20;];
% 以上是不连续航班的标准起降时间表
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FS1u = [ones(1,10),2*ones(1,4)]; % 连续航班集合1(前面取消不会影响后面的航班序列)
FS1d = 3 - FS1u;
FS1t = [1,2,1,1,1,2,1,2,1,1,1,2,1,2]; % 航班类型序列
Tpdf1s = [14,15,16,16,17,17,18,19,20,20,3,3,7,12]; % F1序列的标准起降时间表
Tprf1s = [22,27,26,23,25,29,28,29,24,25,13,14,16,20];
F1con = [24,29,28,25,23,31,30,31,26,27,15,16,18,22];% F1后续航班起飞的标准时间表
F1 = length(FS1u);
StdTime1 = Tprf1s - Tpdf1s;
Mgf1s = 4.*ones(1,F1); % 地面最多等待4个时间段
Maf1s = Mgf1s./2; % 空中最多等待2个时间段
%Qf1s = FS1t.*20;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FS2u = [ones(1,11),2*ones(1,10)]; % 连续航班集合2(前面取消会影响后面的航班序列)
FS2d = 3 - FS2u;
FS2t = [2,1,1,1,2,2,1,1,2,1,1,2,2,1,1,2,2,1,2,2,1];
Tpdf2s = [13,13,15,15,16,17,17,17,19,19,20,5,3,3,5,6,9,11,5,7,16]; % F2序列的标准起降时间表
Tprf2s = [21,21,23,27,30,25,24,29,33,32,25,13,14,14,15,16,16,17,18,18,20];
F2con = [23,23,25,29,32,27,27,31,35,34,29,15,16,16,17,18,18,19,20,21,22]; % F2后续航班起飞的标准时间表
F2 = length(FS2u);
StdTime2 = Tprf2s - Tpdf2s;
Mgf2s = 4.*ones(1,F2); % 地面最多等待4个时间段
Maf2s = Mgf2s./2; % 空中最多等待2个时间段
%Qf2s = FS2t.*20;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
tfsdash = 1; %松弛时间
%%%%%%%%%%%%%%%%%%%%%%%%%
Mgfs = 4.*ones(1,F); % 地面最多等待4个时间段
Mafs = Mgfs./2; % 空中最多等待2个时间段
StdTime = Tprfs - Tpdfs; % 标准飞行时间,实际飞行时间不能比这个短
Qfs = FSt.*20; % 取消费用,大概相当于单位时间损失的2倍
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 生成并修补非连续航班的染色体
NIND1=100;
Chrom11 = crtbp(NIND1,T.*ones(1,F));
for ii = 1:NIND1
for jj = 1:F
if Chrom11(ii,jj) <= Tpdfs(jj)
Chrom11(ii,jj) = Tpdfs(jj);
end
end
end % Repair chrom so that all the requirments are satisfied
Chrom12 = ceil(5.*rand(NIND1,F)) + Chrom11;
for ii = 1:NIND1
Chrom12(ii,:) = Chrom12(ii,:) + StdTime;
end
Chrom1 = [Chrom11,Chrom12];
Chromzs = zeros(NIND1,F); % 0 -- 不取消;1 -- 取消;
for ii = 1:NIND1
for jj = 1:F
if (Chrom11(ii,jj) > Tpdfs(jj) + Mgfs(jj))|(Chrom12(ii,jj) - Chrom11(ii,jj) > StdTime(jj) + Mafs(jj))
Chromzs(ii,jj) = 1; % 取消航班的情况(延时过长)
end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 生成并修补连续航班序列F1(前面取消不影响后面)的染色体
ChromF11 = crtbp(NIND1,T.*ones(1,F1));
for ii = 1:NIND1
for jj = 1:F1
if ChromF11(ii,jj) <= Tpdf1s(jj)
ChromF11(ii,jj) = Tpdf1s(jj);
end
end
end
ChromF12 = ceil(5.*rand(NIND1,F1)) + ChromF11;
for ii = 1:NIND1
ChromF12(ii,:) = ChromF12(ii,:) + Tprf1s - Tpdf1s;
end
ChromzsF1 = zeros(NIND1,F1);
for ii = 1:NIND1
for jj = 1:F1
if (ChromF11(ii,jj) > Tpdf1s(jj) + Mgf1s(jj))|(ChromF12(ii,jj) - ChromF11(ii,jj) > Tprf1s(jj) - Tpdf1s(jj) + Maf1s(jj))
ChromzsF1(ii,jj) = 1; % 取消航班的情况(延时过长)
end
end
end
for ii = 1:NIND1
for jj = 1:F1
ChromzsF1_con(ii,jj) = round(rand(1));
ChromF1_con(ii,jj) = F1con(jj);
end
end
ChromF1 = [ChromF11,ChromF12];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 生成并修补连续航班序列F2(前面取消影响后面)的染色体
ChromF21 = crtbp(NIND1,T.*ones(1,F2));
for ii = 1:NIND1
for jj = 1:F2
if ChromF21(ii,jj) <= Tpdf2s(jj)
ChromF21(ii,jj) = Tpdf2s(jj);
end
end
end
ChromF22 = ceil(5.*rand(NIND1,F2)) + ChromF21;
for ii = 1:NIND1
ChromF22(ii,:) = ChromF21(ii,:) + Tprf2s - Tpdf2s;
end
ChromzsF2 = zeros(NIND1,F2);
for ii = 1:NIND1
for jj = 1:F2
if (ChromF21(ii,jj) > Tpdf2s(jj) + Mgf2s(jj))|(ChromF22(ii,jj) - ChromF21(ii,jj) > Tprf2s(jj) - Tpdf2s(jj) + Maf2s(jj))
ChromzsF2(ii,jj) = 1; % 取消航班的情况(延时过长)
end
end
end
for ii = 1:NIND1
for jj = 1:F2
if ChromzsF2(ii,jj) == 1
ChromzsF2_con(ii,jj) = 1;
ChromF2_con(ii,jj) = F2con(jj); % 这里的数值无关紧要
else
temp = ChromF22(ii,jj) - Tprf2s(jj); %%%%%%%%%%%%%%%%%%% WRONG,needs modification %%%%%%%%%%%%%%%%%%%%
if temp > tfsdash + 4
ChromzsF2_con(ii,jj) = 1; %%% 后续航班取消
ChromF2_con(ii,jj) = F2con(jj);
else
ChromzsF2_con(ii,jj) = 0; %%% 后续航班不取消
ChromF2_con(ii,jj) = temp + F2con(jj);
end
end
end
end
ChromF2 = [ChromF21,ChromF22];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
NIND2=20;
PRECI=10;
FieldD2=[rep([PRECI],[1,1]); rep([0;10],[1,1]);rep([1;0;1;1],[1,1])];
Chrom2=crtbp(NIND2,PRECI);
Chrom1u=Chrom1(5,:);
Chrom2u=Chrom2(1,:);
r=1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MAXGEN=150;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:NIND1
% reqmin(i)=T_P2Lag(Chrom1(i,:),bs2rv(Chrom2u,FieldD2),r);
reqmin(i) = Avi_Lag2_C(FS,FSt,Chromzs(i,:),Chrom11(i,:),Chrom12(i,:),Cgf,Caf,Tpdfs,Tprfs,Qfs,Mgfs,Mafs,FSu,FSd,F,T,bs2rv(Chrom2u,FieldD2),r,FS1t,ChromF11(i,:),ChromF12(i,:),ChromzsF1(i,:),ChromzsF1_con(i,:),ChromF1_con(i,:),F1con,Tpdf1s,Tprf1s,F1,FS1u,FS1d,FS2t,ChromF21(i,:),ChromF22(i,:),ChromzsF2(i,:),ChromzsF2_con(i,:),ChromF2_con(i,:),F2con,Tpdf2s,Tprf2s,F2,FS2u,FS2d);
end
[R,S]=size(reqmin);
if R==1
reqmin=reqmin';
end
%disp(reqmin);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%disp('part1 done');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for j=1:NIND2
reqmax(j)=Avi_Lag2_C(FS,FSt,Chromzs(5,:),Chrom11(5,:),Chrom12(5,:),Cgf,Caf,Tpdfs,Tprfs,Qfs,Mgfs,Mafs,FSu,FSd,F,T,bs2rv(Chrom2(j,:),FieldD2),r,FS1t,ChromF11(5,:),ChromF12(5,:),ChromzsF1(5,:),ChromzsF1_con(5,:),ChromF1_con(5,:),F1con,Tpdf1s,Tprf1s,F1,FS1u,FS1d,FS2t,ChromF21(5,:),ChromF22(5,:),ChromzsF2(5,:),ChromzsF2_con(5,:),ChromF2_con(5,:),F2con,Tpdf2s,Tprf2s,F2,FS2u,FS2d);
end
[M,N]=size(reqmax);
if M==1
reqmax=reqmax';
end
%disp(Qfs);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%disp('part2 done');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Field1 = rep([1;T],[1,F]);
FieldF1 = rep([1;T],[1,F1]);
FieldF2 = rep([1;T],[1,F2]);
Field = [Field1,FieldF1,FieldF2];
Chrom = [Chrom1,ChromF1,ChromF2];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% CoGA Starts
for gen=1:MAXGEN
%tic;
for gen1=1:20
% GA begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -