2021数学建模国赛C题比赛总结和感想

目录标题

  • 问题重述
  • 论文摘要
  • 代码
  • 2.1 第一题马尔可夫预测模型(matlab)
  • 2.2 第二题第一问(lingo)
  • 2.3 第二题第二问(lingo)
  • 2.4 第二题第三问(lingo)
  • 2.5 第三题优化模型(lingo)
  • 2.6 第四题提升模型(lingo)
  • 2.7 大规模数据填表
  • 总结和感想
  • 整体过程
  • 犯错点
  • 感想
  • 问题重述

    某企业每年以 48 周安排生产 A,B,C 三种原材料,需提前制定 24 周的订 购和转运计划。

    已知该企业每周的产能为 2.82 万立方米,单位立方米产品需消 耗 A 或 B 或 C 类原材料的量分别为 0.6、0.66、0.72 立方米;

    每家转运商的运 输能力为 6000 立方米/周;A、B、C 类原材料采购单价之比为 1.2:1.1:1,且产 生的单位运输和储存费用相同。

    实际生产中,要求尽可能保持不少于满足两周 生产需求的原材料库存量,该企业对供应商提供的原材料全部收购,且通常一 家供应商每周供应的原材料尽量由一家转运商运输。据此,需建立数学模型解 决以下问题:

    问题一:已知该企业近 5 年 402 家原材料供应商的订货量和供应量数据, 要求量化分析其供货特征,建立保障企业生产重要性的数学模型,并挑选出 50 家最重要的供应商。

    问题二:在问题一的基础上确定满足生产需求的最少供应商数量,针对这 些供应商,为企业制定未来 24 周每周最经济的原材料订购方案。已知近 5 年 8 家转运商的运输损耗率数据,进一步给出损耗最少的转运方案,并分析订购方 案和转运方案的实施效果。

    问题三:为该企业制定尽量多地采购 A 类和尽量少地采购 C 类原材料的订 购及转运方案,同时保证转运损耗率尽量少,并分析其实施效果。

    问题四:根据现有供应商和转运商的情况,求取该企业每周的潜在产能提 高量,并确定未来 24 周的订购和转运方案。

    论文摘要

    本文以 TOPSIS 法、马尔科夫预测和目标规划理论为基础,分别建立最少供应商 模型、最经济订购模型、最小损耗转运模型、压缩生产成本的订购转运模型和产能提 高模型,为企业制定不同条件下的订购方案及转运方案。

    针对问题一,首先对供应商的供货特征进行量化分析,提炼了交付率、交付率大 于 1 的次数、总供货量三个指标,构建衡量企业生产重要性的指标体系。在此基础 上,利用熵权法求出三个指标的权重,然后用 TOPSIS 方法量化供应商的重要性,根 据综合得分值的大小确定 50 家最重要的供应商,其中 A、B、C 三类供应商数量分别 为 14、16、20 家。

    针对问题二,可将未来 24 周视为 24 个互相联系的阶段,考虑到每个阶段决策的 选取具有马尔科夫性,且依赖于交付率的动态变化,故选择马尔科夫预测模型对交付 率的波动情况进行预测;

    然后,以供应商数量最少为目标函数,以满足生产的库存 量,供应商每周供货量不多于运输上限 6000 立方米,不多于其 240 周内的供货量的最 大值为约束条件,建立了确定最少供应商的 0-1 整数规划模型,得到最少供应商数量 为 30 家。

    在此基础上,将目标函数变为使原材料总订购费用最少,建立最经济订购模 型,得到每周的订购方案。进一步以运输的损耗量最小为目标函数,以转运商每周运 输上限及一家供应商供应的原材料由一家转运商运输为约束条件,建立最小损耗转运 模型,得到每家转运商的转运方案,且平均损耗率为 0.665。最后,以制定方案的目标 来判断该方案是否可行,结果表明两种方案的制定均可行。

    针对问题三,将尽量多地采购 A 和尽量少地采购 C 转化为储存原材料的体积最 小,结合转运原材料损耗量最少这一目标,建立压缩生产成本的双目标规划模型,通 过加权求和将双目标规划转化为单目标规划,最终得到该条件下的订购、转运方案, 平均损耗率为 0.665。与问题二效果分析方法类似,得到两种方案的制定均可行。

    针对问题四,由于每家供应商供货量的上限直接决定产能能力,因此以每周供应 商供货量与损耗量之差最大为目标,以转运上限和一家供应商提供的原材料由一家转 运商转运为约束条件建立产能提高模型,计算出企业每周的最大产能量,剔除部分异 常数据后取平均得到最终产能增加量为 0.63 万立方米,同时得到新的订购和转运计 划。最后,对模型中运用的方法进行优缺点评价和改进,并考虑了实际应用中的推 广。

    关键词:TOPSIS 法 马尔科夫预测 目标规划 订购转运计划

    代码

    附录:主要代码

    2.1 第一题马尔可夫预测模型(matlab)

    %计算马尔可夫状态转移矩阵
    a1=xlsread('C:\Users\zh128\Desktop\Data\第一问.xlsx',2,'A2:A403');
    a2=xlsread('C:\Users\zh128\Desktop\Data\第一问.xlsx',2,'C2:C403');
    a3=xlsread('C:\Users\zh128\Desktop\Data\第一问.xlsx',2,'D2:D403');
    y=linspace(0,0,402);
    z=linspace(0,0,402);
    b=linspace(0,0,402);
     for i = 1:402
         x=sqrt((1-a1(i,1))^2+(1-a2(i,1))^2+(1-a3(i,1))^2);
         y(1,i)=x;
     end
    xlswrite('C:\Users\zh128\Desktop\Data\第一问.xlsx',y',2,'E2:E403')
    
     for i = 1:402
         x=sqrt((0-a1(i,1))^2+(0-a2(i,1))^2+(0-a3(i,1))^2);
         z(1,i)=x;
     end
     xlswrite('C:\Users\zh128\Desktop\Data\第一问.xlsx',z',2,'F2:F403')
     
     b = z./(z+y);
    
    %计算综合评价得分
    a1=xlsread('C:\Users\zh128\Desktop\Data\第一问.xlsx',2,'A2:A403');
    a2=xlsread('C:\Users\zh128\Desktop\Data\第一问.xlsx',2,'C2:A403');
    a3=xlsread('C:\Users\zh128\Desktop\Data\第一问.xlsx',2,'D2:A403');
    y1=linspace(0,0,402);
    y2=linspace(0,0,402);
    y3=linspace(0,0,402);
    sum1=0;
    sum2=0;
    sum3=0;
    for i = 1:402
        sum1=a1(i,1)+sum1;
        sum2=a2(i,1)+sum2;
        sum3=a3(i,1)+sum3;
    end
     for i = 1:402
         x1=a1/sum1;
         y1(1,i)=x1;
         x2=a1/sum2;
         y2(1,i)=x2;
         x3=a1/sum3;
         y3(1,i)=x3;
     end
     sum=0;
    for i = 1:402
        z1=y1(1,i)*log(y1(1,i));
        sum=z1+sum;
        e1=sum*(1/log(i))*(-1);
        y1(1,i)=1-e1;
    end
    sum1=0;
    sum2=0;
    sum3=0;
    for i = 1:402
        sum1=y1(1,i)+sum1;
    %     sum2=a2(i,1)+sum2;
    %     sum3=a3(i,1)+sum3;
    end
    
    for i = 1:402
        y1(1,)
    %     sum2=a2(i,1)+sum2;
    %     sum3=a3(i,1)+sum3;
    end
     xlswrite('C:\Users\zh128\Desktop\Data\第一问.xlsx',z',2,'F2:F403')
    
    %计算马尔可夫概率矩阵
    a1=xlsread('C:\Users\zh128\Desktop\Data\交付率状态.xlsx','Sheet1','C2:IH403');
    x50=xlsread('C:\Users\zh128\Desktop\Data\第二问.xlsx','Sheet2','A2:A51');
    g00=linspace(0,0,402);
    g01=linspace(0,0,402);
    g11=linspace(0,0,402);
    g10=linspace(0,0,402);
    p12=zeros(50,24);
    %初始化
     b1=0;
     b2=0;
     %计算转移参数出现的频数
     for j = 1:402
         b1 = a1(j,1);
         f00=0;
         f01=0;
         f11=0;
         f10=0;
         for i = 2:240
             b2=a1(j,i);
             %设置表格中空值为3,因而要跳过空值影响
             if b1==3
                 b1=a1(j,i);
                 continue;
             end
             if b2==3
                 continue;
             end
             if b1==1&&b2==1 
                f11=f11+1;
                b1=b2;
             end
             if b1==1&&b2==0 
                f10=f10+1;
                b1=b2;
             end
             if b1==0&&b2==1 
                f01=f01+1;
                b1=b2;
             end
             if b1==0&&b2==0 
                f00=f00+1;
                b1=b2;
             end
         end
         g00(1,j)=f00;
         g01(1,j)=f01;
         g10(1,j)=f10;
         g11(1,j)=f11;
     end
    
     %计算转移频率
    g00=g00./(g00+g01);
    g01=g01./(g00+g01);
    g10=g10./(g10+g11);
    g11=g11./(g10+g11);
    
    for j = 1:50
        i=x50(j,1);
        p0=[0 1];
        p=[g00(1,i) g01(1,i);g01(1,i) g11(1,i)];
        %先乘以初值
        p=p0*p;
        %预测24周的
        for k = 1:24
            px=p.^k;
            
            p12(j,k)=px(1,2)-px(1,1);
        end
    end 
    
    xlswrite('C:\Users\zh128\Desktop\Data\第二问.xlsx',p12,'Sheet2','E2:AB51');
    

    2.2 第二题第一问(lingo)

    model:
    Title 第二题第一问;
    sets:
    factoryA/1..14/:a,l_max,qa;
    factoryB/1..16/:b,m_max,qb;
    factoryC/1..20/:c,n_max,qc;
    day/1..24/:;
    link1(factoryA,day): a1,pa;
    link2(factoryB,day): b1,pb;
    link3(factoryC,day): c1,pc;
    endsets
    
    data:
    l_max=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','lmax');
    m_max=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','mmax');
    n_max=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','nmax');
    
    pa=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','pa');
    pb=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','pb');
    pc=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','pc');
    
    qa=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','qa');
    qb=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','qb');
    qc=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','qc');
    enddata
    
    init:
    endinit
    
    [OBJ]min=@sum(factoryA(i):a(i))+@sum(factoryB(i):b(i))+@sum(factoryC(i):c(i));
    
    @for(link1(i,j):@gin(a1(i,j)));
    @for(link2(i,j):@gin(b1(i,j)));
    @for(link3(i,j):@gin(c1(i,j)));
    
    @for(factoryA(i):@bin(a(i)));
    @for(factoryB(i):@bin(b(i)));
    @for(factoryC(i):@bin(c(i)));
    @for(link1(i,j):a1(i,j)<=l_max(i));
    @for(link2(i,j):b1(i,j)<=m_max(i));
    @for(link3(i,j):c1(i,j)<=n_max(i));
    
    @for(link1(i,j):@bnd(0,a1(i,j),6000));
    @for(link2(i,j):@bnd(0,b1(i,j),6000));
    @for(link3(i,j):@bnd(0,c1(i,j),6000));
    
    @for(day(j):@sum(factoryA(i):((pa(i,j)*qa(i)+1)*a(i)*a1(i,j))/0.6)+@sum(factoryB(i):((pb(i,j)*qb(i)+1)*b(i)*b1(i,j))/0.66)+
    @sum(factoryC(i):((pc(i,j)*qc(i)+1)*c(i)*c1(i,j))/0.72)>=28200);
    
    @for(day(j):@sum(factoryA(i):(pa(i,j)*qa(i)+1)*a(i)*a1(i,j))+@sum(factoryB(i):((pb(i,j)*qb(i)+1)*b(i)*b1(i,j)))+
    @sum(factoryC(i):((pc(i,j)*qc(i)+1)*c(i)*c1(i,j)))<=48000);
    End
    

    2.3 第二题第二问(lingo)

    model:
    Title 第二题第二问;
    sets:
    factoryA/1..14/:a,l_max,qa;
    factoryB/1..16/:b,m_max,qb;
    factoryC/1..20/:c,n_max,qc;
    day/1..24/:;
    link1(factoryA,day): a1,pa;
    link2(factoryB,day): b1,pb;
    link3(factoryC,day): c1,pc;
    endsets
    
    data:
    a=1,1,1,1,1,1,1,1,0,0,0,0,0,0;
    b=1,1,1,1,1,1,1,1,1,0,0,1,0,1,0,0;
    c=1,1,1,1,1,0,1,1,1,1,0,1,0,0,0,1,0,0,0,1;
    l_max=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','lmax');
    m_max=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','mmax');
    n_max=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','nmax');
    
    pa=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','pa');
    pb=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','pb');
    pc=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','pc');
    
    qa=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','qa');
    qb=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','qb');
    qc=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','qc');
    enddata
    
    init:
    endinit
    
    [OBJ]min=@sum(day(j):@sum(factoryA(i):((pa(i,j)*qa(i)+1)*a(i)*a1(i,j))*1.2)+@sum(factoryB(i):((pb(i,j)*qb(i)+1)*b(i)*b1(i,j))*1.1)+
    @sum(factoryC(i):((pc(i,j)*qc(i)+1)*c(i)*c1(i,j))));
    
    @for(link1(i,k):@gin(a1(i,k)));
    @for(link2(i,k):@gin(b1(i,k)));
    @for(link3(i,k):@gin(c1(i,k)));
    @for(link1(i,k):a1(i,k)<=l_max(i));
    @for(link2(i,k):b1(i,k)<=m_max(i));
    @for(link3(i,k):c1(i,k)<=n_max(i));
    
    @for(link1(i,k):@bnd(0,a1(i,k),6000));
    @for(link2(i,k):@bnd(0,b1(i,k),6000));
    @for(link3(i,k):@bnd(0,c1(i,k),6000));
    
    @for(day(k):@sum(factoryA(i):((pa(i,k)*qa(i)+1)*a(i)*a1(i,k))/0.6)+@sum(factoryB(i):((pb(i,k)*qb(i)+1)*b(i)*b1(i,k))/0.66)+
    @sum(factoryC(i):((pc(i,k)*qc(i)+1)*c(i)*c1(i,k))/0.72)>=28200);
    
    @for(day(k):@sum(factoryA(i):(pa(i,k)*qa(i)+1)*a(i)*a1(i,k))+@sum(factoryB(i):((pb(i,k)*qb(i)+1)*b(i)*b1(i,k)))+
    @sum(factoryC(i):((pc(i,k)*qc(i)+1)*c(i)*c1(i,k)))<=48000);
    End
    

    2.4 第二题第三问(lingo)

    model:
    Title 第二题第三问;
    sets:
    factoryA/1..14/:a,l_max,qa;
    factoryB/1..16/:b,m_max,qb;
    factoryC/1..20/:c,n_max,qc;
    day/1..24/:;
    link1(factoryA,day): a1,pa;
    link2(factoryB,day): b1,pb;
    link3(factoryC,day): c1,pc;
    exp/1..8/:y;
    key/1..30/:;
    link4(key,exp):m;
    link5(key,day):x;
    
    endsets
    data:
    a=1,1,1,1,1,1,1,1,0,0,0,0,0,0;
    b=1,1,1,1,1,1,1,1,1,0,0,1,0,1,0,0;
    c=1,1,1,1,1,0,1,1,1,1,0,1,0,0,0,1,0,0,0,1;
    
    y=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','ydata');
    x=@OLE('C:\Users\zh128\Desktop\Data\订购方案问题二(数据集中版本).xlsx','yun');
    @OLE('C:\Users\zh128\Desktop\Data\订购方案问题二(数据集中版本).xlsx','x_data')=x;
    @OLE('C:\Users\zh128\Desktop\Data\订购方案问题二(数据集中版本).xlsx','m_data')=m;
    enddata
    
    init:
    endinit
    
    [OBJ]min=@sum(link4(i,j):m(i,j)*x(i,1)*y(j));
    
    @for(link4(i,j):@bin(m(i,j)));
    @for(key(i):@sum(exp(j):m(i,j))=1);
    @for(exp(j):@sum(key(i):m(i,j)*x(i,1))<=6000);
    
    end
    

    2.5 第三题优化模型(lingo)

    model:
    Title 第三题;
    sets:
    factoryA/1..14/:a,l_max,qa;
    factoryB/1..16/:b,m_max,qb;
    factoryC/1..20/:c,n_max,qc;
    day/1..24/:;
    
    link1(factoryA,day): a1,pa;
    link2(factoryB,day): b1,pb;
    link3(factoryC,day): c1,pc;
    
    exp/1..8/:y;
    
    link4(factoryA,exp):am;
    link5(factoryB,exp):bm;
    link6(factoryC,exp):cm;
    
    link7(factoryA,exp,day):am1;
    link8(factoryB,exp,day):bm1;
    link9(factoryC,exp,day):cm1;
    endsets
    
    data:
    l_max=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','lmax');
    m_max=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','mmax');
    n_max=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','nmax');
    
    pa=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','pa');
    pb=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','pb');
    pc=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','pc');
    
    qa=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','qa');
    qb=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','qb');
    qc=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','qc');
    
    y=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','ydata');
    
    @OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','a_1')=a1;
    @OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','b_1')=b1;
    @OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','c_1')=c1;
    enddata
    
    init:
    endinit
    [OBJ]min=@sum(day(k):@sum(factoryA(i):0.6*a1(i,k))+@sum(factoryB(i):0.66*b1(i,k))+@sum(factoryc(i):0.72*c1(i,k))+
    87.78*(@sum(exp(j):y(j)*(@sum(factoryA(i):am(i,j)*a1(i,k))+@sum(factoryB(i):bm(i,j)*b1(i,k))+@sum(factoryC(i):cm(i,j)*c1(i,k))))));
    
    @for(link1(i,k):@gin(a1(i,k)));
    @for(link2(i,k):@gin(b1(i,k)));
    @for(link3(i,k):@gin(c1(i,k)));
    
    @for(factoryA(i):@bin(a(i)));
    @for(factoryB(i):@bin(b(i)));
    @for(factoryC(i):@bin(c(i)));
    
    
    @for(link1(i,k):a1(i,k)<=l_max(i));
    @for(link2(i,k):b1(i,k)<=m_max(i));
    @for(link3(i,k):c1(i,k)<=n_max(i));
    
    @for(link1(i,k):@bnd(0,a1(i,k),6000));
    @for(link2(i,k):@bnd(0,b1(i,k),6000));
    @for(link3(i,k):@bnd(0,c1(i,k),6000));
    
    
    @for(day(k):@sum(factoryA(i):((pa(i,k)*qa(i)+1)*a(i)*a1(i,k))/0.6)+@sum(factoryB(i):((pb(i,k)*qb(i)+1)*b(i)*b1(i,k))/0.66)+
    @sum(factoryC(i):((pc(i,k)*qc(i)+1)*c(i)*c1(i,k))/0.72)>=28200);
    
    @for(day(k):@sum(factoryA(i):(pa(i,k)*qa(i)+1)*a(i)*a1(i,k))+@sum(factoryB(i):((pb(i,k)*qb(i)+1)*b(i)*b1(i,k)))+
    @sum(factoryC(i):((pc(i,k)*qc(i)+1)*c(i)*c1(i,k)))<=48000);
    
    @for(link4(i,j):@bin(am(i,j)));
    @for(link5(i,j):@bin(bm(i,j)));
    @for(link6(i,j):@bin(cm(i,j)));
    
    
    @for(exp(j):(@sum(link1(i,k):am(i,j)*a1(i,k))+@sum(link2(i,k):bm(i,j)*b1(i,k))+@sum(link3(i,k):cm(i,j)*c1(i,k)))<=6000);
    
    end
    

    2.6 第四题提升模型(lingo)

    model:
    Title 第四题;
    sets:
    factoryA/1..14/:a,l_max,qa;
    factoryB/1..16/:b,m_max,qb;
    factoryC/1..20/:c,n_max,qc;
    day/1..24/:;
    
    link1(factoryA,day): a1,pa;
    link2(factoryB,day): b1,pb;
    link3(factoryC,day): c1,pc;
    
    exp/1..8/:y;
    
    link4(factoryA,exp):am;
    link5(factoryB,exp):bm;
    link6(factoryC,exp):cm;
    
    link7(factoryA,exp,day):am1;
    link8(factoryB,exp,day):bm1;
    link9(factoryC,exp,day):cm1;
    endsets
    
    data:
    
    l_max=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','lmax');
    m_max=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','mmax');
    n_max=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','nmax');
    
    pa=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','pa');
    pb=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','pb');
    pc=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','pc');
    
    qa=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','qa');
    qb=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','qb');
    qc=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','qc');
    
    y=@OLE('C:\Users\zh128\Desktop\Data\第二问.xlsx','mdata');
    enddata
    
    init:
    endinit
    
    
    [OBJ]max=@sum(factoryA(i):((pa(i,1)*qa(i)+1)*a(i)*a1(i,1))/0.6)+@sum(factoryB(i):((pb(i,1)*qb(i)+1)*b(i)*b1(i,1))/0.66)+
    @sum(factoryC(i):((pc(i,1)*qc(i)+1)*c(i)*c1(i,1))/0.72);
    
    
    @for(factoryA(i):@gin(a1(i,1)));
    @for(factoryB(i):@gin(b1(i,1)));
    @for(factoryC(i):@gin(c1(i,1)));
    
    @for(factoryA(i):@bin(a(i)));
    @for(factoryB(i):@bin(b(i)));
    @for(factoryC(i):@bin(c(i)));
    
    @for(factoryA(i):a1(i,1)<=l_max(i));
    @for(factoryB(i):b1(i,1)<=m_max(i));
    @for(factoryC(i):c1(i,1)<=n_max(i));
    
    @for(factoryA(i):@bnd(0,a1(i,1),6000));
    @for(factoryB(i):@bnd(0,b1(i,1),6000));
    @for(factoryC(i):@bnd(0,c1(i,1),6000));
    
    @sum(factoryA(i):(pa(i,1)*qa(i)+1)*a1(i,1))+@sum(factoryB(i):((pb(i,1)*qb(i)+1)*b1(i,1)))+
    @sum(factoryC(i):((pc(i,1)*qc(i)+1)*c1(i,1)))<=48000;
    
    @for(link4(i,j):@bin(am(i,j)));
    @for(link5(i,j):@bin(bm(i,j)));
    @for(link6(i,j):@bin(cm(i,j)));
    
    @for(exp(j):(@sum(factoryA(i):am(i,j)*a1(i,1))+@sum(factoryB(i):bm(i,j)*b1(i,1))+@sum(factoryC(i):cm(i,j)*c1(i,1)))<=6000);
    
    end
    

    2.7 大规模数据填表

    x37=xlsread('C:\Users\zh128\Desktop\Data\第二问.xlsx','Sheet4','A1:Z37');
    index=xlsread('C:\Users\zh128\Desktop\Data\订购方案问题二(数据集中版本).xlsx','Sheet4','I1:I37');
    yun=zeros(402,192);
    
    for i = 1:37
        index(i,1);
        for j = 1:24
            flag=x37(i,1);
            step=index(i,1);
            yun(flag,step+8*(j-1))=x37(i,j+2);
        end
    end
    
    xlswrite('C:\Users\zh128\Desktop\Data\附件B 转运方案数据结果.xlsx',yun,'问题3的转运方案结果','B7:GK408');
    
    x37=xlsread('C:\Users\zh128\Desktop\Data\第二问.xlsx','Sheet4','A1:Z37');
    index=xlsread('C:\Users\zh128\Desktop\Data\订购方案问题二(数据集中版本).xlsx','Sheet4','I1:I37');
    yun=zeros(402,24);
    
    for i = 1:37
        index(i,1);
        for j = 1:24
            flag=x37(i,1);
            step=index(i,1);
            yun(flag,j)=x37(i,j+2);
        end
    end
    
    xlswrite('C:\Users\zh128\Desktop\Data\附件A 订购方案数据结果.xlsx',yun,'问题3的订购方案结果','B7:Y408');
    

    总结和感想

    整体过程

    比赛当天下午六点公布赛题,初步浏览过赛题后,我们最开始是相中了B题,在进行了一系列论文研究和信息收集以后发现,B题的题目设计在我们当时看来有很多问题,比如说作为统计题目而言,数据量过于小了,导致很多统计方法没法有效展开,各个指标关系过于明显了,我们也没有很多的数学模型对此进行很好地描述,因而在当天最后决定还是放弃B题,选择比较常规的C题。

    而后就是漫长的优化和处理大数据的过程。一开始还算顺利,我们决定使用马尔可夫预测对历史数据进行预测解决1,2两题,但是第二天下午做到第三题发现了明显的悖论,在被提醒后,发现我们假设中将供应商设定为了可以最大限度持续进行供应,这是比较不合理的。因此我们也将全部推倒重来。

    因为比赛只剩下了一天加一夜,所以我们决定通宵进行,将数据再重新计算一遍。再比赛最后一天早上基本完成前三题,其中在解决第三题时候,出现了我改动代码后,运行结果除了问题,而通宵过后的我脑子浑浑噩噩,一时半会竟然解决不好这个问题,所以如果要优化原由代码,最好要再建一个文件,形成备份比较保险。

    还有一个细节,就是lingo在进行规划的时候,有时候会根据运行的时间得出不同的规划结果。需要我们不断调整运行时间,得到一个比较良好的结果。

    最后一个需要重视的点,就是在处理大规模数据的题目时候,对于各项数据的整理和保存,备份需要格外重视,而如果题目有一些对结果进行整理和总结的操作,尽量寻求程序处理,而不要妄图进行手工处理。

    犯错点

    1. 对建模同学模型理解不到位,导致程序处理失误
    2. 对数据处理保存不到位,导致后期问题处理繁琐
    3. 对excel和spss等软件使用不熟练,导致基本的数据预处理缓慢
    4. 时间节奏把握不到位,导致通宵,进而最后一天状态很差
    5. 对题意理解不完整,导致重复返工
    6. 对于数据的文件操作要更加熟练,因为出题方可能会要去各种格式来呈现结果

    感想

    最大的感受还是比赛的时候要有一个好的心态和对整体比赛节奏的把握。因为心态一旦崩盘,整个情绪,心理,团队气氛都会大受影响,很多别的团队就是后期直接心态炸裂导致很多的失误和未能完成。

    还有就是比赛节奏的掌控,不要因为一开始时间充裕就想七想八,不断变更赛题,一定要聚焦在主线上,将工作量控制在自己能力范围内,否则最后数据处理不完或者模型解不出来都是十分棘手的问题。

    另外一个就是能不通宵就不要通宵,尤其是比赛提交时间是在晚上和下午的比赛,因为前一天的通宵会导致你第二天白天的状态奇差无比,直接丧失思考的复杂问题的能力,无论编程还是论文写作都会出问题,最后一个熬不住甚至论文完成都成了问题,三四天的努力直接报废。

    来源:死磕的斯坦张

    物联沃分享整理
    物联沃-IOTWORD物联网 » 2021数学建模国赛C题比赛总结和感想

    发表评论