主要内容

在具体问题具体分析框架创建Multiperiod库存模型

这个例子展示了如何创建一个multiperiod库存模型在具体问题具体分析框架。问题是安排生产的肥料混合在一段时间内使用各种原料的成本取决于时间可预测的。假设你知道提前对化肥的需求。目标是实现利润最大化,同时满足需求,采购原材料的成本和存储肥料。你可以提前确定成本利用期货或其他合同。

化肥和成分

颗粒肥料养分氮(N)、磷(P)和钾(K)。你可以混合以下原材料获得肥料混合与必要的营养素。

负载肥料混合= blendDemand.Properties.VariableNames%化肥生产
混合=1 x2单元格{'平衡'}{' HighN '}
营养= rawNutrients.Properties.RowNames
营养=3 x1细胞' P ' {' N '} {} {“K”}
画= rawNutrients.Properties.VariableNames%的原材料
画=1 x6单元格{“地图”}{“钾肥”}{”一个“}{' '}{TSP的}{“沙子”}

两个肥料混合有相同的营养需求(10% 10% N, P, K重量的10%),除了“HighN”混合额外10% N共20%。

disp (blendNutrients)%百分比表
平衡HighN ________ _____ N 10 20便士10 10 K 10 10

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

disp (rawNutrients)%百分比表
地图钾肥为TSP砂___ _____ _ __ ___ ____ 21 N 11 0 35 0 0 P 48 0 0 0 46 0 K 60 0 0 0 0 0

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

商店的数量每一个变量的数量。

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

预测需求和收入

假设您预先知道的重量(吨)的需求两个肥料混合时间的问题。

disp (blendDemand)
平衡HighN ________ _____ 750年1月300年2月800年350年400年310年600年900年3月850年4月700年5月700年6月300年7月700年200年200年600年8月600年9月200年200年200年550年10月550年11月200 550年12月

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

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月320年8月320 600 300 125 250 80 600 300 125 240 80 320 600 300 125 240 80 9月10月11月310 600 300 125 240 80 310 600 300 125 240 80 600 300 125 240 80 340年12月

存储成本

存储的成本每吨混合肥料应用和每个时期。

disp (inventoryCost)
10

容量约束

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

disp (inventoryCapacity)
1000年

你可以生产总共不超过productionCapacity在任何时间吨。

disp (productionCapacity)
1200年

连接之间的生产、销售和库存

你开始一定量的时间表,或库存,可用的混合肥料。你有一定的目标库存在最后的时期。在每个时期,大量的肥料混合是年底前一段时间,加上生产,数量减去销售数量。换句话说,乘以大于1:

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

这个方程意味着库存数的最后时间。时间的问题如下。

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

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

库存(1、产品)= initialInventory(产品)+生产(产品)销售(产品)

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

假设未满足的需求。换句话说,如果你不能填满所有的订单在一个时间段,多余的订单不会延续到下一个时期。

优化问题制定

这个问题的目标函数是利润,你想最大化。因此,创建一个最大化问题中具体问题具体分析框架。

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

问题的变量数量的肥料混合生产和销售每个月,和你使用的原材料混合。的上限出售的需求,blendDemand每个时间段和每个肥料混合。

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

此外,创建一个变量,代表了在每一次库存。

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

计算问题的目标函数的变量,计算收入和成本。收入是你卖的肥料混合倍价格,增加了所有时间和混合。

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

原料的成本为每个成分在每次使用成本,增加了所有的时间。因为在每次使用数量分为用于每个混合,混合也增加。

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

存储成本是用于存储库存成本在每个时间段,增加了时间和混合。

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

现在把目标函数放入客观的通过使用点符号的属性问题。

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

问题的约束

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

materialBalance = optimconstr(月、混合);timeAbove1 =月(2:结束);previousTime =月(1:end-1);materialBalance (timeAbove1:) =库存(timeAbove1:) = =库存(previousTime:) +制造(timeAbove1:) -销售(timeAbove1:);materialBalance(1) =库存(:1)= = blendInventory {“初始”:}+制造(1:)—销售(1:);

表达约束,最终的库存是固定的。

finalC =库存(最终:)= = blendInventory {“最后一次”,:};

总库存在每个时间是有界的。

boundedInv =总和(库存,2)< = inventoryCapacity;

你可以在每个时间段产生有限。

processLimit =(, 2)和< = productionCapacity;

每个月的数量产生的混合是你使用的原材料的数量。的挤压函数转换的总和nmonths-by-1-by -nblends数组,nmonths——- - - - - -nblends数组中。

rawMaterialUse =挤压(总和(使用(月,画,混合),2))= =(月,混合);

在每个混合必须有必要的营养价值。在接下来的内部声明中乘法rawNutrients {n,画}*使用(m,画,b) '添加了营养值在每一次使用的原材料。

blendNutrientsQuality = optimconstr(个月,营养,混合);m = 1: nMonthsb = 1: nBlendsn = 1: nNutrients blendNutrientsQuality (m, n, b) = rawNutrients {n,画}*使用(m,画,b) = = blendNutrients {n, b} * (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解决问题。找到最优解。
索尔=结构体字段:库存:[12 x2双]:[12 x2双]出售:[12 x2双]使用:[12 x6x2双)
fval = 2.2474 e + 06
exitflag = OptimalSolution
输出=结构体字段:迭代:154 constrviolation: 5.4570 e-12消息:“找到最优解。的算法:对偶单纯形”firstorderopt: 6.5235 e-12解算器:“linprog”

在表格和图形的形式显示结果。

如果exitflag > 0流(“利润:% g \ n”,fval);市场= array2table (sol.make,“RowNames”个月,“VariableNames”,strcat (“使”、混合));sellT = array2table (sol.sell,“RowNames”个月,“VariableNames”,strcat (“卖出”、混合));storeT = array2table (sol.inventory,“RowNames”个月,“VariableNames”,strcat (“存储”、混合));productionPlanT =[市场sellT storeT]图次要情节(3 1 1)酒吧(sol.make)传说(“平衡”,“HighN”,“位置”,“eastoutside”)标题(“数量”次要情节(3、1、2)酒吧(sol.sell)传说(“平衡”,“HighN”,“位置”,“eastoutside”)标题(的销售数量次要情节(3,1,3)酒吧(sol.inventory)传说(“平衡”,“HighN”,“位置”,“eastoutside”)标题(量存储的)包含(“时间”)结束
利润:2.24739 e + 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年8月200年9月600 200 600 200 600 200 0 0 0 0 550年10月200年11月550 200 550 200 550 200 0 0 0 0 400 550 200 200 200 750年12月

图包含3轴对象。坐标轴对象1 2标题数量由包含对象类型的酒吧。这些对象代表平衡,HighN。坐标轴对象2 2标题数量出售包含对象类型的酒吧。这些对象代表平衡,HighN。坐标轴对象3标题数量存储包含2对象类型的酒吧。这些对象代表平衡,HighN。

相关的话题