最优化算法—(2)整数规划

上一篇文章入口:最优化算法—(1)基础理论关键

1.整数规划问题

1.1.定义

       在数学规划问题中一部分变量或者全部变量为整数变量的话,该数学规划问题就属于整数规划问题。如下所示是线性整数规划(Integer Linear Programming) 问题:
在这里插入图片描述

 

1.2.变量描述

       一般来说,之所以在模型中要引入整数变量主要原因有2点:
    1)我们所需要描述的变量来自生活实际,而这些变量都是整数的。例如:要表示多少架飞机,多少辆汽车,多少个人等等 ;
    2)我们要描述逻辑,Yes 或者 No,乃至于更复杂的逻辑关系。我们经常会用1代表Yes,0代表No,实际上准确的来说说 它们已经是 Bool 变量了。Bool 变量满足 Bool 变量的运算法则,例如 与或非这些,而不满足加减乘除的运算规则。
 
 

1.3.问题分类

在这里插入图片描述

 
 

1.4.整数规划难点

1.4.1.与连续优化问题区别

       1)有限多个可行点
    整数规划问题的可行域大多数情况下包含有限多个可行点,而连续优化问题正常情况下可行域包含的可行点是无穷多个。

       2)不可微
    虽然连续优化问题的可行解有无数多个,但通过微积分的原理我们往往可以建立出针对连续优化问题的最优性条件,比如KKT条件就是典型的代表。如果是可微的凸优化问题,那可以给出全局最优的充要条件的。而在整数规划问题中,问题天生就不可微分就导致了我们无法使用微积分的工具,自然也很难得到最优性条件,同时由于天生是离散的 就注定了肯定也无法满足凸性。

 

1.4.2.计算复杂度

       绝大部分的整数规划问题的可行域包含有限多个可行点,一个最简单直观的想法就是穷举所有的可行点。设 X ={0,1}n是某个问题的可行域。假设有一台超级计算机,每秒钟可以计算该问题的目标函数 108 (1亿次)。
    当n=30 时,我们需要计算时间为10秒
    当n=40 时,我们需要计算时间为10000 秒,约折合3个小时。
    当n=50 时,我们需要计算时间为1125899906842624 秒,约折合8年半
    当n=100 时,我们需要计算时间为约折合4×10*14 年。这是什么概念呢? 地球诞生到现在大约45亿年左右,而这个计算时间大约是地球诞生到现在的十万倍。

 

1.4.3.求解思路

       ① 穷举法
    ② Round取整法
先求解相对应的连续优化问题(舍弃整数约束),然后对所求得的解进行舍入(可能是四舍五入,也可能是其它的舍入方法),得到一个整数解。这个方法有2个问题:1是很难通过舍入得到一个满足约束的可行解;2即使能得到一个可行解,其质量可能往往很差。
    ③ 启发式方法(Heuristic method)
其典型代表为贪婪法,例如在求解背包问题中,每次总是先放入价值最大的问题,直到放不进物品为止。启发式方法一般来说计算复杂度很低,可以快速的获得一个可行解。启发式方法很多时候也比较难以保证解的质量。

 

2.常用的整数规划算法

       (1)分枝定界法:可求纯或混合整数线性规划。
    (2)割平面法:可求纯或混合整数线性规划。
    (3)隐枚举法:用于求解0-1整数规划,有过滤法和分枝法。
    (4)匈牙利法:解决指派问题(0-1规划特殊情形)。
    (5)蒙特卡罗法:求解各种类型规划。

 

2.1.分枝定界法

       分支定界法,是求解混合整数线性规划问题的一种精确解法,分支定界法将解空间划分为一棵搜索树,通过松弛整数约束(整数—>连续),不断地求解子空间上的线性规划问题,并不断缩减原问题上界与下界之差,从而求解原问题。具体地,设有最大化的整数规划问题 A,与它相应的线性规划为问题 B从解问题 B 开始若其最优解不符合 A 的整数条件,那么 B 的最优目标函数必是 A的最优目标函数Z的上界,记作Zu; 而A的任意可行解的目标函数值将是Z的一个下界Zl。分枝定界法就是将 B的可行域分成子区域的方法。逐步减小Zu和增大Zl,最终求到 Z*.
    机器学习辅助整数规划求解算法——分支定界法(branch and bound)

 
在这里插入图片描述

  
 

       算法流程:

在这里插入图片描述

 

2.2.割平面法

       割平面法解题步骤
   ① 用单纯或对偶单纯形法求解(IP)对应的松弛问题(LP)
   (1)若(LP)没有可行解,则(IP)也没有可行解,停止计算
   (2)若(LP)有最优解,并符合(IP)的整数条件,则(LP)的最优解即为(IP)的最优解,停止计算。
   (3)若(LP)有最优解,但不符合(IP)的整数条件,转入下一步
   ② 从(LP)的最优解中,选取一个和整数差值最大的x,将最优单纯形表中该行的系数分解为整数部分和小数部分,并以该行为源行,作割平面方程。
   ③ 将所得的割平面方程作为一个新的约束条件置于单纯形表中,用对偶单纯形法求出新的最优解。

       割平面法详解:

       代码实现:

 
 

2.3.隐枚举法

       解0-1型整数线性规划最直观的方法,就是枚举法,即检查变量取值为0或1的每一种组合,比较目标函数值以求得最优解,这需要检查变量取值的2n个组合。
    对于变量个数n较大(例如n>10),这几乎是不可能的。因此常设计一些方法,只检查变量取值的组合的一部分,就能求到问题的最优解。这样的方法称为隐枚举法(implicit enumeration). 分枝定界法也是一种隐枚举法。
    例如 目标函数 max Z = 3X1 - 2X2 + 5X3
    s.t. X1 + 2X2 - X3 <= 2
    X1 + 4X2 + X3 <= 4
    X1 + X2 <= 3
    4X1 + X3 <= 6
    X1,X2,X3 = 0或1

       解题时可根据目标函数加入一个约束条件,称为过滤的条件。
随机选取一个可行解,如(0,0,0),得到Z = 0,得到过滤条件※:
max Z = 3X1 - 2X2 + 5X3≥0
    将过滤条件加入到约束条件中,按照※, ① , ② , ③ ,④的顺序排好,对每个解依次代入约束条件左侧,求出数值,看是否适合不等 式条件,如某一条件不适合,同行以下各条件就不必再检查,因而就减少了运算次数。
    
在这里插入图片描述

       0-1型整数线性规划–隐枚举法

    

2.4.匈牙利法

       目标跟踪系列-匹配-1. 匈牙利&KM匹配算法
    整数规划—指派模型与匈牙利算法

    

2.5.蒙特卡罗法

       整数规划由于限制变量是整数,增加了求解难度,但整数解是有限个,所以可以采用枚举法。当枚举个数很多时,显性枚举是不现实的,但利用蒙特卡罗随机取样法,在一定的计算量下是可以得到满意解的。
    参考【优化算法】03. 整数规划
    
    求解如下非线性整数规划问题:
在这里插入图片描述
    
    若用显枚举法,共需 1005=1010 个点,计算量非常大。但用蒙特卡罗法随机计算 106 个点,便可找到满意解。
    Matlab代码:

rand('state',sum(clock));p0=0;ticfor i=1:10^6
    x=99*rand(5,1);
    x1=floor(x);
    x2=ceil(x);
    [f,g]=fun5(x1);
    if sum(g<=0)==4
        if p0<=f
            x0=x1;
            p0=f;
        end
    end
    [f,g]=fun5(x2);
    if sum(g<=0)==4
        if p0<=f
            x0=x2;
            p0=f;
        end
    endendx0, p0toc

function [f,g]=fun1(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(1)=sum(x)-400;g(2)=x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-800;g(3)=2*x(1)+x(2)+6*x(3)-200;g(4)=x(3)+x(4)+5*x(5)-200;

 

3.库函数的使用

       intlinprog是matlab中用于求解混合整数线性规划(Mixed-integer linear programming)的一个函数。
    Matlab中 intlinprog函数用法简介:
    
   或可调用python中的整数规划求解器ortools.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深耕智能驾驶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值