一.简介

1 定义

数学规划中,变量部分或全部限制为整数,叫整数规划。

线性规划中,变量全是整数,叫整数线性规划。

2 分类

依据是否变量全为整数,分为完全整数规划和混合整数规划。

依据决策变量要求,分为纯整数,混合整数,全整数以及0-1规划。

混合整数线性规划在Python_混合整数线性规划在Python

 注:1)松弛变量和剩余变量——不等式求解没有等式求解方便,那么以x1+x2<=10为例,我们可以引入x3让其转换为等式,即x1+x2+x3=10,只要x3>=0即可,此时x3叫做松弛变量。同理,当x1+x2>=10时,引入x3,x1+x2-x3=10,x3>=0,x3叫剩余变量。

         2)0-1整数规划多适用于流程安排,像工作安排

3 整数规划的特点

 如果原线性规划有最优解,当自变量限制成整数,进行整数规划会出现下述情况:

            1)原线性规划最优解全是整数,整数规划得到的结果和之前一致。

            2)整数规划无可行解。(0.2<x<0.9)

            3)   有可行解,但是最优解值变差

注:整数规划最优解不可以简单的理解成原线性规划最优解取整!

 (四舍五入后可能不满足约束条件)

4 与线性规划的关系

混合整数线性规划在Python_约束条件_02

 注:1)整数规划可行解是松弛问题可行域中的整数格点(松弛问题是其他约束条件和整数规划一致但是没有整数约束)

        2)松弛问题没有可行解,则整数规划没有可行解。

        3)整数规划最优值小于或等于松弛问题最优值(约束条件多了,不小不行啊)

5 一般形式

混合整数线性规划在Python_混合整数线性规划在Python_03

6.引例

6.1

混合整数线性规划在Python_动态规划_04

混合整数线性规划在Python_算法_05

 分析:零件毛胚数是最终要得到的该零件的总数。设采用第j种方式加工的圆钢为xj(j=1,2,...n)个,(表上是一个圆钢)则对于A1零件,需要满足B1-Bn种方式对应的x1-xj个圆钢生产的零件要>=毛胚数(生产的得比毛胚多才能做毛胚吧)。还有xj必须都是大于等于零的整数。求的原材料最小指的是x1+...xn最小。

6.2

混合整数线性规划在Python_最优解_06

混合整数线性规划在Python_混合整数线性规划在Python_07

二.应对方法

1.分支定界法——求纯或混合整数线性规划

1.1 步骤

混合整数线性规划在Python_动态规划_08

1.2 例题

混合整数线性规划在Python_约束条件_09

 x1=3.25, x2=2.5, z=14.75

增加其他约束条件,选x1,向下取整,得到新的约束条件x1<=3,再次计算

x1=3, x2=2.67, z=14.33

还不满足,再对x1增加条件,向上取整,增加条件x1>=4,计算得

x1=4, x2=1,z=14,取到了整数。

如果x1向下取整再增加x2的向下取整或向上取整,会不会有合理的值呢?(就是说求的14是不是最大的?)根据上一节,约束条件越多,最优解越差,所以可以猜到说14应该最大

而对于x1向上取整的时候,因为已经取到了整数,所以就没有后续了~

如果在这种条件下x2还没有整数,则对x2继续进行约束条件,若所有非整数的约束条件都有了,但是最后结果还是没有整数值,说明:害,换个方法吧(狗头)

注意:整数规划的整数是针对决策变量的,z是不是整数没有影响。在第二次时,即使z=14.3而不是14也是取到了整数规划最优解。

 2.割平面法——求纯或混合整数线性规划

2.1基本思想

混合整数线性规划在Python_动态规划_10

 2.2 基本步骤

1)求解线性规划最优解,若无整数解

2)将不等式通过松弛变量变成等式

混合整数线性规划在Python_算法_11

混合整数线性规划在Python_混合整数线性规划在Python_12

注:xk是引入的松弛变量,aik是松弛变量的系数,将aik分成整数部分和小数部分,aik-Laik指的就是小数部分,Laik指的就是aik的整数部分,将小数部分记作fik。

混合整数线性规划在Python_最优解_13

 注:就是原来不等式右边的数值也化成整数部分加小数部分。

 然后将整数部分移到一侧,小数部分移到另一侧。得到:

混合整数线性规划在Python_算法_14

 注:因为0<fi<1,减去一个值,等于左侧的整数,所以左侧值应该是<=0的整数
 

3.匈牙利算法——0-1问题多用

3.1 互斥约束问题——两个约束条件互斥
3.1.1 引例

混合整数线性规划在Python_算法_15

 注:第二行是企业的新工序的约束条件,问题是应该采用新工序吗?

分析:因为采取新工序和原工序是相互排斥的,所以是0-1规划。引入新的决策变量y(0,1),一个新的约束M,M取无穷大。这样得到上述两个式子。在y=0时,下式成立,上式无意义(小于等于一个无穷大的数),y=1时,上式成立,下式无意义,符合互斥的概念。

3.1.2理论

混合整数线性规划在Python_最优解_16

 注:q<=p,因为存在互斥的条件,引入决策变量y

混合整数线性规划在Python_动态规划_17

混合整数线性规划在Python_动态规划_18

 注:1)若选择了第i个约束条件,则一式是有意义的不等式,若没有选择,y=1,M无穷大,一式无意义。

         2)yi的和即所有没有选的约束条件的个数,q是所有选了的约束条件,加起来就是p。

3.1.3 例题 

混合整数线性规划在Python_动态规划_19

注:选择了生产线才会生产相应的衣服裤子,所以x和y之间存在联系。引入M为无穷大,以x1为例,若y1=0,不租用生产线,则在matlab中,0*无穷为0,即x1=0,则表示没有生产,符合;若y1=1,租用生产线,则这个式子对x1无意义,x1满足s.t中的约束,符合。

混合整数线性规划在Python_约束条件_20

混合整数线性规划在Python_算法_21

3.2  指派问题(0-1规划问题应用最广泛的问题)
3.2.1最小类(标准指派问题)—— 一般是成本,时间最小
1)标准形式的数学模型

混合整数线性规划在Python_动态规划_22

混合整数线性规划在Python_最优解_23

3.2.2 非标准的指派问题
 1)最大化指派(利益最大化)

 2)人数和工作不等

          人少,增加虚拟的人,效率为0

          工作少,增加虚拟的工作,是可以被任何人完成的效率为0的工作

 3)一个人可以做多项工作——就是对其取0,1不做任何要求

 4)某项工作一定不能被某人做——就是他做这件事的代价M取无穷大

3.2.3 指派问题的匈牙利算法

1)例子

混合整数线性规划在Python_最优解_24

分析:

混合整数线性规划在Python_约束条件_25

混合整数线性规划在Python_算法_26

  2)知识点

     i)匈牙利算法的适用范围:问题求最小值,人数和工作数相等,效率值非负

     ii)匈牙利算法的来源

混合整数线性规划在Python_算法_27

混合整数线性规划在Python_动态规划_28

混合整数线性规划在Python_混合整数线性规划在Python_29

     iii)匈牙利算法的一般步骤

混合整数线性规划在Python_约束条件_30

混合整数线性规划在Python_算法_31

注:不一定是只有一个0元素的开始,是从0最少的行列开始,一般都从行开始。

混合整数线性规划在Python_约束条件_32

 若此时画圈的零元素个数少于阶数,进行(4),若等于阶数,执行下一步。

混合整数线性规划在Python_算法_33

混合整数线性规划在Python_约束条件_34

混合整数线性规划在Python_混合整数线性规划在Python_35

混合整数线性规划在Python_混合整数线性规划在Python_36

4.蒙特卡洛法

4.1 简介

蒙特卡洛法是经过大量事件的统计结果来实现一些确定性问题的计算。
使用蒙特卡洛法必须使用计算机生成相关分布的随机数。

4.2 例子

例如:y = x^2 ,y = 12 - x与X轴在第一象限与X轴围成一个曲边三角形。设计一个随机试验,求该图形的近似值。
 

(这里就结束了~^-^~)