混合整数线性规划基础:基于求解器
这个例子展示了如何求解一个混合整数线性规划。示例并不复杂,但它展示了用语法表述问题的典型步骤intlinprog
.
有关此问题的基于问题的方法,请参见混合整数线性规划基础:基于问题的.
问题描述
你想要混合各种化学成分的钢,以获得25吨具有特定化学成分的钢。结果应该有5%的碳和5%的钼的重量,这意味着25吨*5% = 1.25吨碳和1.25吨钼。目标是将钢的混合成本降到最低。
这个问题是Carl-Henrik Westerberg, Bengt Bjorklund和Eskil Hultman提出的混合整数规划在瑞典某钢厂的应用《界面》1977年2月卷7号第2页39-43,其摘要载于http://interfaces.journal.informs.org/content/7/2/39.abstract
.
有四块钢锭可供购买。每种钢锭只能有一个。
锭 | 重量(吨) | %碳 | %钼 | 成本/吨 |
---|---|---|---|---|
1 | 5 |
5 |
3. |
350美元 |
2 | 3. |
4 |
3. |
330美元 |
3. | 4 |
5 |
4 |
310美元 |
4 | 6 |
3. |
4 |
280美元 |
合金钢有三种等级可供购买,废钢有一种等级可供购买。合金钢和废钢可以少量购买。
合金 | %碳 | %钼 | 成本/吨 |
---|---|---|---|
1 | 8 |
6 |
500美元 |
2 | 7 |
7 |
450美元 |
3. | 6 |
8 |
400美元 |
废 | 3. |
9 |
100美元 |
为了阐明这个问题,首先要确定控制变量。把变量X (1) = 1
意思是你购买元宝1,X (1) = 0
意思是你不买钢锭。同样,变量x (2)
通过x (4)
二进制变量是否表示您购买了锭2通过4.
变量x (5)
通过x (7)
数量是以吨为单位的合金吗1,2,3.你购买,然后x (8)
是你购买的废钢数量。
MATLAB配方
通过指定输入来阐明问题intlinprog
.相关的intlinprog
语法如下。
[x,fval] = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)
为创建输入intlinprog
从第一(f
)到最后(乌兰巴托
).
f
是成本系数的向量。表示铸锭成本的系数是铸锭重量乘以每吨成本。
F = [350*5,330*3,310*4,280*6,500,450,400,100];
整数变量是前四个。
Intcon = 1:4;
提示
若要指定二进制变量,请将变量设置为中的整数intcon
,给它们一个下界0
的上界1
.
没有线性不等式约束,所以一个
而且b
为空矩阵([]
).
有三个等式约束。首先,总重量是25吨。
5 * x (1) + 3 * x (2) + 4 * x (3) + 6 * x (4) + (5) + x (6) + x (7) + (8) = 25
.
第二个限制是碳的重量是25吨的5%,即1.25吨。
5 * 0.05 * (1) + 3 * 0.04 * x (2) + 4 * 0.05 * x (3) + 6 * 0.03 * (4)
.
+ 0.08 * 0.07 x (5) + * x (6) + 0.06 * (7) x (8) = 1.25 + 0.03 *
第三个限制是钼的重量为1.25吨。
5 * 0.03 * (1) + 3 * 0.03 * x (2) + 4 * 0.04 * x (3) + 6 * 0.04 * (4)
.
+ 0.06 * 0.07 x (5) + * x (6) + 0.08 * (7) x (8) = 1.25 + 0.09 *
在矩阵形式下,Aeq*x = beq
,在那里
Aeq = [5,3,4,6,1,1,1,1;5 * 0.05, 3 * 0.04, 4 * 0.05, 6 * 0.03, 0.08, 0.07, 0.06, 0.03;5 * 0.03, 3 * 0.03, 4 * 0.04, 6 * 0.04, 0.06, 0.07, 0.08, 0.09);Beq = [25;1.25;1.25];
每个变量都以0为界。整型变量以1为上界。
Lb = 0 (8,1);Ub = ones(8,1);ub(5:end) = Inf;非整数变量无上限
解决问题
现在您有了所有的输入,调用求解器。
[x, fval] = intlinprog (f intcon [] [], Aeq,说真的,磅,乌兰巴托);
查看解决方案。
x, fval
X = 1.0000 1.0000 0 1.0000 7.2500 0 0.2500 3.5000 fval = 8.4950e+03
最理想的购买价格是8495美元。买锭1,2,4,但不是3.,并购买7.25吨合金1, 0.25吨合金3.以及3.5吨废钢。
集Intcon = []
看不带整数约束的解题效果。解决办法是不同的,而且是不明智的,因为你买不到一个铸锭的零头。