2015-10-06 69 views
0

我面臨着二次客觀術語的問題。爲了說明我的意圖,我編了一個非常簡單的代碼。Gurobi Python界面中的二次客觀術語

代碼解釋:我們要給一個女孩糖果。女孩喜歡收到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]

Presolve時間:0.00S

GurobiError

回答

0

該問題主要出現在您對模型的說明中。

你應該首先在紙上寫出你的目標的數學表達式。你的喜悅曲線最自然地被解釋爲係數的規格,而不是決定變量。你已經用它來指定每個糖果的邊際(即額外)喜悅。你的目標是作爲糖果數量的函數的總數喜悅。這是邊際快樂函數的總和或積分。

你試圖寫出糖果線性的總喜悅表達式,即每個糖果給定喜悅的雙線性,即每個糖果喜悅的雙線性和糖果的數量。總的喜悅沒有這樣的表達,因爲每個糖果的快樂隨着糖果數量的變化而變化,並且無論如何你都無法選擇糖果的喜悅。

所以把你的快樂曲線面值和整合它,你的目標應該是

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

這有點奇怪,因爲邊際收益曲線(喜悅曲線)的斜率爲-10/9。所以你可以設定目標爲:

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