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

如何在Gekko的MILP目标函数中调用自定义函数?求解遇阻求助

Gekko求解MILP时提前终止的解决方法

你的问题核心是目标函数的定义方式不对——Gekko要求目标函数必须是基于Gekko变量构建的可微分表达式,不能直接传入普通Python函数返回的数值。如果K_func是纯Python实现的数值计算(比如用普通加减乘除、循环、条件判断),Gekko无法自动计算优化所需的梯度,求解器只会计算初始点的目标值后就认为已经完成优化,直接终止。

正确的实现步骤:

  1. 重构K_func为Gekko兼容的形式
    必须用Gekko的内置函数(比如m.sin()、m.log()、m.if3())和Gekko变量来实现函数逻辑,不能用纯Python的数值操作。比如如果你的K_func是计算x1*x2 + sqrt(x1+x2),要写成:

    def K_func(data, x1, x2):
        # 用Gekko的内置函数,x1、x2是Gekko变量
        return x1*x2 + m.sqrt(x1 + x2)
    

    这样Gekko才能识别表达式,自动计算梯度参与优化。

  2. 如果K_func是黑箱函数(无法转换为Gekko表达式)
    可以用替代模型拟合函数:

    • 生成多组(x1,x2)的样本点,计算对应的目标值
    • 用Gekko的m.fit()函数拟合出多项式、样条或者神经网络模型,用这个替代模型作为目标函数
  3. 调整求解器参数(可选)
    你的参数里minlp_max_iter_with_int_sol=10可能太小,导致求解器找到第一个整数解就停止。可以适当调大(比如改成50),让求解器继续寻找更优解:

    m.solver_options = ['minlp_maximum_iterations 500', \
    'minlp_max_iter_with_int_sol 50', \
    'minlp_as_nlp 0', \
    'nlp_maximum_iterations 50', \
    'minlp_branch_method 1', \
    'minlp_integer_tol 0.05', \
    'minlp_gap_tol 0.01']
    

修正后的完整示例代码:

from gekko import GEKKO

m = GEKKO()
m.options.SOLVER=1  # APOPT求解器

# 调整求解器参数
m.solver_options = ['minlp_maximum_iterations 500', \
'minlp_max_iter_with_int_sol 50', \
'minlp_as_nlp 0', \
'nlp_maximum_iterations 50', \
'minlp_branch_method 1', \
'minlp_integer_tol 0.05', \
'minlp_gap_tol 0.01']

# 整数变量
m.x1 = m.Var(value=20, lb=1, ub=90, integer=True)
m.x2 = m.Var(value=60, lb=2, ub=91, integer=True)

# 重构为Gekko兼容的目标函数
def K_func(data, x1, x2):
    # 这里替换成你的实际逻辑,必须用Gekko变量和内置函数
    return x1*x2 + m.sqrt(x1 + x2)

data = None  # 替换成你的实际数据
m.Obj(K_func(data, m.x1, m.x2))

# 求解
m.solve(disp=True)

# 打印结果
print(f"x1: {m.x1.value[0]}, x2: {m.x2.value[0]}")

关键注意点:

  • 所有涉及优化变量的计算都必须用Gekko的变量和函数,不能用Python的普通数值类型
  • 如果K_func里有条件判断,要用Gekko的m.if3()、m.abs()等函数,不能用if/else语句
  • 若必须使用黑箱函数,需要先拟合替代模型,否则APOPT无法处理不可微的MINLP问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:55:15