0

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

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

total_joy = candies * joy_per_candy

在低于 1 个糖果的情况下,joy_per_candy 为 10;10 个糖果产生一个joy_per_candy0。这是一条快乐曲线。简单的数学表明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

4

1 回答 1

0

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

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

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

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

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

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

m.setObjective((100/9)*(candies - 1) - (5/9)*(candies * candies - 1),GRB.MAXIMIZE)
于 2016-03-11T23:23:18.327 回答