文章目录
前言
前面已经讲解了整数规划中分支定界法和割平面法,它们均可求纯或混合整数线性规划.
数模算法学习—整数规划1
本篇介绍 0 −1型整数规划、匈牙利法—解决指派问题。
一、 0 −1型整数规划
- 0 −1型整数规划是整数规划中的特殊情形,它的变量 x j 仅取值 0 或 1,这时 x j 称 为0 −1变量。 x j 仅取值 0 或 1 这个条件可由约束条件:【0 ≤ xj ≤ 1 ,x为整数】代替。
- 我们先介绍引入0 −1变量的实际问题,再研究解法。
二、0 −1规划实际问题
1.(互斥计划问题)相互排斥的计划
1.1.案例1—投资问题
- 1.确定决策变量: X j 表示是否投资 j 项目,当x=1 时,表示投资该项目,x=0时不投资该项目。X1,X2,X3…分别表示Ⅰ,Ⅱ,Ⅲ…项目
- 确定目标函数:由题可知,要求利润最大的方案,而利润等于所投资的各项目的收益之和,因此
(由于不知道具体投资了哪项所以均列出来,而是否投资也就是该项项目收益是否要算入总收益,由X j(0或1)决定,你投了那个显目,x就是1,就是计入,你不投,x就是0,0乘以该项目的收益也就是0. - 确定约束条件:
(1)总的投资额为600万,得到第一个式子
(2)项目Ⅰ、Ⅱ、 Ⅲ中选一项:得到第二个式子。即必须有两个0,一个1.
(3)项 目Ⅴ以项目以为先验条件:得到第三个式子,即当X1=1时X5可以为1,也可以为0.但当X1=0时,X5只能为0,即X5≤X1。
(4)变量全是0或1,即第四个式子。
1.2.案例2-场所的选定
。
老规矩,第一步确定决策变量,第二步确定目标函数,第三步确定约束条件,步骤如下
。
。
2.互斥约束问题(相互排斥的约束条件)
2.1案例1
由于有两种相互排斥的约束,为了将他们同时表示,引入一个变量y(仅等于0或1)和一个无穷大的数M得到下列式子
当Y=1时,第二个式子相当于小于无穷,约束无效,只第一个约束条件起作用,所以M和y巧妙的将两个式子结合起来。
其中p-q的意思是一共有p个约束条件,其中q 个满足,所以p-q为不满足的约束条件也就是失效的约束条件。
2.2 案例2
三、指派问题
一人一项工作即一对一
看不懂没关系,接下来例题讲解
(1)首先,i 代表第几人,j 代表第几项工种,通过排列组合的知识可知一共有 i 的 j 次方的可能性,这时候可暂时认为一个人可以做多项工作,每项工作可以由多人做,这样的目的是为了得到一个矩阵,即指派矩阵,其中的约束条件(一人只做一项工作)由矩阵中x的值(0或1)决定 。
(2)由一个人只能完成一项任务可知,当 i 不变时,所由 i 相同的
X ij之和为1,例如甲只能做一项任务,所以所有X1j为1(0为不做该任务,1为做该任务)。总之就是指派矩阵的每行之和为1。
(3)同理可得“一个工作只能一人完成”的相应约束,即指派矩阵的没列之和为1。
四、指派问题的matlab求解
- 整数规划问题的求解可以使用 Lingo 等专用软件。对于一般的整数规划问题,无法直接利用 Matlab 的函数,必须利用 Matlab 编程实现分枝定界解法和割平面解法。但对于指派问题等0 −1整数规划问题,可以直接利用 Matlab 的函数 linprog进行求解
4.1语法介绍
x = linprog(f,A,b)
x = linprog(f,A,b,Aeq,beq)
x = linprog(f,A,b,Aeq,beq,lb,ub)
x = linprog(f,A,b,Aeq,beq,lb,ub,options)
x = linprog(problem)
[x,fval] = linprog(___)
[x,fval,exitflag,output] = linprog(___)
[x,fval,exitflag,output,lambda] = linprog(___)
a=zeros(10,25);10个等式方程,X ij 有25个,表示一个10×25的0向量
X=reshape(x,5,5),将向量转化成矩阵