📄 mincost_c.m
字号:
function y = mincost_C(FS,FSt,zs,Cgf,Caf,Tpdfs,Tprfs,TdfsM,TrfsM,Qfs,FS1t,ChromF11,ChromF12,ChromzsF1,ChromzsF1_con,ChromF1_con,F1con,Tpdf1s,Tprf1s,Qf1s,FS2t,ChromF21,ChromF22,ChromzsF2,ChromzsF2_con,ChromF2_con,F2con,Tpdf2s,Tprf2s,Qf2s);
% 计算最小开销目标的函数
% 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向量
for i = 1:length(zs)
[A,B] = max(TdfsM(i,:));
Tdfs(:,i) = B;
[C,D] = max(TrfsM(i,:));
Trfs(:,i) = D;
end
Wgf = Tdfs - Tpdfs; % 航班序列的地面延误时间,只可能延后而不可能超前
Waf = Trfs - Tprfs - Wgf; % 航班序列的空中延误时间,只可能延后而不可能超前
for i = 1:length(zs)
if Wgf(i) < 0
Wgf(i) = 0;
end
if Waf(i) < 0
Waf(i) = 0;
end
end
%disp(mean(Wgf));
%disp(mean(Waf));
sum = 0;
for i = 1:length(zs)
if FSt(i) == 2
serial = 1; % 大型机的单位时间成本
else
serial = 0.7; % 中型机的单位时间成本
end
if zs(i) == 0 % 看对应的航班是否取消,这是不取消的情况
rec = serial.*(Cgf.*Wgf(i) + Caf.*Waf(i));
else % 这是取消的情况
rec = Qfs(i);
end
%disp(rec);
sum = sum + rec;
end
%disp(sum);
%Qf1s = 20.*FS1t;
%Qf2s = 20.*FS2t;
Wgf1 = ChromF11 - Tpdf1s;
Waf1 = ChromF12 - Tprf1s - Wgf1;
for i = 1:length(ChromzsF1)
if FS1t(i) == 2
serial = 1;
else
serial = 0.7;
end
if ChromzsF1(i) == 0
first = serial.*(Cgf.*Wgf1(i) + Caf.*Waf1(i));
if ChromzsF1_con(i) == 0 % 后续航班不取消
second = 0;
else
second = Qf1s(i);
end
else
first = Qf1s(i);
if ChromzsF1_con(i) == 0
second = 0;
else
second = Qf1s(i);
end
end
sum = sum + first + second;
end
%disp(sum)
Wgf2 = ChromF21 - Tpdf2s;
Waf2 = ChromF22 - Tprf2s - Wgf2;
for i = 1:length(ChromzsF2)
if FS2t(i) == 2
serial = 1;
else
serial = 0.7;
end
if ChromzsF2(i) == 0 % 前面航班不取消,则后面可能取消也可能不取消
first = serial.*(Cgf.*Wgf2(i) + Caf.*Waf2(i));
if ChromzsF2_con(i) == 0
second = serial.*Cgf.*(ChromF2_con(i) - F2con(i));
else
second = Qf2s(i);
end
else
first = Qf2s(i);
second = Qf2s(i);
end
sum = sum + first + second;
end
y = sum;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -