目标函数f(x)和约束条件均是决策变量的线性表达式——解决:单纯形法
min c T x \min c^{T}x mincTx
向量的内积,c=(c1,c2,…,cn)^T, x=(x1,x2,…,xn)^T,n是决策变量。
s . t . { A x < = b A e q ⋅ x = b e q l b < = x < = u b s.t.\left\{\begin{matrix} Ax <= b \\ Aeq\cdot x = beq\\ lb <= x <= ub \end{matrix}\right. s.t.⎩⎨⎧Ax<=bAeq⋅x=beqlb<=x<=ub
s.t.从上至下分别为:
1. 不等式约束
2. 等式约束
3. 上下界约束(也可以当成不等式约束)
注意:可能只对部分决策变量有约束
代码:
[x, fval] = linprog[c, A, b, Aeq, beq, lb, ub, X0]
min z = 0.04 x 1 + 0.15 x 2 + 0.1 x 3 + 0.125 x 4 \min z=0.04x_{1}+0.15x_{2}+0.1x_{3}+0.125x_{4} minz=0.04x1+0.15x2+0.1x3+0.125x4
s . t . { 0.03 x 1 + 0.3 x 2 + 0.15 x 4 > = 32 0.05 x 1 + 0.2 x 3 + 0.1 x 4 = 24 0.14 x 1 + 0.07 x 4 < = 42 x 1 , x 2 , x 3 , x 4 > = 0 s.t.\left\{\begin{matrix} 0.03x_{1}+0.3x_{2}+0.15x_{4} >= 32 \\ 0.05x_{1}+0.2x_{3}+0.1x_{4} = 24\\ 0.14x_{1}+0.07x_{4} <= 42\\ x_{1},x_{2},x_{3},x_{4}>=0 \end{matrix}\right. s.t.⎩⎪⎪⎨⎪⎪⎧0.03x1+0.3x2+0.15x4>=320.05x1+0.2x3+0.1x4=240.14x1+0.07x4<=42x1,x2,x3,x4>=0
用线性代数形式写出目标函数和约束条件
目标函数c:
c = [ 0.04 0.15 0.1 0.125 ] c=\begin{bmatrix} 0.04 \\ 0.15 \\ 0.1 \\ 0.125 \end{bmatrix} c=⎣⎢⎢⎡0.040.150.10.125⎦⎥⎥⎤
x = [ x 1 x 2 x 3 x 4 ] x=\begin{bmatrix} x_{1} \\ x_{2} \\ x_{3} \\ x_{4} \end{bmatrix} x=⎣⎢⎢⎡x1x2x3x4⎦⎥⎥⎤
约束条件:
Matlab代码
c = [0.04 0.15 0.1 0.125]';
A = [-0.03 -0.3 0 -0.15;
0.14 0 0 0.07];
b = [-32 42]';
Aeq = [0.05 0 0.2 0.1];
beq = 24;
lb = [0 0 0 0]';
[x fval] = linprog(c, A, b, Aeq, beq, lb);
%x =
% 0
% 106.6667
% 120.0000
% 0
%
%fval =
% 28
这个题可能有多个解,即有多个x可以使得目标函数的最小值为28(不同版本的到的x值可能不一样,但fval值一定是28)
若无解,则返回x与fval都为空
目标函数f(x)或者约束条件中有一个是决策变量x的非线性表达式——解决:Matlab中有4中方法,在选定决策变量的初始值后,通过一定的搜索方法寻求最优的决策变量
min f ( x ) \min f(x) minf(x)
向量的内积,c=(c1,c2,…,cn)^T, x=(x1,x2,…,xn)^T,n是决策变量。
s . t . { A x < = b , A e q ⋅ x = b e q ( l i n e a r ) c ( x ) < = 0 , c e q ( x ) = 0 ( n o n l i n e a r ) l b < = x < = u b s.t.\left\{\begin{matrix} Ax <= b,Aeq\cdot x = beq (linear) \\ c(x) <= 0,ceq(x) = 0(nonlinear)\\ lb <= x <= ub \end{matrix}\right. s.t.⎩⎨⎧Ax<=b,Aeq⋅x=beq(linear)c(x)<=0,ceq(x)=0(nonlinear)lb<=x<=ub
注意:可能只对部分决策变量有约束
[x fval] = fmincon(@fun, X0, A, b, Aeq, beq, lb, ub, @nonlfun, option)
funciton f = fun(x); f = ......; end;
fun可以任意取名;f也可任意取名,但返回的f函数内部的f要完全一致;治理的x实际上是一个列向量,表示决策变量;调用函数:function(@fun,…)求解。 min f ( x ) = x 1 2 + x 2 2 + x 3 2 + 8 \min f(x) =x_{1}^2+x_{2}^2+x_{3}^2+8 minf(x)=x12+x22+x32+8
向量的内积,c=(c1,c2,…,cn)^T, x=(x1,x2,…,xn)^T,n是决策变量。
s . t . { x 1 2 − x 2 + x 3 2 > = 0 x 1 + x 2 2 + x 3 2 < = 20 − x 1 − x 2 2 + 2 = 0 − x 1 + 2 x 3 2 = 3 x 1 , x 2 , x 3 > = 0 s.t.\left\{\begin{matrix} x_{1}^2-x_{2}+x_{3}^2>=0\\ x_{1}+x_{2}^2+x_{3}^2<=20\\ -x_{1}-x_{2}^2+2=0\\ -x_{1}+2x_{3}^2=3\\ x_{1},x_{2},x_{3}>=0 \end{matrix}\right. s.t.⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x12−x2+x32>=0x1+x22+x32<=20−x1−x22+2=0−x1+2x32=3x1,x2,x3>=0
化为标准型
其中A,b,Aeq,beq,ub均为"[]"
c = [ − x 1 2 + x 2 − x 3 2 ; x 1 + x 2 2 + x 3 2 − 20 ] c=[-x_{1}^2+x_{2}-x_{3}^2; x_{1}+x_{2}^2+x_{3}^2-20] c=[−x12+x2−x32;x1+x22+x32−20]
c e q = [ − x 1 − x 2 2 + 2 ; x 2 + 2 x 3 2 − 3 ] ceq=[-x_{1}-x_{2}^2+2;x_{2}+2x_{3}^2-3] ceq=[−x1−x22+2;x2+2x32−3]
l b = [ 0 , 0 , 0 ] ′ lb=[0,0,0]' lb=[0,0,0]′
一类要求变量取整数值的数学规划:线性整数规划(在线性模型中,有决策变量限定为整数);非线性整数规划(无特定算法,只能用近似,如蒙特卡洛模拟、智能算法)
整数规划的特例:0-1规划——特殊的证书规划,Matlab中也只能求解线性0-1规划,对于非线性0-1规划也只能近似求解。
与线性规划求解命令[x, fval] = linprog[c, A, b, Aeq, beq, lb, ub, X0]很相似
[x fval] = intlinprog[c, intcon, A, b, Aeq, beq, lb, ub]
仍使用intlinprog函数,只不过在lb和ub上作文章。
例如:三个决策变量x1,x2,x3中,x1和x3是0-1变量,x2不限制,则intcon=[1, 3],lb=[0;-inf;0],ub=[1;+inf,1]
min z = 18 x 1 + 23 x 2 + 5 x 3 \min z=18x_{1}+23x_{2}+5x_{3} minz=18x1+23x2+5x3
s . t . { 500 < = 107 x 1 + 500 x 2 < = 50000 2000 < = 72 x 1 + 121 x 2 + 65 x 3 < = 2250 x 3 ∈ z x 1 , x 2 , x 3 > = 0 s.t.\left\{\begin{matrix} 500<=107x_{1}+500x_{2}<=50000 \\ 2000<=72x_{1}+121x_{2}+65x_{3} <= 2250\\ x_{3} \in z\\ x_{1},x_{2},x_{3}>=0 \end{matrix}\right. s.t.⎩⎪⎪⎨⎪⎪⎧500<=107x1+500x2<=500002000<=72x1+121x2+65x3<=2250x3∈zx1,x2,x3>=0
Matlab代码
c = [18 23 5]';
intcon = 3; %限定为整数
A = [107 500 0;
72 121 65;
-107 -500 0;
-72 -121 -65];
b = [50000 2250 -500 -2000]';
lb = [0 0 0]';
[x fval] = linprog(c, intcon, A, b, [], [], lb);
%x =
% 0
% 1
% 29
%
%fval =
% 168
%
有10件货物要从甲地运到乙地,每件货物重量(单位:吨)和利润(单位:元)如下表所示
物品 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
重量(t) | 6 | 3 | 4 | 5 | 1 | 2 | 3 | 5 | 4 | 2 |
利润(元) | 540 | 200 | 180 | 350 | 60 | 150 | 280 | 450 | 320 | 120 |
由于只有一辆载重为30t的货车能用来运送货物,所以只能选择部分货物进行运送。
要求确定运送那些货物,使得运送这些货物的总利润最大。
解:写出目标函数和约束条件
记 x i { 1 , 运 送 了 第 i 件 货 物 0 , 没 有 运 送 第 i 件 货 物 x_{i}\left\{\begin{matrix} 1, 运送了第i件货物\\ 0, 没有运送第i件货物 \end{matrix}\right. xi{1,运送了第i件货物0,没有运送第i件货物
i=1,2,…,10
记wi表示第i件物品的重量,pi表示第i件物品的利润
则目标函数: max ∑ i = 1 10 p i x i \max \sum_{i=1}^{10} p_{i}x_{i} maxi=1∑10pixi
约束条件:
s . t . { ∑ i = 1 10 w i x i < = 30 x i ∈ 0 , 1 s.t.\left\{\begin{matrix} \sum_{i=1}^{10} w_{i}x_{i} <= 30 \\ x_{i} \in {0, 1} \end{matrix}\right. s.t.{∑i=110wixi<=30xi∈0,1
5名候选人的百米成绩(s)
蝶泳 | 仰泳 | 蛙泳 | 自由泳 | |
---|---|---|---|---|
甲 | 66.8 | 75.6 | 87 | 58.6 |
乙 | 57.2 | 66 | 66.4 | 53 |
丙 | 78 | 67.8 | 84.6 | 59.4 |
丁 | 70 | 74.2 | 69.6 | 57.2 |
戊 | 67.4 | 71 | 83.8 | 62.4 |
怎么选拔队员组成4×100米混合泳接力队伍?
解:写出目标函数和约束条件
记 { i = 1 , 2 , . . . , 5 ⇒ 五 名 队 员 j = 1 , 2 , 3 , 4 ⇒ 四 种 泳 姿 x i { 1 , 队 员 i 参 加 第 j 中 泳 姿 0 , 队 员 i 不 参 加 第 j 中 泳 姿 t i j ⇒ 队 员 i 参 加 第 j 种 泳 姿 的 耗 时 \left\{\begin{matrix} i=1,2,...,5 \Rightarrow 五名队员\\ j=1,2, 3,4 \Rightarrow 四种泳姿\\ x_{i}\left\{\begin{matrix} 1, 队员i参加第j中泳姿\\ 0, 队员i不参加第j中泳姿 \end{matrix}\right. \\ t_{ij} \Rightarrow 队员i参加第j种泳姿的耗时 \end{matrix}\right. ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧i=1,2,...,5⇒五名队员j=1,2,3,4⇒四种泳姿xi{1,队员i参加第j中泳姿0,队员i不参加第j中泳姿tij⇒队员i参加第j种泳姿的耗时
则目标函数: min ∑ j = 1 4 ∑ i = 1 5 t i j x i j \min \sum_{j=1}^{4} \sum_{i=1}^{5} t_{ij}x_{ij} minj=1∑4i=1∑5tijxij
约束条件:
s . t . { ∑ j = 1 4 x i j < = 1 , i = 1 , 2 , 3 , 4 , 5 ( 每 个 人 只 能 入 选 4 种 泳 姿 之 一 ) ∑ i = 1 5 x i j = 1 , j = 1 , 2 , 3 , 4 ( 美 中 泳 姿 有 且 仅 有 1 人 参 加 ) x i j ∈ 0 , 1 s.t.\left\{\begin{matrix} \sum_{j=1}^{4}x_{ij} <= 1, i=1,2,3,4,5( 每个人只能入选4种泳姿之一) \\ \sum_{i=1}^{5} x_{ij} = 1 ,j=1,2,3,4(美中泳姿有且仅有1人参加) \\ x_{ij}\in {0, 1} \end{matrix}\right. s.t.⎩⎨⎧∑j=14xij<=1,i=1,2,3,4,5(每个人只能入选4种泳姿之一)∑i=15xij=1,j=1,2,3,4(美中泳姿有且仅有1人参加)xij∈0,1
假设按照方案A-G切割的原材料数量分别为xi(i = 1,2,…,7),根据上表的数据我们可以建立以下线性整数规划模型:
目标函数: min ∑ i = 1 7 x i j \min \sum_{i=1}^{7} x_{ij} mini=1∑7xij
约束条件: { x 1 + 2 x 2 + x 7 > = 100 x 3 + 2 x 4 + x 5 + x 7 > = 100 4 x 1 + x 2 + 2 x 4 + 6 x 6 + x 7 > = 100 x i ⇒ 非 负 整 数 ( i = 1 , 2 , 3 , 4 , 5 , 6 , 7 ) \left\{\begin{matrix} x_{1} + 2x_{2} + x_{7} >= 100 \\ x_{3} + 2x_{4} + x_{5}+x_{7} >= 100\\ 4x_{1} + x_{2} +2x_{4} + 6x_{6}+x_{7} >= 100 \\ x_{i} \Rightarrow 非负整数(i=1,2,3,4,5,6,7) \end{matrix}\right. ⎩⎪⎪⎨⎪⎪⎧x1+2x2+x7>=100x3+2x4+x5+x7>=1004x1+x2+2x4+6x6+x7>=100xi⇒非负整数(i=1,2,3,4,5,6,7)
求解结果如下表所示
A | B | C | D | E | F | G | |
---|---|---|---|---|---|---|---|
原材料数量 | 14 | 43 | 32 | 2 | 0 | 0 | 0 |
所花费的原材料数量为:91
Matlab代码
在对策论中,我们常遇到这样的问题:在最不利的条件下,寻求最有利的策略。如:急救中心选址,投资规划中确定最大风险的最低限度。
为此对每个x
最大最小化问题的一般数学模型
min x { m a x [ f 1 ( x ) , f 2 ( x ) , . . . , f m ( x ) ] } \min_{x} \left\{max[f_{1}(x),f_{2}(x),...,f_{m}(x)]\right\} xmin{max[f1(x),f2(x),...,fm(x)]}
s . t . { A x < = b A e q ⋅ x = b e q C ( x ) < = 0 C e q ( x ) = 0 V L B < = X < = V U B s.t.\left\{\begin{matrix} Ax <= b\\ Aeq\cdot x = beq \\ C(x) <= 0\\ Ceq(x) = 0\\ VLB <= X <= VUB \end{matrix}\right. s.t.⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧Ax<=bAeq⋅x=beqC(x)<=0Ceq(x)=0VLB<=X<=VUB
Matlab
[x fval] = fminimax(@Fun, X0, A, b, Aeq, beq, lb, ub, @nonlfun, option)
目标函数@Fun用一个函数向量表示 code11
funciton f = Fun(x)
f = zeros(m, 1)
f(1) = ...
f(2) = ...
...
f(m) = ...
end
若一个规划问题中有多个目标,例如企业在保证利润最大时也要保证生产时产生的污染最少,这种情况下我们可以对多目标函数进行加权组合,是问题变为单目标规划,然后利用前面的模型进行求解
注意: