簡體   English   中英

使用 Gekko 進行樓層划分

[英]Floor division using Gekko

在這個優化問題(我的單變量簡化版本)中,我有一個變量,我試圖最大化目標。 答案應該是 x = 4,objfcnval 等於 2,因為隨着 x 的增加,這些將是計算0 - 0 = 0, 1 - 2 = -1, 2 - 2 = 0, 3 - 2 = 1, 4 - 2 = 2 , 5 - 4 = 1。

這是代碼:

def my_ceiling(elem1, elem2):
    if (elem1 // elem2) == (elem1 / elem2):
        return elem1 / elem2
    else:
        return (elem1 // elem2) + 1


m = gekko.GEKKO(remote=False)
m.options.SOLVER = 1

x = m.Var(value=0, lb=0, ub=5, integer=True)

m.Obj((-1) * (x - 2 * my_ceiling(x, 4)))

m.solve(disp=False)

print('Objective: ' + str((-1) * m.options.objfcnval))
    if (elem1 // elem2) == (elem1 / elem2):
TypeError: unsupported operand type(s) for //: 'GKVariable' and 'int'

問題是顯然不支持這種操作。 我將如何使用 Gekko 解決此類問題?

另一個討論中獲得靈感,實現地板 function 的一種方法是創建一個新的 integer 變量y ,其邊界為x/4 > y >= x/4 + 1e-8

import gekko
m = gekko.GEKKO(remote=False)
m.options.SOLVER = 1

x = m.Var(value=0, lb=0,ub=5,integer=True)
y = m.Var(lb=0,ub=5,integer=True)

m.Equations([y<x/4,y>=x/4+1e-8])
m.Maximize((x - 2*y))

m.solve(disp=False)

print(x.value[0],y.value[0])
print('Objective: ' + str((-1)*m.options.objfcnval))

這產生了xy和目標 function 的解:

4.0 1.0
Objective: 2.0

如果x不是 integer 變量,此策略也適用,但 Gekko 給出的答案略有不同:

3.99999996 1.0
Objective: 1.99999996

如果有可靠的方法,也許我們應該在gekko中添加一個floor或天花板ceil ,它類似於model建築文檔中的其他一些功能。 您能否讓我們了解您的測試以及哪種方法最有效?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM