GEKKO添加等式约束时出现Solution Not Found错误的原因咨询
GEKKO求解优化问题出现
Solution Not Found错误的原因分析 问题场景
使用GEKKO求解优化问题时抛出Exception: @error: Solution Not Found错误,原始代码如下:
from gekko import GEKKO import pandas as pd import numpy as np m = GEKKO(remote=True) alpha=[6.97, 4.97, 6.55] beta = [-0.04, -0.11, -0.1] MP = [2707.2, 2213.3, 1904.1] Plower = [1700, 1400, 1100] Pupper = [5000, 5000, 5000] h= 250 ; b= 150 ; c= 100 T= len(alpha) D = m.Array(m.Var, T ,lb=-0, integer=False) P = m.Array(m.Var, T ,lb=-0, integer=False) m.Maximize( sum(D[t]*(P[t]-MP[t]) for t in range (T))) m.Equations(D[t]==alpha[t]+beta[t]*P[t] for t in range (T)) #bound m.Equations(P[t]>= Plower[t]for t in range (T)) m.Equations(P[t]<= Pupper[t] for t in range (T)) m.options.SOLVER=1 m.solve(disp=True) # solve on public server
将目标函数改写为m.Maximize( sum((alpha[t]+beta[t]*P[t])*(P[t]-MP[t]) for t in range (T)))并移除等式约束后,求解成功。
错误原因分析
- 等式约束
D[t]==alpha[t]+beta[t]*P[t]本身无逻辑错误,它只是建立了决策变量D和P之间的线性关联。 - 求解失败的核心是模型的数值求解特性差异:
- 原始模型中,目标函数通过D间接引入P的非线性,结合等式约束后,数学上和改写后的模型等价,但GEKKO使用的APOPT求解器(
SOLVER=1)在处理这种隐式非线性时,可能因变量初始化、梯度计算的数值精度问题,导致迭代过程中无法找到可行解或出现数值发散。 - 改写后的模型直接将目标函数展开为P的显式二次函数,减少了决策变量数量(移除了D),求解器可以更高效地计算梯度和Hessian矩阵,收敛难度大幅降低,因此能成功求解。
- 原始模型中,目标函数通过D间接引入P的非线性,结合等式约束后,数学上和改写后的模型等价,但GEKKO使用的APOPT求解器(
- 补充说明:原始代码中D和P的下界设为
lb=-0(等价于lb=0),结合beta为负的情况,alpha[t]+beta[t]*P[t] >=0在P的上下界范围内是有解的(改写后求解成功可验证),因此这不是导致求解失败的原因。
内容的提问来源于stack exchange,提问作者Berk Karasu
相关产品推荐
相关产品推荐

