【问题标题】:Gurobi: there is a "max(x, 0)" in the objective functionGurobi:目标函数中有一个“max(x, 0)”
【发布时间】:2022-01-11 08:18:09
【问题描述】:

在我的多目标模型中,目标中有一个类似“max(x ,0)”的结构:

目标函数包含“分段”函数的一部分。

代码如下:

F6 = gp.quicksum(max((1 - (gp.quicksum(
    uncertainty_prob_regular[(i, j, t)] * proportion_goods_supplier_regular_scenario[(i, j, t)] + uncertainty_prob_contract[(i, j, t)] *
    proportion_goods_supplier_contract_scenario[(i, j, t)] + uncertainty_prob_emergency[(i, j, t)] * proportion_goods_supplier_emergency_scenario[
        (i, j, t)] for j in supplier))), 0) * demand_list[i] * alpha_price * sales_prices_list[i] for i, t in assign_list2)

错误是:

File "src\gurobipy\gurobi.pxi", line 3349, in gurobipy.quicksum
File "src\gurobipy\linexpr.pxi", line 434, in gurobipy.LinExpr.__richcmp__

我猜可能是 python 中的“max”方法和 Gurobi 中的“quicksum”方法不兼容。

【问题讨论】:

  • Gurobi 拥有max_()。有点明显:请参阅文档。
  • @ErwinKalvelagen:不能用于目标 - 需要作为约束。

标签: python optimization mathematical-optimization gurobi nonlinear-optimization


【解决方案1】:

目标函数必须是标准形式。但是,您可以添加其他变量来表示数量 max(0, expr[t,i])。虽然您可以使用max general constraint,但只需将新变量 pos[t,i] 定义为非负数(LB=0,这是默认值)并添加约束 pos[t,i] >= expr[ t,i].

【讨论】:

    【解决方案2】:

    一开始想通过两个附加变量的约束关系来表达“max(x ,0)”。喜欢: 如果 x1>=0 则 x2=1;否则,如果 x1

    但我失败了,然后我在 Gurobi REFERENCE MANUAL 中找到了“Model.addGenConstrMax()”方法。

    # two extra variables:
    continue_check_origin = model.addVars(check_origin, vtype=GRB.CONTINUOUS, name='continue_check_origin')
    continue_check_mature = model.addVars(check_mature, vtype=GRB.CONTINUOUS, name='continue_check_mature')
    
    # constraints of check_mature and check_origin
    for i in goods:
        for t in scenario:
            model.addGenConstrMax(continue_check_mature[(i, t)], [continue_check_origin[(i, t)]], 0, name='origin_mature_equal_max')
    

    【讨论】:

    • 这可行,但我建议的答案更有效。
    猜你喜欢
    • 2019-12-14
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    相关资源
    最近更新 更多