簡體   English   中英

如何在 gekko 中動態構建約束?

[英]How could constraints be dynamically constructed in gekko?

我是 gekko 的新手,想在我的線性規划問題中使用它。

我在單獨的字典(my_vars、Cost、Min 和 Max)中有變量名稱、成本、最小和最大邊界,變量名稱作為它們的鍵,目標是通過確定滿足約束的變量數量來最小化總成本。

我做了如下;

LP = GEKKO(remote=False)
vars = LP.Array(LP.Var, (len(my_vars)))
i=0
for xi in vars:
    xi.lower = Min[list(my_vars)[i]]
    xi.upper = Max[list(my_vars)[i]]
    i += 1

這里我想用變量原名代替xi,有什么辦法嗎?

它繼續為;

LP.Minimize(sum(float(Cost[list(my_vars)[i]])*vars[i] for i in range(len(my_vars))))
LP.Equation(sum(vars) == 100)

此外,我在兩個 pandas 數據幀文件中有約束的左側 (LHS)(變量系數)和右側 (RHS) 數字,並且喜歡使用 for 循環構造方程。

我不知道該怎么做?

這是使用字典值構造問題的一種方法:

from gekko import GEKKO

# stored as list
my_vars = ['x1','x2']
# stored as dictionaries
Cost = {'x1':100,'x2':125}
Min = {'x1':0,'x2':0}
Max = {'x1':70,'x2':40}

LP = GEKKO(remote=False)
va = LP.Array(LP.Var, (len(my_vars)))  # array
vd = {}                                # dictionary
for i,xi in enumerate(my_vars):
    vd[xi] = va[i]
    vd[xi].lower = Min[xi]
    vd[xi].upper = Max[xi]

# Cost function
LP.Minimize(LP.sum([Cost[xi]*vd[xi] for xi in my_vars])) 
# Summation as an array
LP.Equation(LP.sum(va)==100)
# This also works as a dictionary
LP.Equation(LP.sum([vd[xi] for xi in my_vars])==100)
LP.solve(disp=True)

for xi in my_vars:
    print(xi,vd[xi].value[0])
print ('Cost: ' + str(LP.options.OBJFCNVAL))

這產生了一個解決方案:

EXIT: Optimal Solution Found.

 The solution was found.

 The final value of the objective function is  10750.00174236579
 
 ---------------------------------------------------
 Solver         :  IPOPT (v3.12)
 Solution time  :  0.012199999999999996 sec
 Objective      :  10750.00174236579
 Successful solution
 ---------------------------------------------------
 

x1 69.999932174
x2 30.0000682
Cost: 10750.001742

下面是一些利用問題稀疏性使用 Gekko 進行高效線性規划的示例。

暫無
暫無

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

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