2021年数学建模国赛C题问题三详细思路和代码

2021年数学建模国赛C题问题三详细思路和代码

1 问题分析

问题三要求压缩成本、减少转运及仓储的成本、降低转运损耗率,并制定对应的订购方案和转运方案,最大的特点在于没有供应商数量限制,故每周的供应商数量可以不同,是动态的订购方案和转运方案。和问题二的不同在于要同时对订购方案和转运方案进行优化,且增加了优化目标。另外,问题三还要求我们尽可能地多采购A类和尽可能地少采购C类原材料。分析后我们发现每立方米的产品消耗A的体积最少,依次是BC,所以在相同产能要求下,加大对A的采购可以减少库存原料的体积,进而达到节约仓储成本。

我们把生产成本和仓储成本统一为成本,转运和损耗率统一为转运损耗率,所以本问题的关键在于量化成本目标函数和转运损耗率目标函数,然后再进行双目标优化,并给出相应的订购方案和转运方案。

对于优化,我们利用线性加权法改进的模拟退火算法,使其可同时对两个目标函数进行优化,然后给出此时优化两个目标后的订购方案和转运方案。

另外,由于问题三要求我们自主决策制定企业对ABC的订货量,而不是用预测得到的ABC的订货量去初始化订货方案,所以无法利用与问题二中一致的订购方案初始化方法。为了能对订货方案进行初始化,首先我们利用问题二中预测的每周ABC原料体积,计算得到每周的产能。然后考虑预测未来24周的供货数据,在满足每周产能(利用问题二预测的ABC原料,转换计算得到的)需求的条件下,根据具体的供应商每周能供应原料ABC的情况,对原料ABC的订购量进行初始化。

所以我们考虑先根据供应商后24周的供货数据利用AdaBoost算法来预测未来24周供应商的供货数据,然后结合得到的每周的产能去生成企业每周的订购方案。为了体现侧重A类原料,而尽量少的使用C类原料,我们在初始化方案时,采用优先级排序的方法,先由提供A类原料的供应商供货,再由提供B类原料和C类原料的供应商供货。同时,给予一定的随机性,即:每次生成订货方案时,不把这一周这个供应商能提供的全部原料用完,以此保证优化时,我们解具有随机性,能进行优化。具体思路如下。

在这里插入图片描述

2 成本模型与订货方案

问题三和问题一研究的问题基本一致,但是目标函数的计算方法和订货方案的初始化方法有所不一样,下面基于问题二的经济效益模型进行微调,给出本问题成本的计算方法:
在这里插入图片描述
在这里插入图片描述
对于订购方案的产生,我们首先利用问题二预测的未来24周的原材料ABC订货量,参考公式(6-1)中的计算方法,计算得到未来24周的预订产能。计算公式如下:
在这里插入图片描述

3 损耗率模型与转运方案

依据转运方案计算损耗率较简单,下面直接给出问题三中的损耗率的计算方法:
在这里插入图片描述
法和满足的条件与问题二一致,我们可参考公式(6-8)给出,这里不再赘述。

4 模拟退火算法进行多目标优化

普通的模拟退火算法只能解决单目标优化,为了能同时对成本模型和损耗率模型进行优化,我们引入“线性加权法”,把多目标问题转换为单目标问题,且同时也能满足对两个目标的优化。下面给出目标函数的线性加权方法:
在这里插入图片描述
在实际优化过程中,我们选取外循环500次,内循环100次,初始温度 给定为1000,温度衰减系数 为0.98。模拟退火算法优化过程如下图:
在这里插入图片描述

从优化结果来看,成本与损耗的综合目标函数最优值在122单位左右,同时我们得到了订购和转运的最优方案:
在这里插入图片描述

5 实施效果分析

问题三是在问题二的基础上进行进一步优化的,要求在同时减少仓储成本和运输损耗率的情况下,给出未来24周更加完善的企业订购方案和转运方案。为了衡量其方案的实施效果,我们把两个问题最后得到的订购和转运方案进行对比,计算出两种方案下订购原材料的花费以及转运的损耗率,通过比较两者的结果对问题三的实施效果进行分析。
花费和损耗率的计算方法前文已经详细说明了,我们利用两个问题的方案计算后,得到了如下表所示的结果:
在这里插入图片描述
从结果来看,问题三的订购方案和转运方案在损耗率上得到了提升,但是在花费上得到了下降。对于损耗率变低,这是因为问题三对损耗率进行了全局优化,而不是先满足经济效益,再优化转运损耗,所以是可以解释的。而对于原材料花费变大,这也是正常的,因为问题三中提出了仓储成本,为了降低仓储成本,必须多订购价格更加昂贵的A类原材料,所以原材料花费上比问题二高。但是总的来说,问题三的优化更加具有全局性,是多任务同时优化,整体效果优于问题二。

部分代码如下

%% 对第三问订购方案和转运方案进行效果评估
order_plan2 = xlsread('..\附件A 订购方案数据结果.xlsx', '问题2的订购方案结果', 'B7:Y408');
order_plan3 = xlsread('..\附件A 订购方案数据结果.xlsx', '问题3的订购方案结果', 'B7:Y408');
money_all2 = 0;
money_all3 = 0;
load('..\prob.mat');
% 供货商的材料种类
class = prob(:, 3);
%计算每周ABC三种原材料的量
for i = 1:24
    A = 0; 
    B = 0;
    C = 0;
    for j = 1:402
        if class(j) == 1.2
            A = A + order_plan2(j, i);
        elseif class(j) == 1.1
            B = B + order_plan2(j, i);
        elseif class(j) == 1
            C = C + order_plan2(j, i);
        end
    end
    money_all2 = money_all2 + A * 1.2 + B * 1.1 + C * 1;
end
for i = 1:24
    A = 0; 
    B = 0;
    C = 0;
    for j = 1:402
        if class(j) == 1.2
            A = A + order_plan3(j, i);
        elseif class(j) == 1.1
            B = B + order_plan3(j, i);
        elseif class(j) == 1
            C = C + order_plan3(j, i);
        end
    end
    money_all3 = money_all3 + A * 1.2 + B * 1.1 + C * 1;
end

trans_plan2 = xlsread('..\附件B 转运方案数据结果.xlsx', '问题2的转运方案结果', 'B7:GK408');
trans_plan3 = xlsread('..\附件B 转运方案数据结果.xlsx', '问题3的转运方案结果', 'B7:GK408');
load('..\predict_waste.mat');
%计算损耗率
W2 = compute_rate(trans_plan2, predict_waste);
W3 = compute_rate(trans_plan3, predict_waste);

猜你喜欢

转载自blog.csdn.net/qq_35712832/article/details/123290429