主要内容

在基于问题的框架下建立多周期库存模型

这个例子展示了如何在基于问题的框架中创建一个多周期库存模型。问题是在一段时间内安排混合肥料的生产,使用各种原料,这些原料的成本以一种可预测的方式取决于时间。假设你事先知道肥料的需求。目标是在满足需求的同时实现利润最大化,而需求的成本是购买原材料和长期储存肥料的成本。你可以通过期货或其他合同提前确定成本。

肥料和配料

粒状肥料含有氮(N)、磷(P)和钾(K)等营养物质。您可以将以下原料混合,以获得与所需营养物质混合的肥料。

负载肥料共混物= blendDemand.Properties.VariableNames化肥产量%
混合=1 x2单元格{'平衡'}{' HighN '}
营养= rawNutrients.Properties.RowNames
营养素=3 x1细胞{'N'}{'P'}{'K'}
原糖= rawNutrients.Properties.VariableNames%的原材料
罗尔斯=1x6电池{ 'MAP'} { '钾肥'} { '一个'} { 'AS'} { 'TSP'} { '砂土'}

两种肥料混合物的营养需求相同(10% N, 10% P, 10% K),除了“高N”混合物增加了10% N,总共增加了20% N。

disp (blendNutrients)%这张表是用百分比表示的
平衡高点10点10点10点10

原料的名称和营养成分的重量百分比如下。

副主任(营养素)%这张表是用百分比表示的
将钾盐映射为TSP砂uuuuuuuuuuuuuuuuuuuuuuuuuuuun 11 0 35 21 0 P 48 0 0 0 46 0 K 0 60 0 0 0 0 0 0 0

原料沙粒不含营养成分。如果有必要,沙子会稀释其他成分,以获得所需的营养成分的重量百分比。

将每个数量的数字存储在变量中。

nBlends =长度(混合);nRaws =长度(画);nNutrients =长度(营养);

预测需求及收入

假设你事先知道重量(吨),用于在该问题的时间段两个混合肥料的需求。

DISP(blendDemand)
平衡高点:1月750日2月800日3月900日4月850日400日5月700日350日6月700日7月700日200日8月600日9月600日10月550日11月550日200日12月550日200

你知道每吨化肥的售价。每吨的价格不取决于时间。

DISP(blendPrice)
平衡HighN ________ _____ 400 550

原材料价格

假设你事先知道吨的价格为原材料。这些价格每吨根据下表依赖于时间。

显示(原始成本)
MAP钾肥一个AS TSP沙___ ______ ___ ___ ___ ____月350 610 300 135 250 80月360 630 300 140 275 80月350 630 300 135 275 80月350 610 300 125 250 80 320 600 300 125 250 80月320 600300 125 250 80 320七月600 300 125 250 80 320八月600 300 125 240 80 320九月600 300 125 240 80 310十月600 300 125 240 80十一月310 600 300 125 240 80 340十二月600 300 125 240 80

存储成本

混合肥料的储存成本为每吨和每期。

disp (inventoryCost)
10

容量限制

你可以存储不超过inventoryCapacity在任何时期的总肥料混合吨数。

disp(库存容量)
1000

你能产生的总数不超过productionCapacity在任何时间段都有吨。

主任(生产能力)
1200.

连接在生产,销售,库存和

在开始计划时,需要有一定数量或库存的肥料混合物。在最后阶段,您对该库存有一个特定的目标。在每个时间段,肥料混合物的量是前一时间段结束时的量加上生产量减去销售量。换句话说,对于大于1的次数:

库存(时间,产品)=库存(时间-1,产品)+生产(时间,产品)-销售(时间,产品)

这个等式意味着存货是在这个时期的末期计算的。问题中的时间段如下。

月份=blendDemand.Properties.RowNames;n月=长度(月);

初始库存影响在时间1,如下所示的库存。

存货(1,产品)=初始存货(产品)+生产(1,产品)-销售(1,产品)

初始库存在数据中blendInventory{'Initial',:}. 最终的库存在数据中blendInventory { '最终',:}.

假设未满足的需求消失了。换句话说,如果您不能在一个时间段内完成所有订单,多余的订单将不会转入下一个时间段。

优化问题公式

这个问题的目标函数是利润,你想要最大化它。因此,在基于问题的框架中创建一个最大化问题。

inventoryProblem = optimproblem(“客观感觉”,“最大化”);

对于这个问题的变量是肥料共混物的数量,你让每个月出售,而原材料,你使用,使这些混合物。在上界出售是需求,,blendDemand,用于每个时间段和每个肥料混合物。

make=optimvar(“制造”,月,混纺,“LowerBound”,0);sell=optimvar(“出售”,月,混纺,“LowerBound”0,“上限”,blendDemand {个月,共混物});使用= optimvar(“使用”,月原糖,混纺,“LowerBound”,0);

另外,每次创建一个表示库存的变量。

存货=最优值(“库存”,月,混纺,“LowerBound”0,“上限”,存货能力);

用问题变量来计算目标函数,计算收入和成本。收入是每一种肥料混合物的销售量乘以价格,加上所有时间段和混合物。

收入=总和(blendPrice{1,}。*总和(销售(月,混合),1));

配料成本是指在所有时间段内每次使用的每种配料的成本。由于每次使用的量被划分为每种混合物的使用量,因此也可以在混合物中添加。

blendsUsed =总和(使用(月,画,混合),3);ingredientCost =总和(总和(rawCost{月,画}。* blendsUsed));

存储成本是用于存储库存在每个时间段期间,加入随时间和共混物的成本。

storageCost = inventoryCost *总和(库存(:));

现在把目标函数进客观的通过使用点表示法得到问题的性质。

inventoryProblem.Objective =收入 -  ingredientCost  -  storageCost;

问题约束

这个问题有一些限制。首先,表现在库存公式为一组的问题变量的约束。

materialBalance = optimconstr(月,共混物);timeAbove1 =个月(2:结束);previousTime =个月(1:结束-1);materialBalance(timeAbove1,:) =库存(timeAbove1,:) ==库存(previousTime,:) +...制造(timeAbove1:) -销售(timeAbove1:);materialBalance(1,:) = inventory(1,:) == blendInventory{“初始”,:} +...制造(1,:)-出售(1,:);

同时表示最终库存是固定的约束条件。

finalC = inventory(end,:) == blendInventory{“最后一次”,:};

每次的总库存是有界的。

boundedInv = sum(inventory,2) <= inventoryCapacity;

您可以在每个时间段内生产一定数量的产品。

加工极限=总和(制造,2)<=生产能力;

您每月生产的每种混合物的量就是您使用的原材料量挤压函数将和转换为a尼蒙斯×1逐nblends数组,尼蒙斯——- - - - - -nblends数组中。

rawMaterialUse =挤压(总和(使用(月,原糖,共混物),2))==化妆(月,共混物);

在每个混合物中的营养成分必须具备必要的值。在下面的语句内,乘法rawNutrients {N,原糖} *使用(米,原糖,B)”在每次使用的原材料上添加营养价值。

blendNutrientsQuality = optimconstr(月,营养物,共混物);对于m=1:N个月对于b = 1: nBlends对于n = 1:nNutrients blendNutrientsQuality(m,n,b) = rawNutrients{n,raws}*use(m,raws)' == blendNutrients{n,b}*make(m,b);结束结束结束

地点的限制进入的问题。

inventoryProblem.Constraints.materialBalance = materialBalance;inventoryProblem.Constraints.finalC = finalC;inventoryProblem.Constraints.boundedInv = boundedInv;inventoryProblem.Constraints.processLimit = processLimit;inventoryProblem.Constraints.rawMaterialUse = rawMaterialUse;inventoryProblem.Constraints.blendNutrientsQuality = blendNutrientsQuality;

解决问题

问题公式已完成。请解决问题。

[sol,fval,exitflag,output]=解决(库存问题)
使用linprog解决问题。找到最优解。
索尔=结构体字段:库存:[12x2 double] make: [12x2 double] sell: [12x2 double] use: [12x6x2 double]
fval=2.2474e+06
exitflag = OptimalSolution
输出=结构体字段:迭代次数:162次:5.4570e-12消息:“找到最佳解决方案”。算法:“双单纯形”firstorderopt:6.5235e-12解算器:“linprog”

以表格和图形形式显示结果。

如果exitflag>0 fprintf('利润:%克\ N', fval);市场= array2table (sol.make,“RowNames”,月,“变化无常”, strcat (“制造”共混物);sellT=阵列2表(sol.sell,“RowNames”,月,“变化无常”, strcat (“出售”、混合));storeT = array2table (sol.inventory,“RowNames”,月,“变化无常”, strcat ('店铺'共混物);productionPlanT=[makeT sellT storeT]图子地块(3,1,1)条形图(sol.make)图例('均衡',“高”,'地点','eastoutside')标题(“数量”)子地块(3,1,2)条形图(sol.sell)图例('均衡',“高”,'地点','eastoutside')标题(“售出金额”)副区(3,1,3)巴(sol.inventory)图例('均衡',“高”,'地点','eastoutside')标题(“存储量”)xlabel(“时间”)结束
利润:2.24739 e + 06
productionPlanT =12×6表平衡的makemamamamakemamamamamamamamamamakemamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamama卖卖卖卖卖卖卖平衡卖卖卖卖卖卖卖卖卖高高高卖商店商店商店商店商店商店平衡商店商店商店商店商店平衡商店商店商店商店商店商店商店商店平衡平衡商店商店商店商店商店商店商店商店商店商店商店商店商店商店商店商店商店商店商店平衡的平衡商店商店卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖卖700 300 0 7月700 200 200 0 8月600 60020000年9月60020060020000年10月55020055020000年11月55020055020000年12月750400550200200

图中包含3个轴。标题金额已生成的轴1包含2个条形图类型的对象。这些对象表示平衡的HighN。标题金额已售出的轴2包含2个条形图类型的对象。这些对象表示平衡的HighN。标题金额已存储的轴3包含2个条形图类型的对象。这些对象表示平衡的HighN。

相关话题