(二)整数规划

第二章——整数规划


概论

定义

变量(部分或全部)限制为整数时,称为整数规划。若在线性规划模型中,变量限制为整数,则称为整数线性规划。目前所流行的求解整数规划的方法,往往适用于整数线性规划。目前还没有一种方法能有效地求解一切整数规划

说明

  1. 不加说明一般指整数线性规划
  2. 整数线性规划分为完全与混合整数规划

特点

  1. 由无限制到整数规划可能变化情况:
    • 最优解不变
    • 无最优解
    • 有可行解,但是最优解变差
  2. 整数规划最优解不能按照实数最优解简单取整而获得

求解方法

  1. 分枝定界法——可求纯或混合整数线性规划
  2. 割平面法——可求纯或混合整数线性规划
  3. 隐枚举法——求解“0-1”整数规划
    • 过滤隐枚举法
    • 分枝隐枚举法
  4. 匈牙利算法——解决指派问题(“0-1”规划特殊情形)
  5. 蒙特卡洛法——随机方法求解各种类型

分枝定界法

  1. 定义:对有约束条件的最优化问题(其可行解为有限数)的所有可行解空间恰当地进行系统搜索,这就是分枝与定界内容。

  2. 主要思路:把全部可行解空间反复地分割为越来越小的子集,称为分枝;并且对每个子集内的解集计算一个目标下界(对于最小值问题),这称为定界。和已知界比较后许多子集可不予考虑,这称剪枝。

    实际上相当于区间套定理

  3. 适应范围:解纯整数或混合的整数规划问题

  4. 应用:求解生产进度问题、旅行推销员问题、工厂选址问题、背包问题及配问题等

0—1型整数规划

  1. 实际例子:

    • 投资场所的选定——相互排斥(要么执行,要么不)的计划
    • 相互排斥的约束条件——条件有很多,但是只要求其中之一成立。
    • 关于固定费用的问题(Fixed Cost Problem)
      1. 有些固定费用(固定成本)的问题不能用一般线性规划来描述,但可改变为混合整数规划来解决。
      2. 通常利用足够小的正数与足够大的正数可以把离散的整数规划化成线性规划。
  2. 0 −1型整数规划解法之一(过滤隐枚举法):

    1. 穷举法对于维度大的情况基本不可能。而设计一些方法,只检查变量取值的组合的一部分,就能求到问题的最优解。这样的方法称为隐枚举法(Implicit Enumeration),分枝定界法也是一种隐枚举法

      当然,对有些问题隐枚举法并不适用,所以有时穷举法还是必要的

    2. 基本思路也是在优化过程中逐渐增加约束条件

蒙特卡洛法

一种随机取样方法

背景

前面介绍的常用的整数规划求解方法,主要是针对线性整数规划而言,而对于非线性整数规划目前尚未有一种成熟而准确的求解方法,因为非线性规划本身的通用有效解法尚未找到,更何况是非线性整数规划

基本原理:概率论
  • 可以不用像显示枚举那样计算那么多,采用蒙特卡洛计算较少步骤同样可以找到满意解

    但是可以具体计算一定不要用蒙特卡洛

  • 实现步骤

    function [f,g]=mengte(x);
    f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)-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)-800
    2*x(1)+x(2)+6*x(3)-200
    x(3)+x(4)+5*x(5)-200];
    %定义目标函数f 和约束向量函数g
    
    %mainint.m实现优化
    rand('state',sum(clock));  %初始化随机数发生器
    p0=0;
    tic    %计时开始
    for i=1:10^6
     x=randi([0,99],1,5); %产生一行五列的区间[0,99]上的随机整数
     [f,g]=mengte(x);
     if all(g<=0)
         if p0%记录下当前较好的解
         end
     end
    end
    x0,p0
    toc    %计时结束
  • 解整数规划通常lingo**专用**软件更方便

指派问题的计算机求解

  1. 整数规划问题的求解可以使用 Lingo 等专用软件。对于一般的整数规划问题,无法直接利用Matlab 的函数,必须利用Matlab 编程实现分枝定界解法和割平面解法。但对于指派问题等0 −1整数规划问题,可以直接利用Matlab 的函数bintprog 进行求解

  2. 给定指派矩阵求解例子如下

    clc, clear
    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(:); 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=intlinprog(c,intcon,[],[],a,b,lb,ub);
    x=reshape(x,[5,5])
  3. 同样可以用lingo求解

生产与销售计划问题

通常涉及分段函数定义的优化,有以下三种思路:

  1. 可以通过分解的方法化成几个个线性的
  2. 引入 0-1 变量转化为线性约束
  3. 直接处理分段线性函数

推荐使用法2、3。并且3更具一般性:具体^见37页^


你可能感兴趣的:(数学,数学建模)