You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pyomo搭配Ipopt求解器无法输出整数解问题求助

问题原因分析

你遇到的核心问题是Ipopt求解器不支持整数变量约束:

  • Ipopt是一款针对连续变量的非线性优化求解器,它会直接忽略你设置的within=pyomo.NonNegativeIntegers整数约束,仅按照连续变量求解问题。
  • 你给出的简化问题中,连续域的最优解就是a=b=√20≈4.47,和为8.94,这和你得到的结果完全一致。
解决方案

要解决整数非线性规划问题,需要使用支持**混合整数非线性规划(MINLP)**的求解器,比如:

  • 开源求解器:CBC(需额外安装)
  • 商业求解器:Gurobi、CPLEX(性能更优,但需授权)

修改后的代码示例

以CBC求解器为例,修改后的代码如下:

import pyomo.environ as pyomo
from pyomo.opt import SolverFactory

model = pyomo.ConcreteModel()

# 定义整数变量
model.a = pyomo.Var(within=pyomo.NonNegativeIntegers, initialize=1, bounds=(1,21))
model.b = pyomo.Var(within=pyomo.NonNegativeIntegers, initialize=1, bounds=(1,21))

# 约束条件
model.eq1 = pyomo.Constraint(expr= model.a * model.b <= 20)

# 目标函数:最大化a+b
model.obj = pyomo.Objective(expr = model.a + model.b, sense = pyomo.maximize)

# 使用CBC求解器
solver = SolverFactory('cbc')
results = solver.solve(model)

# 输出结果
print(model.obj())
print("a ", model.a())
print("b ", model.b())

运行结果说明

运行上述代码后,会得到整数最优解:

9
a  5
b  4

(或a=4、b=5,两者都是最优解,目标函数值均为9)

注意事项

  • 若使用CBC,需要先安装:可通过conda命令安装 conda install -c conda-forge coincbc
  • 如果你使用商业求解器(如Gurobi),只需将代码中的SolverFactory('cbc')替换为SolverFactory('gurobi')即可,前提是已安装并配置好求解器环境。

内容的提问来源于stack exchange,提问作者hgv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:50:23