线性规划
线性规划的MATLAB解法
MATLAB求解函数如下:
[ x, fval] = linprog(c,A,b,Aeq,beq,LB,RB,X0,OPTIONS);
注意使用前需要将目标函数及其约束条件转化为MATLAB标准型:
指派问题
分配
n
n
n个人干
m
m
m项工作每个人仅干一项工作,若分配第
i
i
i个人去干第
j
j
j项工作,需要花费
c
i
j
c_{ij}
cij单位时间,如何分配才能使得所花时间最短?
该问题可转化为线性规划,只需给出矩阵
C
=
(
c
i
j
)
C=\left( c_{ij}\right)
C=(cij),
C
C
C被称为指派矩阵 引入二进制变量
x
i
j
x_{ij}
xij上述问题的数学模型为:
m
i
n
∑
i
=
1
n
∑
j
=
1
m
c
i
j
x
i
min \quad \sum_{i=1}^{n}\sum_{j=1}^{m}c_{ij}x_i
mini=1∑nj=1∑mcijxi
s
.
t
∑
j
=
1
m
x
i
=
1
i
=
1
,
2
,
3...
n
s.t\quad \sum\limits_{j=1}^{m}x_i=1\quad i=1,2,3...n
s.tj=1∑mxi=1i=1,2,3...n
∑
i
=
1
n
x
i
j
≥
1
j
=
1
,
2
,
3...
m
\quad\quad\quad \sum_{i=1}^{n}x_{ij}\geq1 \quad j=1,2,3...m
i=1∑nxij≥1j=1,2,3...m
x
i
j
=
0
或
1
x_{ij}=0或1
xij=0或1 对于二维线性规划MATLAB无法直接求解,只能先转化为一维线性规划,转化方式为:
- 先按分配区域分组, m m m项工作共 m m m组,每组 n n n个人。
- 构造价值向量 c m n × 1 c_{mn\times 1} cmn×1。
- 构造约束矩阵 A A A,其中第 i i i个人的索引为 i : n : e n d i:n:end i:n:end,每一组的索引为 n × ( i − 1 ) + 1 : i × n n\times (i-1)+1:i\times n n×(i−1)+1:i×n。
- 构造自变量约束向量。
- 利用*linprog( )*函数求解。
很多问题都可以看成指派问题的变形只是改变 指派矩阵 和 约束条件
整数规划
相比线性规划整数规划只是在线性规划的基础上增加整数约束条件求解函数为 intlinprog( )
整数规划的求解
变量都为整数的时候称为 完全整数规划,变量部分为整数的时候称为混合整数规划 具体理论不再赘述,利用 *** intlinprog( )*** 求解时需要增加一个整数位置变量intcon 来表明那些位置的的变量为整数。
整数规划的转化
相互排斥的约束条件
有两个相互排斥的约束条件 :
5
x
1
+
4
x
2
≤
24
或
7
x
1
+
3
x
2
≤
45
5x_1+4x_2\leq24或7x_1+3x_2\leq45
5x1+4x2≤24或7x1+3x2≤45可改写为
{
5
x
1
+
4
x
2
≤
24
+
M
7
x
1
+
3
x
2
≤
45
+
(
1
−
y
)
M
\begin{cases} 5x_1+4x_2\leq24+M \\ 7x_1+3x_2\leq 45+(1-y)M \end{cases}
{5x1+4x2≤24+M7x1+3x2≤45+(1−y)M其中
M
M
M是一个足够大的数,保证两个约束总有一个在约束。
蒙特卡洛法
对于整数的线性规划可以采用 MATLAB 求解器求解,但是对于非线性的整数规划我们没有通用的求解方法可以采用蒙特卡洛法求出一个满意的解。
线性分段函数的转化
原油购买问题中,原油的售价和和购买量成分段线性函数关系
c
(
x
)
=
{
10
x
0
≤
x
≤
500
1000
+
8
x
500
≤
x
≤
1000
3000
+
6
x
1000
≤
x
≤
1500
c \left(x \right)= \begin{cases} 10x & 0\leq x \leq 500 \\ 1000+8x & 500\leq x \leq 1000 \\ 3000 +6x & 1000\leq x \leq 1500 \end{cases}
c(x)=⎩⎪⎨⎪⎧10x1000+8x3000+6x0≤x≤500500≤x≤10001000≤x≤1500下面介绍三种转换方式
- 解法1:
购买消费: c ( x ) = 10 x 1 + 8 x 2 + 6 x 3 c(x) =10x_1+8x_2+6x_3 c(x)=10x1+8x2+6x3, 同 时 增 加 约 束 : x 2 ( x 1 − 500 ) = 0 , x 3 ( x 2 − 500 ) = 0 同时增加约束:x_2(x_1-500)=0,x_3(x_2-500)=0 同时增加约束:x2(x1−500)=0,x3(x2−500)=0。注意因题而异,函数需要连续性。 - 解法2:
可以将 c ( x ) 函 数 进 行 分 段 , 分 成 三 个 区 域 b 1 = 0 , b 2 = 500 , b 3 = 1000 , b 4 = 1500 , x 在 不 同 的 区 间 可 以 用 不 同 的 凸 组 合 表 示 , 例 如 x 0 = w 1 b 1 + w 2 b 2 , w 1 + w 2 = 1 , 由 于 c ( x ) 是 线 性 函 数 c ( x 0 ) = w 1 c ( b 1 ) + w 2 c ( b 2 ) c(x)函数进行分段,分成三个区域b_1=0,b_2=500,b_3=1000,b_4=1500,x在不同的区间可以用不同的凸组合表示,例如x_0=w_1b_1+w_2b_2,\quad w_1+w_2=1,由于c(x)是线性函数c(x_0)=w_1c(b_1)+w_2c(b_2) c(x)函数进行分段,分成三个区域b1=0,b2=500,b3=1000,b4=1500,x在不同的区间可以用不同的凸组合表示,例如x0=w1b1+w2b2,w1+w2=1,由于c(x)是线性函数c(x0)=w1c(b1)+w2c(b2)。可令将付款函数写为 c ( x ) = 5000 w 2 + 9000 w 3 + 12000 w 4 c(x)=5000w_2+9000w_3+12000w_4 c(x)=5000w2+9000w3+12000w4 自变量为 x = w 1 b 1 + w 2 b 2 + w 3 b 3 + w 4 b 4 x=w_1b_1+w_2b_2+w_3b_3+w_4b_4 x=w1b1+w2b2+w3b3+w4b4。加入约束 w 1 ≤ z 1 , w 2 ≤ z 1 + z 2 , w 3 ≤ z 2 + z 3 , w 4 ≤ z 4 w 1 + w 2 + w 3 + w 4 = 1 z 1 + z 2 + z 3 = 1 w_1\leq z_1,w_2\leq z_1+z_2,w_3\leq z_2+z_3,w_4 \leq z_4 \quad w_1+w_2+w_3+w_4=1 \quad z_1+z_2+z_3=1 w1≤z1,w2≤z1+z2,w3≤z2+z3,w4≤z4w1+w2+w3+w4=1z1+z2+z3=1 ∀ z i ∈ { 0 , 1 } \forall z_i\in\{0,1\} ∀zi∈{0,1} - 解法3:
引入 0 − 1 0-1 0−1变量改变约束: { 500 z 2 ≤ x 1 ≤ 500 z 1 500 z 3 ≤ x 2 ≤ 500 z 2 x 3 ≤ 500 z 3 ∀ z i ∈ { 0 , 1 } \begin{cases} 500z_2\leq x_1\leq500z_1\\ 500z_3\leq x_2\leq 500z_2\\ x_3\leq500z_3 \end{cases} \quad \forall z_i \in \{0,1\} ⎩⎪⎨⎪⎧500z2≤x1≤500z1500z3≤x2≤500z2x3≤500z3∀zi∈{0,1}将原问题转化为整数线性规划。
对于分段的目标函数 解法二 更有一般性