【问题标题】:Quadratic objective term in Gurobi Python interfaceGurobi Python 界面中的二次目标项
【发布时间】:2015-10-06 17:13:05
【问题描述】:

我面临二次客观项的问题。为了说明我的意图,我编写了一个非常简单的代码。

代码解释:我们想给一个女孩糖果。女孩收到 1 颗糖果 (joy_per_candy) 的喜悦取决于她收到的糖果总数。我们给她的糖果越多,她的joy_per_candy就越少。目标是最大化她的总快乐,这是一个二次项:

total_joy = candies * joy_per_candy

在以下情况下,1 颗糖果产生 10 的joy_per_candy; 10 颗糖果产生的 joy_per_candy 为 0。这里是 joy curve。简单的数学表明total_joy 最大化candies = 5

我该如何解决这个问题?

    joy_curve = [(1,10),(10,0)]
    m = Model('candy')
    candies=m.addVar(ub=joy_curve[1][0])
    joy_per_candy=m.addVar(ub=joy_curve[0][1])
    m.update()
    total_joy=QuadExpr(candies*joy_per_candy)
    m.setObjective(total_joy,GRB.MAXIMIZE)
    m.optimize()

结果:

优化具有 0 行、2 列和 0 个非零值的模型。

模型有 1 个二次目标项

矩阵范围[0e+00, 0e+00]

目标范围 [0e+00, 0e+00]

边界范围 [3e+00, 1e+01]

RHS 范围 [0e+00, 0e+00]

预求解时间:0.00s

GurobiError

【问题讨论】:

    标签: mathematical-optimization gurobi


    【解决方案1】:

    问题主要在于您对模型的规范。

    您应该首先在纸上写出您的目标的数学表达式。您的快乐曲线最自然地被解释为系数的规范,而不是决策变量。您已经使用它来指定每个糖果的边际(即额外)快乐。您的目标是作为糖果数量函数的快乐。这是边际快乐函数的总和或积分。

    您正在尝试将表示完全快乐的表达式写成糖果中的线性表达,即每个糖果给定的快乐,即每个糖果的快乐和糖果数量的双线性。总喜悦没有这样的表达,因为每个糖果的喜悦随着糖果数量的变化而变化,而且无论如何您都无法在模型中选择每个糖果的喜悦。

    因此,从表面上看你的快乐曲线并将其整合,你的目标应该是

    (100/9)*(糖果 - 1) - (5/9)*(糖果^2 - 1)。

    有点奇怪,因为边际收益曲线(快乐曲线)的斜率为 -10/9。因此,您将目标设置为:

    m.setObjective((100/9)*(candies - 1) - (5/9)*(candies * candies - 1),GRB.MAXIMIZE)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 2019-12-14
      • 2021-09-22
      相关资源
      最近更新 更多