2021数维杯国际赛数学建模-A题思路-新冠疫情

  • Post author:
  • Post category:其他


本思路转载于

@数模孵化园

此大佬日常更新各种建模比赛的思路!!


先看赛题翻译

2020年初,新型冠状病毒疫情(或称COVID-19)在全球迅速蔓延。根据世 界卫生组织2021年7月31日的报告,新型冠状病毒疫情对人类的影响持续时间可 能比原先预计的更长。在这场疫情的影响下,许多国家遭受了不同程度的经济 损失,各行各业也面临着许多前所未有的困难,全球贸易发展也迎来了许多新 的挑战。

作为贸易发展最重要的环节之一,港航业同样难以幸免。新型冠状病毒疫 情的爆发,暴露出全球港口和航运业在运营、管理等方面缺乏系统协调。尤其 是港口和航运的多维度防疫措施,大大降低了全球港口的运营效率,导致航运 服务日益短缺,并导致整个行业内部发生不可预测的变化。

新冠肺炎对港口的影响:一是随着亚洲部分国家疫情的恢复,接单量持续 上升,造成港口严重拥堵。但在一些港口极度拥堵的情况下,另一些港口的货 运量却变得很小,出现了港口闲置的现象。这使得港口交通的不对称性更加普 遍。其次,新冠肺炎也导致了世界航运能力的缺乏。例如,波罗的海干散货指 数(BDI)在2021年8月20日飙升至4092点,这也是近11年来的最高点。此外, 由于港口服务效率低下和航运市场动荡,新冠肺炎也加剧了全球供应链的不确 定性,导致供应链中断的风险增加。因此,在新冠肺炎时代,对港口作业效率 提出了更高要求。

如今,随着COVID-19的持续肆虐,如何化解防控疫情带来的风险,成为摆 在我们面前的关键问题。

全球港口和航运业的可持续管理。在这种情况下,我们需要重新设计一个高度 灵活的系统和全球网络,以保持利益相关者之间牢固的合作关系,这些利益相 关者包括航运公司、港务局、码头运营商以及物流和港口服务提供商。

为了缓解受新冠肺炎影响的港口作业效率低下的问题,请用数学建模的方 法解决以下五个问题:

问题1:请结合附件1的数据和您的合理假设,从船公司联合对接的角度出发, 提供船公司之间的合作模式,以缓解港口拥堵或港口闲置过多的问题。你应该 深入分析船公司每个周期的每个停靠码头。

问题2:请根据附件1的数据,从码头经营人的角度出发,设计最优的船舶靠港 时间计划,并提出具体的奖惩措施,以有效提高港口的靠港效率。

问题3:请从 港口泊位、码头运营商和航运公司的角度提供船舶停靠策略。这种解决方案需 要在不减少防疫工作时间的前提下,尽量减少船舶在港口的停靠时间。

问题4:您能否提供一种策略,充分考虑一个地区多个港口之间的合作,从而有效减少港口拥堵。

问题5:如果港口安排周末休息1-2天,能否提出一个更通用的港口停靠优化模 型,并用附件1的数据进行论证。


思路:

首先来看附件数据。Sheet1表中运载能力一定是和营收有关;平均停靠小时,可以直接用这个参数;而停靠时间方差则反映了船停靠的不确定性,方差可作为你们的拓展,比如在寻优研究中给予作为代价函数中的一部分,本题没有做相关要求,可以不考虑;Sheet2中是船到港的频率;Sheet3中的时间需要取一个平均时间点,将其作为排队研究的基础数据,这个也可以考虑方差进行拓展研究;Sheet4中是泊位靠泊能力的数据,结合Sheet1中运载能力,我们猜想为能停靠船的最大运载能力限度,就是说船运载能力只有在这限度之下才能停靠该泊位,这里我们也可以在模型假设中写到假设船满载。

来看第一问,上面说到了,运载能力在泊位靠泊能力下的船舶才能停靠,本题为规划问题,通过优化算法进行求解,对于此类问题,由于个体中自变量长度不一,应将每个个体看作为一个方案,通过多目标寻优筛选出最有个体,在本为事船公司联合对接的角度出发,那么就是先确定船固定到一个泊位停靠

数据准备:由于开始停靠的日期是没有给定的,因此这里就假设所有船从第一天开始排,以Sheet2为依据进行推导,可推到出100天每个船停泊的状态,这里设停泊日期为1,其他日期为0,构建一个1127*100的0,1矩阵,最后可取出中间10天时间的矩阵数据用于后文研究,10天只是举个例子

Step1:生成初始个体,个体中基因长度为船数,每个基因位点为固定合作的泊位编号

Step2:遍历每一天,如果当天停靠同一泊位则按Sheet3中平均时间先后排队停靠

Step3:针对每一个体,设置两个目标函数,一个为所有船只等待时间(如果船到达时间有空闲泊位,则无等待时间,如果船到达泊位,仍有船处于停靠时间内,计算等待时间),第二个目标函数为被泊位闲置(这里的泊位闲置可以定义为所有泊位闲置时间总和且闲置时间从1个小时后统计,也可定义为当天被闲置的泊位数量)

Step4:整体框架建议采用模拟退火算法,多目标寻优配合NS-Ⅱ非支配排序

模拟退火算法程序框架:
clear
clc
T=1000; %初始化温度值
T_min=1; %设置温度下界
alpha=0.99; %温度的下降率
num=1000; %颗粒总数
n=2; %自变量个数
sub=[]; %自变量下限
up=[]; %自变量上限
for i=1:num
    for j=1:n
        x(i,j)=;
    end
    fx(i,1)=fun(x(i,1),x(i,2));
end
%以最小化为例
[bestf,a]=min(fx);
bestx=x(a,:);
trace(1)=bestf;
while(T>T_min)
    for i=1:num
        for j=1:n
            xx(i,j)=;
        end
        ff(i,1)=fun(xx(i,1),xx(i,2));
        delta=ff(i,1)-fx(i,1);
        if delta<0
            fx(i,1)=ff(i,1);
            x(i,:)=xx(i,:);
        else
            P=exp(-delta/T);
            if P>rand
                fx(i,1)=ff(i,1);
                x(i,:)=xx(i,:);
            end
        end  
    end
    if min(fx)<bestf
        [bestf,a]=min(fx);
        bestx=x(a,:);
    end
    trace=[trace;bestf];
    T=T*alpha;
end
disp('最优解为:')
disp(bestx)
disp('最优值为:')
disp(bestf)
NS-Ⅱ:
function [TT,chrom]=ns2(NN,F1,F2)
% 快速非支配排序
a = 0;
T1 = [];
T2 = [];
chrom=NN;
chrom1 = [];
chrom2 = [];
while a == 0 %根据被支配数进行分级和排序
    M = [];
    for i = 1:length(F1)
        M(i,1) = length(find(F1<F1(i,1)))+length(find(F2<F2(i,1)));%目标函数最小化这里为<,最大化改成>
    end
    b1 = [];
    b2 = [];
    [b1,b2] = sort(M); %b1返回从小到大排序,b2返回原始序号
    if  length(chrom)>0 && b1(1) == 0   %无被支配数进入一级用T1矩阵保存
        T1 = [T1;F1(b2(1)),F2(b2(1))];
        chrom1 = [chrom1;chrom(b2(1),:)];
        F1(b2(1)) = [];
        F2(b2(1)) = [];
        chrom(b2(1),:) = [];
    else  %有被支配数进入二级用T2矩阵保存
        a = 1;
        T2 = [F1,F2];
        chrom2 = chrom;
    end
end
T2 = T2(b2,:);
chrom2 = chrom2(b2,:);
 
if size(T1,1) > 2  %T1矩阵不用进行拥挤度调整排序,直接对T2进行排序调整即可
    y = yongji(T1);%拥挤度
    for i = 2:size(T1,1)
            if y(i-1) > y(i)
                T1(i-1:1:i,:) = T1(i:-1:i-1,:); %根据拥挤度调整排序,如果后者优于前者则反转顺序
                chrom1(i-1:1:i,:) = chrom1(i:-1:i-1,:);
            end
    end
end
if length(T2) > 0  %T1矩阵不用进行拥挤度调整排序,直接对T2进行排序调整即可
    y = yongji(T2);%拥挤度
    for i = 2:size(T2,1)
        if b1(i) == b1(i-1)
            if y(i-1) > y(i)
                T2(i-1:1:i,:) = T2(i:-1:i-1,:); %根据拥挤度调整排序,如果后者优于前者则反转顺序
                chrom2(i-1:1:i,:) = chrom2(i:-1:i-1,:);
            end
        end
    end
end
%排序重组
TT = [T1;T2];
chrom = [chrom1;chrom2];

function y=yongji(H)
%计算拥挤度
y1=H(:,1);
y2=H(:,2);
[yy1,a1]=sort(y1);
[yy2,a2]=sort(y2);
L=[];
L=[1 1];
for i=2:length(yy1)-1
    L=[L;(yy1(i+1,1)-yy1(i-1,1))/(max(yy1)-min(yy1)),(yy2(i+1,1)-yy2(i-1,1))/(max(yy2)-min(yy2))];
end
L=[L;1 1];
L=[L(a1,1),L(a2,2)];
y=sum(L,2);
end

第二问,从经营收入角度出发,本问比较开放,可以自己设置费用单价,例如3小时内多少价格,超过3小时每小时多少价格,或者按分钟计费也行,要解决本问还要从船公司角度去思考,Sheet1中有船停靠平均时间和方差,假设船只停靠时间为满足正态分布的事件,有均值和方差,那就可以构建出关于时间的正太分布函数模型,例如ZH1,平均停靠时间7.4,方差为6.1,可以通过自定义函数fanwei求出每个船只在0.95水平的停靠时间范围,调用格式fanwei(平均时间,方差,0.95)

自定义函数下载链接https://pan.baidu.com/s/1F284360bohld5RO3Thp5AA提取码:z5ko

数据准备:采用第一问停靠0,1矩阵,计算每个船只停靠时间范围

Step1:生成初始个体,个体中基因长度为船数,每个基因位点为固定合作的泊位编号

Step2:遍历每一天,如果当天停靠同一泊位则按Sheet3中平均时间先后排队停靠

Step3:针对每一个体,计算停靠时间,如果采用上述第一种计费方法,那么船只就会出现一定的侥幸心里,比如对比最小停靠时间和平均停靠时间,如果前者不小于后者,那么船只就会有侥幸心理,会按平均时间停靠,如果前者小于后者,就会加快卸货效率,按最小停靠时间采取最小,这只是个例子,大家可以自由发挥。设置两个目标函数,一个为所有船只等待时间(如果船到达时间有空闲泊位,则无等待时间,如果船到达泊位,仍有船处于停靠时间内,计算等待时间),第二个目标函数为船总的停靠时间

Step4:整体框架建议采用模拟退火算法,多目标寻优配合NS-Ⅱ非支配排序

第三问,由于防疫工作的需要,尽可能减少船只前后停靠的间隔时间,例如港口A,当天有两只船a1、a2停靠,但是a1停靠完后需要过好几个小时a2才到港,如果船a3到港时间快一点,那么可以是否考虑将船a3插入进来或者重新安排a2的泊位。其实本问只需在第二问基础上增加一个目标函数即可

Step3:设置三个目标函数,一个为所有船只等待时间(如果船到达时间有空闲泊位,则无等待时间,如果船到达泊位,仍有船处于停靠时间内,计算等待时间),第二个目标函数为船总的停靠时间,第三个目标函数为当天泊位工作时间之和(每天的工作时间为第一个船只到港至最后一个船只离岗)

第四问,可能前面大家会觉得这步就是一个问题吗,No,做题要循循渐进,这个问才会考虑一个船可停靠多个泊位

数据准备:第一问中的0,1矩阵

Step1:生成初始个体,个体中基因长度为比如10天内的所有船只停靠次数,每个基因位点随机对应一个泊位编号

Step2:遍历每一天,如果当天停靠同一泊位则按Sheet3中平均时间先后排队停靠,这里为了降低运算量,可写一个判断:如果有满足停靠的其他空闲泊位,那么就优先从中选择

Step3:针对每一个体,设置三个目标函数,一个为所有船只等待时间(如果船到达时间有空闲泊位,则无等待时间,如果船到达泊位,仍有船处于停靠时间内,计算等待时间),第二个目标函数为船总的停靠时间,第三个目标函数为当天泊位工作时间之和(每天的工作时间为第一个船只到港至最后一个船只离岗)

Step4:整体框架建议采用模拟退火算法,多目标寻优配合NS-Ⅱ非支配排序

第五问,在第一问我们模拟了1127条船只基本Sheet2产生100天内停靠的0,1矩阵,这里我们就直接按每6天等间距将第七天列数据换为0,就当作休息日,那么原本在第七天到港的船只,就需要被重新安排至下周一(怎么安排也可以自己定,一般实际上是被安排至下一周一),同第四问求解一致

大家在做题的时候一定要看清楚问题的先后逻辑,并且题目背景是

疫情

,所以要尽可能减少港口泊位的运作时间