最优化算法—整数规划

宇宙微尘
2025-01-23 12:04:02
本帖最后由 宇宙微尘 于 2025-1-23 12:07 编辑

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)蒙特卡罗法:求解各种类型规划。

2.1.分枝定界法

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

算法流程:

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,得到过滤条件※:

将过滤条件加入到约束条件中,按照※, ① , ② , ③ ,④的顺序排好,对每个解依次代入约束条件左侧,求出数值,看是否适合不等 式条件,如某一条件不适合,同行以下各条件就不必再检查,因而就减少了运算次数。

2.4.蒙特卡罗法

整数规划由于限制变量是整数,增加了求解难度,但整数解是有限个,所以可以采用枚举法。当枚举个数很多时,显性枚举是不现实的,但利用蒙特卡罗随机取样法,在一定的计算量下是可以得到满意解的。

求解如下非线性整数规划问题:

若用显枚举法,共需 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)的一个函数。

或可调用python中的整数规划求解器ortools.
————————————————

本文转载自CSDN博主:深耕智能驾驶

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/jane0819/article/details/132707241

246
0
0
0
关于作者
相关文章
  • 交替方向乘子法(ADMM):原理、算法流程、实例与扩展应用综述 ...
    本文全面介绍了ADMM算法的定义、背景、起源与延伸、问题模型、增广拉格朗日函数、算法流程以及应 ...
    了解详情 
  • 求解整数规划问题的割平面法和分支定界法
    整数规划整数规划问题是优化变量必须取整数值的线性或非线性规划问题,不过,在大多数情况下,整 ...
    了解详情 
  • 优化算法 | 混合整数规划问题之Benders解耦法
    算法背景Benders分解算法是 J.F.Benders 在1962年首先提出的,旨在解决某些大规模优化问题,其核 ...
    了解详情 
  • 【数学建模】求解混合整数线性规划 MILP 问题
    实验介绍混合整数线性规划(Mixed Integer Linear Programming,MILP)是一类优化问题,其中目标 ...
    了解详情 
在本版发帖返回顶部
快速回复 返回顶部 返回列表