混合整数线性规划基础:基于问题的gydF4y2Ba
这个例子展示了如何解决一个混合整数线性问题。虽然并不复杂,但该示例显示了使用基于问题的方法来制定问题的典型步骤。有关显示此示例的视频,请参见gydF4y2Ba用优化建模方法求解一个混合整数线性规划问题gydF4y2Ba.gydF4y2Ba
有关此问题的基于求解器的方法,请参见gydF4y2Ba混合整数线性规划基础:基于求解器gydF4y2Ba.gydF4y2Ba
问题描述gydF4y2Ba
你想要混合各种化学成分的钢,以获得25吨具有特定化学成分的钢。结果应该有5%的碳和5%的钼的重量,这意味着25吨*5% = 1.25吨碳和1.25吨钼。目标是将钢的混合成本降到最低。gydF4y2Ba
这个问题是Carl-Henrik Westerberg, Bengt Bjorklund和Eskil Hultman提出的gydF4y2Ba混合整数规划在瑞典某钢厂的应用gydF4y2Ba《界面》1977年2月卷7号第2页39-43,其摘要载于gydF4y2Bahttps://doi.org/10.1287/inte.7.2.39gydF4y2Ba.gydF4y2Ba
有四块钢锭可供购买。每种钢锭只能有一个。gydF4y2Ba
合金钢有三种等级,废钢有一种等级可供购买。合金钢和废钢可以少量购买。gydF4y2Ba
制定问题gydF4y2Ba
为了阐明这个问题,首先要确定控制变量。把变量gydF4y2Ba锭(1)= 1gydF4y2Ba
意思是你购买元宝gydF4y2Ba1gydF4y2Ba,gydF4y2Ba锭(1)= 0gydF4y2Ba
意思是你不买钢锭。同样,变量gydF4y2Ba锭(2)gydF4y2Ba
通过gydF4y2Ba锭(4)gydF4y2Ba
二进制变量是否表示你是否购买了锭gydF4y2Ba2gydF4y2Ba通过gydF4y2Ba4gydF4y2Ba.gydF4y2Ba
变量gydF4y2Ba合金(1)gydF4y2Ba
通过gydF4y2Ba合金(3)gydF4y2Ba
数量是以吨为单位的合金吗gydF4y2Ba1gydF4y2Ba,gydF4y2Ba2gydF4y2Ba,gydF4y2Ba3.gydF4y2Ba你买的东西。gydF4y2Ba废gydF4y2Ba
是你购买的废钢的数量。gydF4y2Ba
Steelprob =优化问题;Ingots = optimvar(gydF4y2Ba“锭”gydF4y2Ba4gydF4y2Ba“类型”gydF4y2Ba,gydF4y2Ba“整数”gydF4y2Ba,gydF4y2Ba下界的gydF4y2Ba,0,gydF4y2Ba“UpperBound”gydF4y2Ba1);合金= optimvar(gydF4y2Ba“合金”gydF4y2Ba3,gydF4y2Ba下界的gydF4y2Ba, 0);报废= optimvar(gydF4y2Ba“取消”gydF4y2Ba,gydF4y2Ba下界的gydF4y2Ba, 0);gydF4y2Ba
为与变量相关的成本创建表达式。gydF4y2Ba
weightIngots = [5,3,4,6];成本锭=重量锭。*[350,330,310,280];costalloy = [500,450,400];costScrap = 100;成本=成本铸锭*铸锭+成本合金*合金+成本废铁*废铁;gydF4y2Ba
将成本作为问题的目标函数。gydF4y2Ba
steelprob。目标=成本;gydF4y2Ba
这个问题有三个等式约束。第一个限制是总重量是25吨。计算钢的重量。gydF4y2Ba
总重量=总重量*锭数+总和(合金)+废钢;gydF4y2Ba
第二个限制是碳的重量是25吨的5%,即1.25吨。计算钢中碳的重量。gydF4y2Ba
carbonIngots = [5,4,5,3]/100;carbonalloy = [8,7,6]/100;carbonScrap = 3/100;totalCarbon = (weights tingots .* carbon锭)*锭+ carbonalloy *合金+ carbonScrap*废料;gydF4y2Ba
第三个限制是钼的重量为1.25吨。计算钢中钼的重量。gydF4y2Ba
molybIngots = [3,3,4,4]/100;molybAlloys = [6,7,8]/100;钼废料= 9/100;totalMolyb = (weighttingots .*molybIngots)*锭+ molybAlloys*合金+钼废料*废料;gydF4y2Ba
在问题中包含约束条件。gydF4y2Ba
steelprobe . constraints .conswt = totalWeight == 25;steelprobe . constraints .conscarb = totalCarbon == 1.25;steelprobe . constraints .consmolyb = totalMolyb == 1.25;gydF4y2Ba
解决问题gydF4y2Ba
现在您有了所有的输入,调用求解器。gydF4y2Ba
[sol,fval] = solve(steelprob);gydF4y2Ba
使用intlinprog解决问题。LP:最优目标值为8125.600000。切割生成:应用3 mir切割。下界为8495.000000。相对差距为0.00%。找到最优解。Intlinprog停止在根节点,因为目标值在最佳值的间隙公差范围内,选项。AbsoluteGapTolerance = 0(默认值)。intcon变量是公差范围内的整数,选项。IntegerTolerance = 1e-05(默认值)。gydF4y2Ba
查看解决方案。gydF4y2Ba
sol.ingotsgydF4y2Ba
ans =gydF4y2Ba4×1gydF4y2Ba1.0000 1.0000 0 1.0000gydF4y2Ba
sol.alloysgydF4y2Ba
ans =gydF4y2Ba3×1gydF4y2Ba7.2500 0 0.2500gydF4y2Ba
sol.scrapgydF4y2Ba
Ans = 3.5000gydF4y2Ba
fvalgydF4y2Ba
Fval = 8.4950e+03gydF4y2Ba
最理想的购买价格是8495美元。买锭gydF4y2Ba1gydF4y2Ba,gydF4y2Ba2gydF4y2Ba,gydF4y2Ba4gydF4y2Ba,但不是gydF4y2Ba3.gydF4y2Ba,并购买7.25吨合金gydF4y2Ba1gydF4y2Ba, 0.25吨合金gydF4y2Ba3.gydF4y2Ba以及3.5吨废钢。gydF4y2Ba