|
混合整数规划与混合整数二次规划引言在数值优化领域中,混合整数规划(MixedIntegerProgramming,MIP)和混合整数二次规划(MixedIntegerQuadraticProgramming,MIQP)是两类重要的优化模型。本文将对这两种规划的基本概念、常用求解方法进行介绍,并通过实例分析帮助大家更好地理解这些规划问题。一、混合整数规划(MIP或MILP)基本概念混合整数规划问题是指在优化过程中,部分优化变量必须取整数值,其他变量则可以取连续值的一类优化问题。典型的MIP问题形式如下:目标方程:min cTx\min\\mathbf{c}^T\mathbf{x}min cTx约束:Ax≤b\mathbf{A}\mathbf{x}\le\mathbf{b}Ax≤b(线性约束)xl≤x≤xh\mathbf{x}_l\le\mathbf{x}\le\mathbf{x}_hxl≤x≤xh(边界约束)xi∈Z\mathbf{x}_i∈Zxi∈Z,xj∈R\mathbf{x}_j∈Rxj∈R(forsomei,othersj)(整数约束)这里,c\mathbf{c}c和x\mathbf{x}x是向量,A\mathbf{A}A是矩阵,b\mathbf{b}b是约束条件。换句话说,混合整数规划的目标函数与线性规划不同的是,优化变量的定义域可能是整数,这就给求解带来了极大的难度。二、混合整数二次规划基本概念混合整数二次规划是混合整数规划的扩展,其目标函数是一个二次函数,而约束条件通常为一次形式。典型的MIQP问题形式如下:目标方程:min xTQx+cTx\min\\mathbf{x}^{T}\mathbf{Q}\mathbf{x}+\mathbf{c}^T\mathbf{x}min xTQx+cTx约束:Ax≤b\mathbf{A}\mathbf{x}\le\mathbf{b}Ax≤b(线性约束)xl≤x≤xh\mathbf{x}_l\le\mathbf{x}\le\mathbf{x}_hxl≤x≤xh(边界约束)xi∈Z\mathbf{x}_i∈Zxi∈Z,xj∈R\mathbf{x}_j∈Rxj∈R(forsomei,othersj)(整数约束)上述变量定义与MIP完全相同,可以看到MIQP其实就是再MIP的目标函数的基础上,加上了一个二次项。三、常见求解方法1.分支定界法BnB(最常用)分支定界法是求解MIP和MIQP问题的经典方法之一。其基本思想是将问题分解为一系列子问题,通过构建一个分支树来逐步逼近最优解。分支定界法主要包括三个步骤:分支、定界和剪枝。简单说一下基于LP的BnB方法:首先,对初始的MILP删除所有整数约束,得到原MILP的线性规划松弛。接下来,求解这个线性规划松弛(LP)。如果得到的解恰好满足所有整数约束,那么这个解就是原始MILP的最优解,运算终止。如果解没有满足所有整数约束(这种情况较为常见),则需要选择某个整数约束实际上得到小数值的变量进行“分支”。为了便于说明,假设这个变量是x,其在LP解中的值是5.7。我们可以通过施加x≤5.0x≤5.0x≤5.0和x≥6.0x≥6.0x≥6.0的限制来排除该值5.7。如果用PPP表示原MILP问题,用P1P_1P1表示新的MILP(增加了x≤5.0x≤5.0x≤5.0的约束),用P2P_2P2表示新的MILP(增加了x≥6.0x≥6.0x≥6.0的约束)。变量xxx被称为分支变量,我们在xxx上进行了分支,产生了两个子MILPP1P_1P1和P2P_2P2。显然,如果我们能够求解P1P_1P1和P2P_2P2的最优解,那么其中较好的解就是原始问题PPP的最优解。通过这种方式,我们用两个更简单(更少整数约束)的MILP取代了PPP。我们现在将相同的思想应用于这两个子MILP,并在必要时选择新的分支变量。这样生成了所谓的搜索树。搜索过程生成的MILP称为树的节点,PPP为根节点。叶子节点是尚未分支的所有节点。如果所有叶节点的解都满足原MILP的整数约束,那么原始MILP问题就得到了求解。2.割平面法(CuttingPlane)割平面法通过添加额外的约束条件(即割平面)来缩小可行解空间,从而更快地找到最优解。对于MIP和MIQP问题,可以通过不断添加有效的割平面来逼近整数解。割平面通常认为是MIP中提升计算效率的最重要技巧。其基本思想为:思想是通过去除一些非整数解,就想MIP-basedpresolve一样,达到tightenformulation的目的。割平面不像branching,branching会产生两个子问题(两个分支),cuttingplane只是切掉一些边角(如下图),不会产生2个MIP。3.启发式算法(Heuristic)启发式算法是一类通过经验和启发信息来快速找到满意解的方法。常见的启发式算法包括遗传算法、模拟退火算法和粒子群优化算法。这些方法通常不能保证找到全局最优解,但可以在较短时间内找到质量较好的解。4.混合算法(HybridAlgorithms)混合算法结合了多种求解方法的优点,以期提高求解效率和解的质量。例如,可以将启发式算法与分支定界法结合,利用启发式算法快速找到初始解,然后通过分支定界法进行精细优化等等。四、实例代码求解本节我们举一个简单的生产实例,来说明如何使用Python的Pulp库进行MIP和MIQP问题求解,问题描述如下:1.生产计划问题(MILP问题)假设某工厂生产两种产品产品aaa和产品bbb,每种产品都有其生产成本和销售利润,其中:产品aaa的生产成本为10元,销售价格为15元。产品bbb的生产成本为20元,销售价格为30元。该工厂的生产能力和原材料有限,假设:每月生产能力为70单位。每月原材料限制为150单位,生产产品aaa消耗1单位原材料,生产产品bbb消耗3单位原材料。问题一:如何决定每种产品数量,以实现最大化利润?问题分析:从问题中,我们可以看出,待优化的决策变量为产品aaa和产品bbb的数量,用x1x_1x1和x2x_2x2表示,其中x1x_1x1和x2x_2x2必须取整数值,这个问题可以建模为一个MIP或MILP问题。其中,我们的目标函数为:max(15−10)x1+(30−20)x2\max{(15-10)x_1+(30-20)x_2}max(15−10)x1+(30−20)x2约束为:x1+x2≤70x_1+x_2\le70x1+x2≤70x1+3x2≤150x_1+3x_2\le150x1+3x2≤150x1,x2∈Z+x_1,x_2\inZ^{+}x1,x2∈Z+Python求解代码(基于Pulp库)importpulpasplimportnumpyasnpdefsolver_main()robLp=pl.LpProblem("ProbLp",sense=pl.LpMaximize)print(ProbLp.name)x1=pl.LpVariable('x_1',lowBound=0,upBound=None,cat='Integer')x2=pl.LpVariable('x_2',lowBound=0,upBound=None,cat='Integer')ProbLp+=(5*x1+10*x2)#AddObjective#AddConstraintsProbLp+=(x1+x2=0,mat_A@x
|
|