前言

整数规划基于线性规划,在线性规划的前提下,多了部分或全部决策变量是整数的约束条件。不特殊说明的话,整数规划就是指整数线性规划

分类

(1)变量全部为整数时,称作纯整数规划
(2)变量部分为整数时,称作混合整数规划

根据求解方法分类

(1)分枝定界算法——解决纯或混合整数规划
(2)割平面算法——解决纯或混合整数规划
(3)匈牙利算法——解决指派问题(“0-1”规划)


1、分枝定界算法和割平面算法

虽然这两个在解决问题所用的思路不同,但最终的公式是一样的。具体的算法内容就不详写了,这里仅写出如何利用matlab编写相应的代码。
在线性规划的约束条件下,加入新的约束条件,第几位决策变量是整数
min ⁡ x c T x s . t . { x ( i n t c o n ) 为 整 数 , A ⋅ x ≤ b A e q ⋅ x = b e q l b ≤ x ≤ u b \min\limits_x\bm c^T\bm x\\ s.t.\begin{cases} \bm x(intcon)为整数,\\ \bm A\cdot\bm x \le\bm b\\ Aeq\cdot\bm x=beq\\ lb\le\bm x\le ub \end{cases} xmincTxs.t.x(intcon)AxbAeqx=beqlbxub
引入了一个新的向量 i n t c o n \bm {intcon} intcon例如当 i n t c o n = [ 1 , 3 ] intcon=[1,3] intcon=[1,3]时,即表示第一位和第三位决策变量是整数
引入新的matlab求解整数规划的命令

[x,fval]=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub);

这里举一个例子
例1 求解如下的混合整数规划问题
m i n   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\le7\\ 4x_1+2x_2+x_3=12\\ x_1,x_2\ge 0\\ x_3=0\ or\ 1 \end{cases} min z=3x12x2x3s.t.x1+x2+x374x1+2x2+x3=12x1,x20x3=0 or 1
求解matlab程序为

clc;
clear;
c=[-3,-2,-1];
intcon=3;
A=ones(1,3);b=7;
Aeq=[4,2,1];beq=12;
lb=zeros(3,1);ub=[inf;inf;1];
[x,fval]=intlinprog(c,intcon,A,b,Aeq,beq,lb,ub)

2、匈牙利算法

介绍匈牙利算法之前,首先要介绍一下0-1规划问题,此时变量 x j x_j xj仅取值0或1,而 x j x_j xj称作0-1变量,此时约束条件为
0 ≤ x j ≤ 1 , 且 x j 为 整 数 0\le x_j \le 1,且x_j为整数 0xj1,xj

约束条件相互排斥

有时候,约束条件之间不是同时存在的,仅出现其中一个约束条件。例如有两种运输方式选择,用车运输或者用船运输。用车运输时约束条件为 5 x 1 + 4 x 2 ≤ 24 5x_1+4x_2\le24 5x1+4x224,用船运输时约束条件为 7 x 1 + 3 x 2 ≤ 45 7x_1+3x_2\le 45 7x1+3x245。两种约束条件显然不能同时存在,这时引入一个0-1变量即可解决问题
y = { 1 , 船 运 0 , 车 运 y=\begin{cases} 1,船运\\ 0,车运 \end{cases} y={10
则约束条件可以改写为
{ 5 x 1 + 4 x 2 ≤ 24 + y M , 7 x 1 + 3 x 2 ≤ 45 + ( 1 − y ) M , y = 0   o r   1 \begin{cases} 5x_1+4x_2\le 24+yM,\\ 7x_1+3x_2\le 45+(1-y)M,\\ y=0\ or\ 1 \end{cases} 5x1+4x224+yM,7x1+3x245+(1y)M,y=0 or 1
只要使得M足够大就可以。则当约束条件互斥时,只需要引入一个变量就可以充分表达约束条件。

指派问题

指派问题指的是指派一些人去某地,此时每个人都去且仅能去一个地方。当给了每人工作的时长,目标函数可能就是花费的总时间最少;当给了每个人工作的收益,目标函数可能就是总收益的最大值。
依旧是省略具体的算法,只展示了公式和代码部分
例2 分配n个人去做n项工作,每人做且仅做一项工作,若分配第i人去做第j项工作,需花费 c i j c_{ij} cij单位时间,问怎么分配工作才能使工人花费的总时间最少?
解: 引入0-1变量
x i j = { 1 , 第 i 人 做 第 j 项 工 作 0 , 第 i 人 不 做 第 j 项 工 作 i , j = 1 , 2 , . . . , n x_{ij}= \begin{cases} 1,第i人做第j项工作\\ 0,第i人不做第j项工作 \end{cases} i,j=1,2,...,n xij={1ij0ijij=1,2,...,n
则上述指派问题的数学模型为
m i n   ∑ i = 1 n ∑ j = 1 n c i j x i j s . t . { ∑ j = 1 n x i j = 1 , i = 1 , . . . , n ,         ( 1 ) ∑ i = 1 n x i j = 1 , j = 1 , 2 , . . . , n       ( 2 ) x i j = 0   o r   1 , i , j = 1 , . . . n       ( 3 ) min\ \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,...,n, \ \ \ \ \ \ \ (1)\\ \sum\limits_{i=1}^n x_{ij}=1,j=1,2,...,n \ \ \ \ \ (2)\\ x_{ij}=0\ or\ 1,i,j=1,...n \ \ \ \ \ (3) \end{cases} min i=1nj=1ncijxijs.t.j=1nxij=1,i=1,...,n,       (1)i=1nxij=1,j=1,2,...,n     (2)xij=0 or 1,i,j=1,...n     (3)
上述式子中,(1)式表示每个工作只能由一个人完成,(2)式表示每个人只能干一项工作。
特别需要说明的是,如果不限制每人工作的项目数,那么(2)式就可以去掉
这里给出一个具体的指派矩阵,便于后续matlab的代码编写
[ 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 ] \begin{bmatrix} 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{bmatrix} 3868987441022226109739375510
则matlab的代码如下

c=[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];
   c=c(:);Aeq=zeros(10,25)%这里的10是共有10个式子,25是共有25个决策变量
for i=1:5
   	Aeq(i,(i-1)*5+1:5*i)=1;%对应着(2)
   	Aeq(5+i,i:5:25)=1;%对应着(1)
end
beq=ones(10,1);
intcon=1:25;
lb=zeros(25,1);
ub=ones(25,1);
x=intlinprog(c,intcon,[],[],Aeq,beq,lb,ub);
x=reshape(x,[5,5])

代码运行结果如下图所示
运行结果

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐