在经营管理中,为取得更高的利润,不仅需要提高经营收入,也要考虑如何在现有的人力、物力和财力条件下合理安排,在满足要求的前提下,达到最低的成本。对于静态的最优化问题(即所有数据不会瞬息万变,可以允许在小范围内有波动),通过设计各类可调用的指标,使目标达到最优。非线性规划具有坚实的数学基础和计算方法,在实际应用中有很高的价值。
下面我们用一个例子来讲解非线性规划方法,可能有点像一道数学题,但是忽略这些形式的东西吧,学到知识才是最重要的。
课题名称:制定轰炸方案
设一个战略轰炸机群奉命携带A,B种型号的炸弹轰炸敌军的四个重要目标。为完成好此项任务要求飞机的耗油量不超过2700L,炸弹A和B都不超过4枚。已知飞机携带A型炸弹时每升油料可飞行2km,携带B型炸弹时每升油料可飞行3km,空载时每升油料可飞行4km,每次起降各耗油100L.又知每架飞机每次只能携带一枚炸弹。有关参数如表1所示。现在的问题是:如何制定轰炸方案,使摧毁目标的可能性最大?
表1 轰炸方案问题的有关数据
目标 | 距离/km | 摧毁目标的可能性 | |
A | B | ||
Ⅰ | 640 | 0.65 | 0.76 |
Ⅱ | 850 | 0.50 | 0.70 |
Ⅲ | 530 | 0.56 | 0.72 |
Ⅳ | 72 | 0.68 | 0.66 |
下面开始制定我们的方案,当然,实际应用中的数据并不会这么完美的量化,具体量化的方法有很多,可能黄小技术包以后会整理一下,但是现在,我们先来看看这个方案怎么制定吧。
制定方案无非就是分别向4个目标投掷 A or B 炸弹多少枚,可以使摧毁目标的可能性最大。这里是有限制的,比如炸弹数量,比如总油量,下面我们先看看飞机携带一枚炸弹炸毁一个目标的耗油问题吧。
第一步:计算飞机携带 A or B 炸弹分别摧毁4个目标所需要的油量
炸毁目标Ⅰ:A型(640/2+640/4+200)=680.0 B型(640/3+640/4+200)=573.3
炸毁目标Ⅱ:A型(850/2+850/4+200)=837.5 B型(850/3+850/4+200)=695.8
炸毁目标Ⅲ:A型(530/2+530/4+200)=597.5 B型(530/3+530/4+200)=509.2
炸毁目标Ⅳ:A型(72/2+72/4+200)=254.0 B型(72/3+72/4+200)=242.0
第二步:构造该问题的数学模型
设:向目标Ⅰ,Ⅱ,Ⅲ,Ⅳ分别投掷A型炸弹 x11, x12, x13, x14 枚,B型 x21, x22, x23, x24 枚;
每一个目标不被摧毁的可能性为Z;则该问题的数学模型为:
第三步:程序运行求解
当然这里我们可以按照考试一样手动计算,但是现在都什么年代了,各种编程语言也该利用起来了。下面是用lingo编写的,当然你也可以用matlab、R、python等等。
lingo程序:
model:
sets:
num_i/1..4/:a,b,s;
num_j/1,2/;
link_ij(num_j,num_i):x;
endsets
data:
s=640,850,530,72;a=0.65,0.50,0.56,0.68;b=0.76,0.70,0.72,0.66;
enddata
[OBJ]min=@sum(num_i(i):(1-a(i))^(x(1,i))*(1-b(i))^(x(2,i)));
(3/4)*@sum(num_i(i):s(i)*x(1,i))+(7/12)*@sum(num_i(i):s(i)*x(2,i))+100*@sum(link_ij(j,i):x(j,i))<=2700;
x(1,1)+x(1,2)+x(1,3)+x(1,4)<=4;
x(2,1)+x(2,2)+x(2,3)+x(2,4)<=4;
@for(num_i(i):x(1,i)+x(2,i)>=1;x(1,i)+x(2,i)<=2;);
@for(link_ij(j,i):x(j,i)>=0;@GIN(x(j,i)););
end
运行结果:
Local optimal solution found.Objective value: 0.7124000Objective bound: 0.7124000Infeasibilities: 0.000000Extended solver steps: 21Total solver iterations: 2063Elapsed runtime seconds: 1.27Model Class: PINLPTotal variables: 8Nonlinear variables: 8Integer variables: 8Total constraints: 20Nonlinear constraints: 1Total nonzeros: 48Nonlinear nonzeros: 8Variable Value Reduced CostA( 1) 0.6500000 0.000000A( 2) 0.5000000 0.000000A( 3) 0.5600000 0.000000A( 4) 0.6800000 0.000000B( 1) 0.7600000 0.000000B( 2) 0.7000000 0.000000B( 3) 0.7200000 0.000000B( 4) 0.6600000 0.000000S( 1) 640.0000 0.000000S( 2) 850.0000 0.000000S( 3) 530.0000 0.000000S( 4) 72.00000 0.000000X( 1, 1) 0.000000 -0.2519570X( 1, 2) 0.000000 0.000000X( 1, 3) 0.000000 -0.2298741X( 1, 4) 2.000000 0.000000X( 2, 1) 1.000000 0.000000X( 2, 2) 2.000000 0.2965332X( 2, 3) 1.000000 -0.1392208E-01X( 2, 4) 0.000000 0.000000
运行结果解读:
第一行的Objective value直接翻译是目标的值,也就是数学模型中目标函数的最小值,即目标不被摧毁的最小概率是0.7124,因此目标被摧毁的最大概率就是0.7124。
此最大摧毁率对应的方案,查看运行结果中的倒数8行,X(1,4)、X(2,1)、X(2,2)、X(2,3)是投掷炸弹数大于1的X,X(1,4)代表用第一种炸弹(A炸弹)投掷第Ⅳ个目标,投掷数量为2。明白了这个之后,我们就可以得到我们最大摧毁率对应的方案了。
最佳方案:
向目标Ⅰ,Ⅱ,Ⅲ分别投掷 B 型炸弹1,2, 1枚;向目标Ⅳ投掷 A 型炸弹2枚。摧毁率为0.7124。