主要内容

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

此示例在基于问题的框架中显示了如何在基于问题的框架中创建多极库存模型。问题是使用各种成分在一段时间内安排肥料共混物的生产,其成本以可预测的方式依赖于时间。假设您提前知道对肥料的需求。目标是在满足需求的同时最大化利润,其中成本用于购买原料成分和储存肥料随着时间的推移。您可以使用期货或其他合同提前确定成本。

化肥和成分

粒状肥料具有营养氮(N),磷(P)和钾(K)。您可以将以下原料混合以获得具有必要营养素的肥料混合物。

负载肥料混合= blendDemand.Properties.VariableNames%肥料生产
混合=1x2细胞{'balanced'} {'highn'}
营养素= rawnutries.properties.rownames.
营养=3x1细胞' P ' {' N '}{}{“K”}
画= rawNutrients.Properties.VariableNames% 原料
画=1 x6单元格{'MAP'} {'Potash'} {'AN'} {'AS'} {'TSP'} {'Sand'}

两种肥料共混物具有相同的营养要求(10%N,10%P和10%K重量),除了“高”共混物另外10%N,总共20%N。

DISP(粉碎)表格以百分比表示
平衡HighN ________ _____ N 10 20 P 10 10 K 10 10

原料具有以下名称和营养百分比重量。

disp (rawNutrients)表格以百分比表示
MAP钾肥AN AS TSP Sand ___ ______ ____ ___ ____ N 11 0 35 21 0 0 P 48 0 0 46 0 K 0 60 0 0 0 0

原料沙子没有营养素。如有必要,沙子稀释其他成分,以获得重量的必要百分比的营养素。

将这些数量中的每一个存储在变量中。

nblends =长度(混合);nraws =长度(原始);nnuririents =长度(营养素);

预测需求和收入

假设您提前知道了问题发生期间两种化肥混合物的重量(吨)需求。

disp (blendDemand)
平衡HighN ________ _____一月750 300二月800 310三月900 600四月850 400五月700 350六月700 300七月700 200八月600 200九月600 200十月550 200十一月550 200十二月550 200

您知道每吨销售肥料混合的价格。每吨这些价格不依赖于时间。

disp (blendPrice)
平衡HighN ________ _____ 400 550

原材料价格

假设你提前知道原料的吨数价格。根据下表,每吨的价格取决于时间。

disp (rawCost)
地图钾肥TSP沙子  ___ ______ ___ ___ ___ ____ 630年1月360年2月350 610 300 135 250 80 300 140 275 80 350 630 300 135 275 80 3月350年4月320年5月610 300 125 250 80 600 300 125 250 80 320 600 300 125 250 80 6月7月8月320 600 300 125 250 80 320 600 300 125 240 80 320 600 300 125 240 80 9月10月310 600 300 125 24080 11月310 600 300 125 240 80 12月340 600 300 125 240 80

储存成本

混合肥料的储存成本适用于每吨和每一时期。

DISP(库存)
10

容量约束

你只能储存库存处理空间在任何时间段都有吨的总肥料混合。

disp (inventoryCapacity)
1000

你可以生产总共不超过生产能力吨在任何时期。

disp (productionCapacity)
1200

生产、销售和库存之间的联系

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

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

该方程意味着库存在时间段结束时计算。问题中的时间段如下。

个月= blendDemand.Properties.RowNames;nMonths =长度(个月);

初始库存对时间1的库存影响如下。

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

初始库存在数据中blendInventory{“初始”:}.最后的库存在数据中blendInventory{“最终”:}

假设未满足的需求丢失。换句话说,如果无法在时间段填充所有订单,则超额订单不会进入下次时段。

优化问题制定

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

inventoryProblem = optimproblem (“ObjectiveSense”'最大化');

这个问题的变量是你每个月生产和销售的混合肥料的数量,以及你用来混合肥料的原料。上限值的需求,blendDemand,每一段时间和每一种肥料混合。

使= optimvar (“使”,几个月,混合,下界的, 0);销售= optimvar (“卖出”,几个月,混合,下界的,0,“UpperBound”blendDemand{月,混合});使用= optimvar (“使用”,月,画,混合,下界的, 0);

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

库存= optimvar ('存货',几个月,混合,下界的,0,“UpperBound”, inventoryCapacity);

要在问题变量方面计算目标函数,计算收入和成本。收入是您销售每种肥料融合倍率的金额,在所有时间段和混合中添加。

收入= sum(BlendPrice {1,:}。*和(卖出(月,混合),1));

配料成本是指每次使用的每一种配料的成本,加上所有时间段。因为每次使用的量被分割成每次混合使用的量,也加在混合的量上。

Blendsused = Sum(使用(月,原始,混合),3);IngredientCost = Sum(和(Rawcost {个月,Raws}。* Blendsed));

存储成本是在每个时间段内存储存货的成本,随时间增加并混合。

Storagecost = InventoryCost * Sum(库存(:));

现在把目标函数放入客观的用点符号表示问题的性质。

inventoryProblem。客观的= revenue - ingredientCost - storageCost;

问题的约束

这个问题有几个限制条件。首先,将库存方程表示为问题变量的约束集。

materialBalance = optimconstr(月、混合);timeAbove1 =月(2:结束);previousTime =月(1:end-1);materialBalance(timeAbove1,:) = inventory(timeAbove1,:) == inventory(previousTime,:) +...make(timeabove1,:)  - 卖(timeabove1,:);ProMementBalance(1,:)=库存(1,:) == Blendinventory {'最初的':} +...制造(1:)—销售(1:);

表达最终库存的限制也是固定的。

finalc =库存(结束,:) == blendinventory {'最终的',:};

每次的总库存都被束缚。

BUNDEDINV = SUM(库存,2)<=库存处理;

您可以在每次期间产生有限的金额。

processLimit = sum(make,2) <= productionCapacity;

你每个月生产的每种混合物的数量就是你使用的原材料的数量。的挤压函数将总和转换为anmonths-by-1-by -nblends阵列到A.nmonths-经过-nblends大批。

rawMaterialUse = squeeze(sum(use(months,raws,共混),2))== make(months,共混);

每种混合物中的营养成分都必须具有必要的价值。在下面的内部语句中,乘法运算rawNutrients {n,画}*使用(m,画,b) '每次添加的营养价值超过使用的原材料。

blendNutrientsQuality = optimconstr(个月,营养,混合);m = 1: nMonthsb = 1:nblendsn = 1:nnuririents blendnutersquality(m,n,b)= rawnutrients {n,raws} *使用(m,Raws,b)'== blendnutients {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;

解决问题

问题的表述已经完成了。解决这个问题。

[溶胶,fval exitflag、输出]=解决(inventoryProblem)
使用linprog解决问题。找到最佳解决方案。
sol =结构与字段:库存:[12x2双]制作:[12x2双]卖:[12x2双]使用:[12x6x2双]
fval = 2.2474 e + 06
ExitFlag = OptimalAllyolution.
输出=结构与字段:迭代:154构造:5.4570e-12信息:“找到了最佳解决方案。第一个算法:6.5235e-12 solver: 'linprog'

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

如果Exitflag > 0 fprintf(“利润:% g \ n”,fval);maket = Array2Table(Sol.Make,“RowNames”个月,“VariableNames”,Strcat(“使”、混合));sellT = array2table (sol.sell,“RowNames”个月,“VariableNames”,Strcat(“卖出”、混合));Storet = Array2Table(Sol.Inventory,“RowNames”个月,“VariableNames”,Strcat(“存储”、混合));productionPlanT = [makeT sellT storeT] figure subplot(3,1,1) bar(sol.make) legend(“平衡”“HighN”“位置”“eastoutside”) 标题('制作金额') subplot(3,1,2) bar(sol.sell) legend(“平衡”“HighN”“位置”“eastoutside”) 标题(的销售数量) subplot(3,1,3) bar(sol.inventory) legend(“平衡”“HighN”“位置”“eastoutside”) 标题(量存储的)包含(“时间”结束
利润:2.24739E + 06
ProductionPlant =12×6表makeBalanced makeHighN sellBalanced sellHighN storeBalanced storeHighN  ____________ _________ ____________ _________ _____________ __________ 1100年1月600年2月100 750 300 550 0 310 800 310 350 0 600年3月550 650 900 0 850年4月350年5月700 350 700 350 850 400 0 0 0 0 700年6月200年7月700 200 700 300 700 300 0 0 0 0 600 200 600 8月200 00 9月600 200 600 200 00 10月550 200 550 200 00 11月550 200 550 200 00 12月750 400 550 200 200 200 200 200

图中包含3个轴对象。标题为“制造数量”的轴对象1包含2个类型为bar的对象。这些对象代表平衡,HighN。标题为“售出数量”的轴对象2包含2个类型为bar的对象。这些对象代表平衡,HighN。标题为Amount Stored的轴对象3包含2个bar类型的对象。这些对象代表平衡,HighN。

相关的话题