如何为PuLP库定义自定义成本函数并调用其中的优化变量?
PuLP自定义成本函数使用指南
核心前提说明
PuLP是专门的线性规划求解库,仅支持线性的目标函数和约束条件,你传入的自定义函数返回值必须是PuLP可识别的线性表达式,不能是普通Python数值。
你当前代码的第一个问题
连续类型变量的类别参数拼写错误,应为Continuous而非Continues,会直接导致变量定义失败。
自定义函数中使用PuLP变量的方案
情况1:自定义计算逻辑为线性运算
PuLP的变量本身支持标准线性运算(加减、与常数相乘),你直接在自定义函数中按正常运算逻辑写即可,返回的结果就是PuLP可直接识别的线性目标表达式,不需要额外转换。
示例代码如下:
import pulp def opt_funct(bins, reg): # 示例线性计算逻辑,可替换为你自己的线性计算规则 return 25 * bins + 80 * reg + 12 model = pulp.LpProblem(name="small-problem", sense=pulp.LpMinimize) bins = pulp.LpVariable(name="bins", lowBound=1, upBound=100, cat='Integer') reg = pulp.LpVariable(name="reg", lowBound=0.0001, upBound=1.0, cat='Continuous') # 直接将自定义函数返回的表达式作为目标加入模型 model += opt_funct(bins, reg) # 求解,关闭日志输出可以加msg=False参数 status = model.solve(pulp.PULP_CBC_CMD(msg=False))
情况2:自定义计算逻辑为非线性运算
PuLP原生不支持非线性目标,有两种解决路径:
- 对非线性逻辑做线性化转换:比如分段函数、两变量乘积(其中一个是0-1变量)等常见非线性形式,都可以通过混合整数线性规划的线性化技巧转换为线性表达式,再返回给模型。
- 更换支持非线性规划的求解库:如果非线性逻辑无法线性化,可以改用gekko、scipy.optimize等支持非线性规划的工具,混合整数非线性规划可以搭配bonmin、couenne等求解器使用。
优化后变量值提取方式
求解完成后,调用变量的value()方法即可拿到优化后的数值:
# 提取优化后的变量值 optimal_bins = bins.value() optimal_reg = reg.value() # 提取最优目标值 optimal_cost = pulp.value(model.objective)
内容的提问来源于stack exchange,提问作者nagoldfarb
相关产品推荐
相关产品推荐

