数学建模预备知识——整数规划

整数规划

概论

整数规划的定义

当数学规划问题中的变量限制为整数的时候,就称为整数规划。若在线性规划模型中,变量限制为整数,则称为整数线性规划。目前流行的求解整数规划的方法往往只适用于整数线性规划,

整数规划的分类

整数线性规划模型一般可以分为两类:

  • 变量全部限制为整数时,称为完全整数规划
  • 变量部分限制为整数时,称为混合整数规划
整数规划的求解方法
  • 分支定界法——可以求完全和混合整数线性规划
  • 割平面法——可以求完全和混合整数线性规划
  • 隐枚举法——可以求“0-1”整数规划
    • 过滤隐枚举法
    • 分枝隐枚举法
  • 匈牙利法——解决指派问题(“0-1”规划的特殊形式)
  • 蒙特卡洛法——求解各种类型的规划问题

0-1整数规划

相互排斥的约束条件

当问题中有 m m m个相互排斥的约束条件的时候
{ a 11 x 1 + ⋯ + a 1 n x n ≤ b 1 ⋮ a m 1 x 1 + ⋯ + a m n x n ≤ b n \begin{cases} a_{11}x_1+\cdots+a_{1n}x_n \leq b_1 \\ \quad \quad \quad \quad \quad \vdots \\ a_{m1}x_1+\cdots+a_{mn}x_n \leq b_n \end{cases} a11x1++a1nxnb1am1x1++amnxnbn
为了保证这些限制条件相互排斥,引入 m m m0-1变量 y i ( i = 1 , ⋯   , m ) y_i(i=1,\cdots,m) yi(i=1,,m)和一个充分大的数 M M M

y i = { 1 , 第 i 个 约 束 条 件 起 作 用 0 , 第 i 个 约 束 条 件 不 起 作 用 y_i= \begin{cases} 1,第i个约束条件起作用\\ 0,第i个约束条件不起作用\\ \end{cases} yi={1,i0i
此时之前的 m m m个相互排斥的限制条件就转化为
{ a 11 x 1 + ⋯ + a 1 n x n ≤ b 1 + ( 1 − y 1 ) M ⋮ a m 1 x 1 + ⋯ + a m n x n ≤ b m + ( 1 − y m ) M ∑ i = 1 m y i = 1 \begin{cases} a_{11}x_1+\cdots+a_{1n}x_n \leq b_1+(1-y_1)M \\ \quad \quad \quad \quad \quad \quad \quad \vdots \\ a_{m1}x_1+\cdots+a_{mn}x_n \leq b_m+(1-y_m)M \\ \sum\limits_{i=1}^{m}y_i=1 \end{cases} a11x1++a1nxnb1+(1y1)Mam1x1++amnxnbm+(1ym)Mi=1myi=1
这个限制条件表明,这 m m m0-1变量 y i y_i yi只能由一个是1,也就是上面的 m m m个不等限制条件,只有1个真正有意义,其余的都是小于一个充分大的数,可以认为其永远成立

固定费用的问题

在讨论线性规划的时候,有些问题是要求使成本最小。那么,就可以固定成本为一个常数,并在线性规划的模型中不必明显列出。但是有些固定费用的问题不能用一般的线性规划来描述,而可以改变为混合整数规划来解决

某个工厂为了生产某种产品,有几种不同的生产方式可以选择,如选定的生产方式投资高,由于产量大,因而分配到每件产品的变动成本反而降低;反之,如果选定的生产方式投资低,将来分配到每件产品的变动成本可能增加。所以必须全面考虑,设有三种可供选择,令

j = 1 , 2 , 3 j=1,2,3 j=1,2,3 分别表示三种生产方式

x j x_j xj 表示采用第 j j j 种生产方式时的产量

c j c_j cj 表示采用第 j j j 种生产方式时每件产品的变动成本

k j k_j kj 表示采用第 j j j 种生产方式时的固定成本

为了说明成本的特点,暂不考虑其他约束因素。采用各种生产方式的总成本分别为
P i = { k j + c j x j , 当 x j > 0 0 , 当 x j = 0 P_i= \begin{cases} k_j+c_jx_j,&当x_j>0 \\ 0,&当x_j=0 \end{cases} Pi={kj+cjxj,0,xj>0xj=0

为了表示某种生产方式是否投资,引入0-1变量 y j y_j yj ,令
y j = { 1 , 当 采 用 第 j 种 生 产 方 式 , 即 x j > 0 0 , 当 不 采 用 第 j 种 生 产 方 式 , 即 x j = 0 y_j= \begin{cases} 1,&当采用第j种生产方式,&即x_j>0\\ 0,&当不采用第j种生产方式,&即x_j=0\\ \end{cases} yj={1,0,jjxj>0xj=0
此时目标函数变为
min ⁡ z = ( k 1 y 1 + c 1 x 1 ) + ( k 2 y 2 + c 2 x 2 ) + ( k 3 y 3 + c 3 x 3 ) s . t . { y 1 ε ≤ x 1 ≤ y 1 M y 2 ε ≤ x 2 ≤ y 2 M y 3 ε ≤ x 3 ≤ y 3 M 其 中 ε 是 一 个 充 分 小 的 正 常 数 , M 是 一 个 充 分 大 的 正 常 数 \min z=(k_1y_1+c_1x_1)+(k_2y_2+c_2x_2)+(k_3y_3+c_3x_3) \\ s.t. \begin{cases} y_1\varepsilon\leq x_1 \leq y_1M \\ y_2\varepsilon\leq x_2 \leq y_2M \\ y_3\varepsilon\leq x_3 \leq y_3M \\ \end{cases} {\quad 其中\varepsilon是一个充分小的正常数, M是一个充分大的正常数} minz=(k1y1+c1x1)+(k2y2+c2x2)+(k3y3+c3x3)s.t.y1εx1y1My2εx2y2My3εx3y3Mε,M
在限制条件中,当 x j > 0 x_j>0 xj>0 时, y j = 1 y_j=1 yj=1 ,当 x j = 0 x_j=0 xj=0 时, y j = 0 y_j=0 yj=0

指派问题的数学模型

拟分配 n n n 人去做 n n n 项工作,每人做且仅做一项工作,若分配第 i i i 人去做第 j j j 项工作,需要花费 c i j c_{ij} cij 单位时间,问应该如何分配工作,才能使工人花费的总时间最少。

容易看出,要给出一个指派问题的实例,只需要给出矩阵 C = ( c i j ) C=(c_{ij}) C=(cij),称为指派问题的系数矩阵

引入0-1变量
x i j = { 1 , 第 i 人 做 第 j 项 工 作 0 , 第 i 人 不 做 第 j 项 工 作 x_{ij}= \begin{cases} 1,&第i人做第j项工作 \\ 0,&第i人不做第j项工作 \\ \end{cases} xij={1,0,ijij
上述指派问题的数学模型为
min ⁡ ∑ i = 1 n ∑ j = 1 n c i j x i j s . t . { ∑ j = 1 n x i j = 1 , i = 1 , 2 , ⋯   , n ∑ i = 1 n x i j = 1 , j = 1 , 2 , ⋯   , n x i j = 0 o r 1 , i , j = 1 , 2 , ⋯   , n \min \quad \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}c_{ij}x_{ij} \\ s.t. \begin{cases} \sum \limits _{j=1}^{n}x_{ij}=1, &i=1,2,\cdots,n\\ \sum \limits _{i=1}^{n}x_{ij}=1, &j=1,2,\cdots,n\\ x_{ij}=0or1,&i,j=1,2,\cdots,n \end{cases} mini=1nj=1ncijxijs.t.j=1nxij=1,i=1nxij=1,xij=0or1,i=1,2,,nj=1,2,,ni,j=1,2,,n

蒙特卡洛法(Monte Carlo)

蒙特卡洛方法也成为计算机随机模拟方法,他是机遇对大量事件的统计结果来实现一些确定性问题的计算。使用蒙特卡洛方法必须使用计算机生成相关分布的随机数。

例: y = x 2 , y = 12 − x y=x^2,y=12-x y=x2,y=12x x x x 轴在第一象限内围成一个曲边三角形,设计一个随机试验,求该三角形面积的近似值

设计随机试验的思想如下,在矩形区域 [ 0 , 12 ] × [ 0 , 9 ] [0,12]\times [0,9] [0,12]×[0,9] 上产生服从均匀分布的 1 0 7 10^7 107 个测试点,统计随机点落在曲边三角形内的频数,则曲边三角形的面积近似为上述矩形的面积乘以频率

x=unifrnd(0,12,[1,10000000])
y=unifrnd(0,9,[1,10000000])
p=(sum(y<x.^2&x<=3)+sum(y<12-x&x>=3))*(10^-7)
S=12*9*p

尽管整数规划由于限制变量为整数增加了难度,但是由于整数解是有限个,于是为枚举法提供了方便。当然,在自变量维数很大和取值范围和宽泛的时候,显枚举法计算出最优解是不太现实的,但是应用概率理论可以证明,在一定的计算量的情况下,用蒙特卡洛法完全可以得到一个满意解

求解非线性整数规划
max ⁡ z = x 1 2 + x 2 2 + 3 x 3 2 + 4 x 4 2 + 2 x 5 2 − 8 x 1 − 2 x 2 − 3 x 3 − x 4 − 2 x 5 s . t . { 0 ≤ x i ≤ 99 , i = 1 , ⋯   , 5 x 1 + x 2 + x 3 + x 4 + x 5 ≤ 400 x 1 + 2 x 2 + 2 x 3 + x 4 + 6 x 5 ≤ 800 2 x 1 + x 2 + 6 x 3 ≤ 200 x 3 + x 4 + 5 x 5 ≤ 200 \max z=x_1^2+x_2^2+3x_3^2+4x_4^2+2x_5^2-8x_1-2x_2-3x_3-x_4-2x_5 \\ s.t. \begin{cases} 0 \leq x_i \leq 99,i=1,\cdots ,5\\ x_1+x_2+x_3+x_4+x_5\leq400\\ x_1+2x_2+2x_3+x_4+6x_5\leq800\\ 2x_1+x_2+6x_3\leq200\\ x_3+x_4+5x_5\leq200 \end{cases} maxz=x12+x22+3x32+4x42+2x528x12x23x3x42x5s.t.0xi99,i=1,,5x1+x2+x3+x4+x5400x1+2x2+2x3+x4+6x58002x1+x2+6x3200x3+x4+5x5200

如果用显枚举法进行试探,显然其计算量是非常大的,操作起来不太现实。然而应用蒙特卡洛法去随机计算 1 0 6 10^6 106 个点,便可以找到满意的解。

先编写.m文件来定义目标函数 f f f 和约束向量函数 g g g

function[f,g]=mengte(x);
f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)^2-8*x(1)-2*x(2)-3*x(3)-x(4)-2*x(5);
g=[sum(x)-400
x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-600
2*x(1)+x(2)+6*x(3)-200
x(3)+x(4)+5*x(5)-200];

在编写Matlab程序求解问题

rand('state',sum(clock))  %初始化随机数生成器
z=0
tic  %计时开始
for i=1:10^6
	x=randi([0,99],1,5)  %生成一个每个元素都在0~99之间的1行5列的矩阵
    [f,g]=mengte(x)
    if all(g<=0)
    	if f>z
    		x0=x,z=f
        end
     end
end
x0
z
toc  %计时结束

整数线性规划的计算机求解

整数规划问题的求解可以使用Matlab中的intlinprog函数进行求解,但是使用Matlab进行求解的时候要注意:需要把所有的决策变量化为一维决策向量,实际上对于多维变量的数学规划问题需要做一个变量替换,把多维决策变量化为一维决策向量。而当使用Lingo求解数学规划问题的时候不需要进行变换,使用起来相对比较容易

Matlab求解混合整数线性规划的命令为
[ x , f v a l ] = i n t l i n p r o g ( f , i n t c o n , A , b , A e q , b e q , l b , u b ) [x,fval]=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub) [x,fval]=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)
其中, f , x , i n t c o n , b , b e q , l b , u b f,x,intcon,b,b_{eq},lb,ub f,x,intcon,b,beq,lb,ub 均为列向量 A , A e q A,A_{eq} A,Aeq 均为矩阵

f f f :表示价值向量

i n t c o n intcon intcon :表示整数参数的位置

A A A :表示不等关系约束矩阵

b b b :表示不等关系约束资源向量

A e q A_{eq} Aeq :表示等式关系约束矩阵

b e q b_{eq} beq :表示等式关系资源向量

l b , u b lb,ub lb,ub :表示变量约束的上下限

其对应的标准模型为
min ⁡ x f T x s . t . { x ( i n t c o n ) 为 整 数 A ⋅ x ≤ b A e q ⋅ x = b e q l b ≤ x ≤ b u \min \limits _x f^Tx \\ s.t. \begin{cases} x(intcon)为整数 \\ A\cdot x \leq b \\ A_{eq}\cdot x = beq \\ lb \leq x \leq bu \end{cases} xminfTxs.t.x(intcon)AxbAeqx=beqlbxbu

例:求解下列指派问题,已知指派系数矩阵
[ 3 8 2 10 3 8 7 2 9 7 6 4 2 7 5 8 4 2 3 5 9 10 6 9 10 ] \left[ \begin{matrix} 3&8&2&10&3\\ 8&7&2&9&7\\ 6&4&2&7&5\\ 8&4&2&3&5\\ 9&10&6&9&10 \end{matrix} \right] 3868987441022226109739375510
解:

A=[3 8 2 10 3
8 7 2 9 7
6 4 2 7 5
8 4 2 3 4
9 10 6 9 10]
A=A(:)
a=zeros(10,25)
intcon=1:25
for i=1:5
	a(i,(i-1)*5+1:5*i)=1
	a(5+i,i:5:25)=1
end
b=ones(10,1)
lb=zeros(25,1)
ub=ones(25,1)
[x,fval]=intlinprog(A,intcon,[],[],a,b,lb,ub)
x=reshape(x,[5,5])
fval

结果如下
x = [ 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 ] f v a l = 21 x= \left[\begin{matrix} 0&0&0&0&1\\ 0&0&1&0&0\\ 0&1&0&0&0\\ 0&0&0&1&0\\ 1&0&0&0&0 \end{matrix}\right]\\ fval=21 x=0000100100010000001010000fval=21

下面看一个混合整数规划问题

例:求解下列混合整数规划问题
min ⁡ z = − 3 x 1 − 2 x 2 − x 3 s . t . { x 1 + x 2 + x 3 ≤ 7 4 x 1 + 2 x 2 + x 3 = 12 x 1 , x 2 ≥ 0 x 3 = 0 o r 1 \min z=-3x_1-2x_2-x_3\\ s.t. \begin{cases} x_1+x_2+x_3\leq7\\ 4x_1+2x_2+x_3=12\\ x_1,x_2\geq0\\ x_3=0or1 \end{cases} minz=3x12x2x3s.t.x1+x2+x374x1+2x2+x3=12x1,x20x3=0or1

f=[-3;-2;-1]
intcon=3
A=[1,1,1]
b=7
Aeq=[4,2,1]
beq=12
lb=[0;0;0]
ub=[inf;inf;1]
[x,fval]=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)

结果如下
x = [ 0 5.5 1 ] z = − 12 x= \left[ \begin{matrix} 0\\5.5\\1 \end{matrix} \right]\\ z=-12 x=05.51z=12

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值