主要内容

创建初始点优化与命名索引变量

这个例子展示了如何创建一个初始点命名索引变量的优化问题。命名索引变量,通常指定一个初始点的最简单方法是使用findindex函数。

问题是一个multiperiod库存问题,包括混合原料和精制油。利润最大化的目标是受各种限制生产和库存的“硬度”能力和油混合。这个问题来自威廉姆斯[1]。

问题描述

问题涉及到两种类型的生植物油和三种类型的生nonvegetable石油生产商可以提炼成食用油。制造商可以细化到200吨的植物油,和250吨每月nonvegetable油。制造商可以存储每个原料油1000吨,这是有益的,因为采购原料油的成本取决于月以及油的类型。名为“硬度”的质量与每个油相关联。混合油的硬度是组成的线性加权硬度的油。

由于处理的限制,制造商限制油脂精炼的数量在任何一个月不超过三个。同样,如果一个月的石油精炼,至少20吨的石油必须精炼。最后,在一个月内如果精炼植物油,然后nonvegetable石油3也必须细化。

石油收入是一个常数,每吨增加销售。成本是购买油的成本,不同的石油和月和有固定成本每吨每月存储每个石油。没有成本精炼石油,但制造商不能存储成品油(它必须被出售)。

输入问题数据

创建名为索引变量规划时间和油。

个月= {“1月”,“2”,“3”,“4”,“可能”,“6月”};油= {“veg1”,“veg2”,“non1”,“non2”,“非刑”};vegoils = {“veg1”,“veg2”};nonveg = {“non1”,“non2”,“非刑”};

创建变量存储和使用的参数。

maxstore = 1000;%的最大存储每种类型的油maxuseveg = 200;%最大使用植物油maxusenon = 250;%最大nonvegetable油使用minuseraw = 20;%最低原料油使用maxnraw = 3;%最大数量的原料油混合saleprice = 150;%的销售价格细化和混合油storecost = 5;%的存储成本每时期的石油数量stockend = 500;%的股票在开始和结束的问题机构= 3;%最低硬度成品油hmax = 6;%最大硬度的成品油

原料油的硬度指定为这个向量。

h = (8.8、6.1、2、4.2、5.0);

指定这个数组的原料油的成本。数组的每一行表示在一个月内原料油的成本。第一行代表的是1月份的成本,最后一行代表了6月份的成本。

costdata = [110 120 130 110 115 130 130 110 90 115 110 140 130 100 95 120 110 120 120 125 100 120 150 110 105 90 100 140 80 135];

创建变量

创建这些问题变量:

  • 销售,每个月每个石油出售的数量

  • 商店,每个石油存储的数量每个月月底

  • 每个月,每个石油的数量购买

此外,考虑到限制油脂精炼的数量和每个月销售和生产的最小数量,创建一个辅助二进制变量意在1什么时候一个出售石油的一个月。

销售= optimvar (“卖出”,几个月,油,下界的,0);买= optimvar (“买入”,几个月,油,下界的,0);商店= optimvar (“存储”,几个月,油,下界的0,“UpperBound”,maxstore);意在= optimvar (”意在“,几个月,油,“类型”,“整数”,下界的0,“UpperBound”1);

名字每个月销售的石油总量生产

生产=(卖,2)之和;

创建目标

创建问题的目标函数,计算收入,减去成本的采购和储存油。

创建一个最大化的优化问题,包括目标函数的客观的财产。

概率= optimproblem (“ObjectiveSense”,“最大化”);概率。目标=和(saleprice *生产)和(sum (costdata。*买))和(sum (storecost *存储));

客观的表达很长。如果你喜欢,你可以看到它的使用showexpr (prob.Objective)命令。

创建约束

有几个问题需要设置的约束。

6月每个石油存储的数量是500。设置这个约束通过上下界限。

存储(“6月”:)。下界= 500;存储(“6月”:)。UpperBound = 500;

制造商不能完善多maxuseveg植物油在任何一个月。通过设置这个和所有随后的约束约束条件和方程的表达式

vegoiluse =销售(:,vegoils);vegused =总和(vegoiluse, 2) < = maxuseveg;

制造商不能完善多maxusenonnonvegetable石油一个月。

nonvegoiluse =销售(:,nonveg);nonvegused =总和(nonvegoiluse, 2) < = maxusenon;

必须从混合油的硬度机构通过hmax

hardmin =总和(repmat (h、6、1)。*卖,2)> =机构*生产;hardmax =总和(repmat (h、6、1)。*卖,2)< = hmax *生产;

每个石油存储的数量在本月底等于本月初,加上购买,减去销售数量。

:initstockbal = 500 +买(1)= =销售(1:)+存储(1:);stockbal =商店(1:5:)+购买(:2:6)= =销售(:2:6)+存储(:2:6);

如果一个石油精炼的一个月,至少minuseraw的石油必须提炼及销售。

minuse = > = minuseraw卖*意在;

确保意在变量是1对应的石油精炼的确切时间。

maxusev =销售(:,vegoils) < = maxuseveg *意在(:,vegoils);maxusenv =销售(:,nonveg) < = maxusenon *意在(:,nonveg);

制造商可以卖不超过maxnraw每个月的油。

maxnuse =总和(意在,2)< = maxnraw;

如果精炼植物油,油非刑还必须提炼及销售。

deflogic1 =总和(意在(:,vegoils), 2) < =意在(:,“非刑”)*元素个数(vegoils);

包括问题的约束表达式。

prob.Constraints。vegused = vegused;prob.Constraints。nonvegused = nonvegused;prob.Constraints。hardmin = hardmin;prob.Constraints。hardmax = hardmax;prob.Constraints。initstockbal= initstockbal; prob.Constraints.stockbal = stockbal; prob.Constraints.minuse = minuse; prob.Constraints.maxusev = maxusev; prob.Constraints.maxusenv = maxusenv; prob.Constraints.maxnuse = maxnuse; prob.Constraints.deflogic1 = deflogic1;

解决问题

显示最终的区别使用一个初始点,而不是使用一个设置选项,使用启发式。然后解决问题。

选择= optimoptions (“intlinprog”,“启发式”,“没有”);[sol1, fval1 exitstatus1 output1] =解决(概率,“选项”选择)
使用intlinprog解决问题。LP:最优的客观价值是-1.075130 e + 05。减少生成:应用41 Gomory削减,削减2盖,1米尔切,1集团。下界是-1.047522 e + 05。分支界限法:节点总num int整数相对探索时间(s)解决方案fval差距(%)19日0.31 - 1 0.32 -7.190185 4.535003 e + e + 04 01 25 2 -7.205000 e + 04 4.505117 e + 01 25 0.33 3 -8.290000 e + 04 2.606702 e + 01 29 0.33 4 -8.775370 e + 04 1.909426 e + 01 40 0.34 5 -9.937870 e + 04 5.163142 e + 00 91 0.37 -9.987222 4.643483 e + e + 04 00 105 0.37 -1.002139 4.286718 e + e + 05 00 630 0.55 1112 -1.002787 e + 05年2.283810 e + 00 0.68 8 -1.002787 e + 05年0.000000 e + 00找到最优解。Intlinprog停止因为客观价值差距公差内的最优值,选择。AbsoluteGapTolerance = 0(默认值)。在宽容intcon变量是整数,选项。IntegerTolerance = 1 e-05(默认值)。
sol1 =结构体字段:买(x5 6双):意在:[6 x5双]出售:[6 x5双]存储:[6 x5双)
fval1 = 1.0028 e + 05
exitstatus1 = OptimalSolution
output1 =结构体字段:relativegap: 0 absolutegap: 0 numfeaspoints: 8 numnodes: 1112 constrviolation: 1.1867 e-11信息:最优解发现....“解决者:“intlinprog”

使用初始点

对于这个问题,使用一个初始点可以保存和迭代。创建一个初始点正确的尺寸。

x0。买= zeros(size(buy)); x0.induse = zeros(size(induse)); x0.store = zeros(size(store)); x0.sell = zeros(size(sell));

设置初始点只卖出植物油veg2和nonvegetable石油非刑。设置适当的初始点,使用findindex函数。

numMonths =大小(意在,1);[idxMonths, idxOils] = findindex(意在,1:numMonths, {“veg2”,“非刑”});x0.induse (idxMonths idxOils) = 1;

满足最大的蔬菜和nonvegetable石油约束。

x0.sell (:, idxOils) = repmat (numMonths [200250], 1)
x0 =结构体字段:买(x5 6双):意在:[6 x5双]存储:[6 x5双]出售:[6 x5双)

设置初始点购买没有石油的第一个月。

:x0.buy (1) = 0;

满足initstockbal约束的基于初始存储第一个月500每个油类型,和没有购买第一个月,不断的使用veg2非刑

:x0.store (1) = (500 300 500 500 250);

满足剩余的库存余额限制stockbal使用findindex函数。

[idxMonths, idxOils] = findindex(存储、2:6 {“veg2”});x0.store (idxMonths idxOils) = [100; 0, 0, 0; 500);[idxMonths, idxOils] = findindex(存储、2:6 {“veg1”,“non1”,“non2”});x0.store (idxMonths idxOils) = 500;[idxMonths, idxOils] = findindex(存储、2:6 {“非刑”});x0.store (idxMonths idxOils) = (0, 0, 0, 0, 500);[idxMonths, idxOils] = findindex(购买,2:6,{“veg2”});x0.buy (idxMonths idxOils) = 0; 100; 200; 200; 700);[idxMonths, idxOils] = findindex(购买,2:6,{“非刑”});x0.buy (idxMonths idxOils) = 0; 250; 250; 250; 750);

检查初始点是可行的。因为有不同尺寸的约束,设置cellfunUniformOutput名称-值对当检查的不可行性。

正{1}=不可行性(x0 vegused);正{2}=不可行性(x0 nonvegused);正{3}=不可行性(x0 hardmin);正{4}=不可行性(x0 hardmax);正{5}=不可行性(x0 initstockbal);正{6}=不可行性(x0 stockbal);正{7}=不可行性(x0 minuse);正{8}=不可行性(x0 maxusev);正{9}=不可行性(x0 maxusenv);正{10}=不可行性(x0 maxnuse); inf{11} = infeasibility(deflogic1,x0); allinfeas = cellfun(@max,inf,“UniformOutput”、假);anyinfeas = cellfun (@max allinfeas);disp (anyinfeas)
0 0 0 0 0 0 0 0 0 0 0

所有的不可行性是零,这表明,起始点是可行的。

使用起始点重新运行问题。

[sol2, fval2 exitstatus2 output2] =解决(x0,概率“选项”选择)
使用intlinprog解决问题。LP:最优的客观价值是-1.075130 e + 05。减少生成:应用41 Gomory削减,削减2盖,1米尔切,1集团。下界是-1.047522 e + 05。相对差距是166.88%。分支界限法:节点总num int整数相对探索时间(s)解决方案fval差距15 0.29 - 2 (%)-7.190185 e + 04 4.535003 e + 01 21 0.30 3 -8.290000 e + 04 2.606702 e + 01 25 0.31 4 -8.775370 e + 04 1.909426 e + 01 30 0.31 5 -9.953889 e + 04 4.993907 e + 00 56 0.33 6 -9.982870 e + 04 4.689100 e + 00 138 0.37 1114 -1.002787 e + 05年3.851839 e + 00 0.65 7 -1.002787 e + 05年0.000000 e + 00找到最优解。Intlinprog停止因为客观价值差距公差内的最优值,选择。AbsoluteGapTolerance = 0(默认值)。在宽容intcon变量是整数,选项。IntegerTolerance = 1 e-05(默认值)。
sol2 =结构体字段:买(x5 6双):意在:[6 x5双]出售:[6 x5双]存储:[6 x5双)
fval2 = 1.0028 e + 05
exitstatus2 = OptimalSolution
output2 =结构体字段:relativegap: 0 absolutegap: 0 numfeaspoints: 7 numnodes: 1114 constrviolation: 1.7580 e-12信息:最优解发现....“解决者:“intlinprog”

这一次,解决减少了和步骤来找到解决方案。

流([“使用初始点了% d和步骤,而是要“,使用没有初始点了% d步骤。”),output2.numnodes output1.numnodes)
使用初始点了1114和步骤,但没有使用初始点了1112步。

参考

[1]威廉姆斯,h·保罗。数学规划模型的建筑。第四版。j·威利奇切斯特,英国。问题12.1,“食品Manufacture1。”1999.

另请参阅

|

相关的话题