主要内容

创建基于问题框架多期的库存模型

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

肥料和配料

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

加载肥料共混物= blendDemand.Properties.VariableNames%肥料生产
混合=1x2细胞{'balanced'} {'highn'}
营养素= rawnutries.properties.rownames.
营养素=3x1细胞{ 'N'} { 'P'} { 'K'}
原糖= rawNutrients.Properties.VariableNames% 原料
原糖=1X6细胞{ 'MAP'} { '钾肥'} { '一个'} { 'AS'} { 'TSP'} { '砂土'}

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

DISP(粉碎)%表是个
均衡HighN ________ _____ N 10 20 P10中为10K 10 10

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

DISP(rawNutrients)%表是个
MAP钾肥AN AS TSP砂___ ______ __ ___ ____ N 11 0 35 21 0 0 P 48 0 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)
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(库存)
10.

能力约束

你可以存储不超过库存处理空间在任何时间段都有吨的总肥料混合。

DISP(inventoryCapacity)
1000

你可以生产总共不超过生产能力吨的任何时间段。

DISP(productionCapacity)
1200.

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

你有一定的量,或库存,速效肥混合的开始时间表。你有一定的目标,这在库存的最后期限。在每个时间段,肥料掺合物的量是在先前的时间段结束时的量,再加上产生的量,减去售出的量。换句话说,对于次大于1:

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

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

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

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

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

初始库存是在数据blendInventory { '初始' ,:}。最后的库存数据blendInventory { '最终',:}

假设未满足的需求丢失。换句话说,如果你不能填写一个时间段的所有订单,订单过剩不会延续到下一个时间段。

优化问题描述

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

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

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

使= optimvar('制作',月,混纺,“下界”,0);卖= optimvar('卖',月,混纺,“下界”,0,“上界”,blendDemand {个月,共混物});使用= optimvar('用',月原糖,混纺,“下界”,0);

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

库存= optimvar('存货',月,混纺,“下界”,0,“上界”,inventoryCapacity);

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

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

成分的成本是针对每个时间在所使用的每个成分的成本,增加了超过所有时间段。因为每次在所使用的量被分离成用于每个共混物中的量,还可以添加在共混物。

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

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

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

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

inventoryProblem.Objective =收入 -  ingredientCost  -  storageCost;

问题约束

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

materialBalance = optimconstr(月,共混物);timeAbove1 =个月(2:结束);previousTime =个月(1:结束-1);materialBalance(timeAbove1,:) =库存(timeAbove1,:) ==库存(previousTime,:) +......make(timeabove1,:)  - 卖(timeabove1,:);ProMementBalance(1,:)=库存(1,:) == Blendinventory {'最初的',:} +......化妆(1,:)  - 卖(1,:);

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

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

每次的总库存都被束缚。

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

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

processLimit =总和(化妆,2)<= productionCapacity;

你生产的每个交融的每月总的意思是,你使用的原材料的量。这函数将总和转换为anmonths×1逐nblends阵列到A.nmonths-经过-nblends大批。

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

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

blendNutrientsQuality = optimconstr(月,营养物,共混物);为了m = 1时:nMonths为了b = 1:nblends为了n = 1时:nNutrients blendNutrientsQuality(M,N,B)= {rawNutrients N,原糖} *使用(米,原糖,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解决问题。找到最佳解决方案。
sol =结构与字段:库存:[12x2双]制作:[12x2双]卖:[12x2双]使用:[12x6x2双]
FVAL = 2.2474e + 06
ExitFlag = OptimalAllyolution.
输出=结构与字段:迭代:162 constrviolation:5.4570e-12信息: '最优解找到。'算法: '双单工' firstorderopt:6.5235e-12解算器: 'linprog'

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

如果exitflag> 0 fprintf中('利润:%克\ 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]图副区(3,1,1)巴(sol.make)图例('均衡''HighN''地点''eastoutside') 标题('制造金额')副区(3,1,2)巴(sol.sell)图例('均衡''HighN''地点''eastoutside') 标题(“销售金额”)副区(3,1,3)巴(sol.inventory)图例('均衡''HighN''地点''eastoutside') 标题(“金额存储”)Xlabel('时间'结尾
利润:2.24739E + 06
ProductionPlant =12×6表makeBalanced makeHighN sellBalanced sellHighN storeBalanced storeHighN ____________ _________ ____________ _________ _____________ __________ 1100年1月100 750 300 550 0二月600 310 800 310 350 0三月550 650 900 600 0 50月850 350 850 400 0 0月700 350 700 350 0 0六月700 300700 300 0 0 700月200 700 200 0 0 600月200 600 200 0 0 600月200 600 200 0 0 550月200 550 200 0 0 550月200 550 200 0 0 750月400 550 200 200 200

图含有3轴。轴1标题数额上载型棒的2个对象。这些对象代表平衡,HighN。轴2共售出标题金额包含式酒吧的2个对象。这些对象代表平衡,HighN。轴3与存储标题金额包含类型栏2个对象。这些对象代表平衡,HighN。

相关话题