我遇到了二次目标术语的问题。为了说明我的意图,我编写了一个非常简单的代码。
代码说明:我们想给一个女孩送糖果。女孩对收到1个糖果(joy_per_candy
)的喜悦取决于她收到的糖果总数。我们给她的糖果越少,她就越joy_per_candy
。目标是最大化她的总快乐,这是一个二次项:
total_joy = candies * joy_per_candy
在1以下的情况下,糖果产生的joy_per_candy为10; 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
答案 0 :(得分:0)
问题主要在于您对模型的规范。
你应该首先在纸上写出你的目标的数学表达式。您的喜悦曲线最自然地被解释为系数的规范,而不是决策变量。你用它来指定每个糖果的边际(即附加)快乐。您的目标是作为糖果数量的函数的总快乐。这是边际喜悦函数的总和或积分。
你试图把每个糖果给定喜悦的糖果中的总喜悦表达为线性,即每个糖果的喜悦和糖果数量的双线性。总体喜悦并没有这样的表达,因为每个糖果的喜悦随着糖果数量的变化而变化,而且无论如何你都无法在你的模型中选择每个糖果的喜悦。
因此,将你的喜悦曲线置于面值并整合它,你的目标应该是
(100/9)*(糖果-1) - (5/9)*(糖果^ 2-1)。
这有点奇怪,因为边际效益曲线(欢乐曲线)的斜率是-10/9。所以你要把目标设定为:
m.setObjective((100/9)*(candies - 1) - (5/9)*(candies * candies - 1),GRB.MAXIMIZE)