[英]How to do parallel Python Gekko?
有時我的 Python Gekko 應用程序使用一個求解器比另一個求解器更好。 很難預測哪個求解器的性能最好。 因為 Python Gekko 支持使用m.GEKKO(server='http://{address}')
在不同服務器上進行本地或遠程求解,是否可以創建一個並行的 Gekko 應用程序,該應用程序將在任意數量的計算機上同時嘗試所有求解器(包括本地)然后在第一個成功返回時殺死其他進程? 我一直在研究 Python 的多線程和並行包。 有沒有可以與 Gekko 一起很好地進行並行求解的方法? 這是一個順序原型:
from gekko import GEKKO
m = GEKKO()
x = m.Var(); y = m.Var()
m.Equation(x**2+y**2==1)
m.Maximize(x+y)
# try all solvers
for i in range(1,4):
m.options.SOLVER = i
m.solve()
if m.options.APPSTATUS==1:
print('Success: ' + str(i))
您可以使用多線程應用程序同時在任意數量的服務器上求解。 這是使用queue
的串行應用程序的並行版本,盡管它不會在第一個線程完成時停止其他線程。 即使其他線程沒有停止,您也可以包含一個MAX_TIME
值,以便強制線程在指定的秒數內完成。 這種方法確實允許您繼續主程序,同時讓其他線程在它們完成或達到最大時間限制時死亡。
from gekko import GEKKO
import queue, threading
def solve(rq, solver, server):
#print('Solver ' + str(solver) + ' Server: ' + str(server) + '\n')
if server=='localhost':
m = GEKKO(remote=False)
else:
m = GEKKO(server=server)
x = m.Var(); y = m.Var()
m.Equation(x**2+y**2==1)
m.Maximize(x+y)
m.options.SOLVER = solver
m.options.MAX_TIME = 2
m.solve(disp=False)
m.cleanup()
rq.put(('solver',solver,'server',server))
# Select servers and solvers (1=APOPT, 2=BPOPT, 3=IPOPT, etc)
APOPT = 1; BPOPT = 2; IPOPT = 3
jobs = {'https://byu.apmonitor.com':APOPT,\
'localhost':APOPT,\
'https://byu.apmonitor.com':IPOPT,\
'https://apmonitor.com':IPOPT}
# Run jobs, get only first result
q = queue.Queue()
threads = [threading.Thread(target=solve, args=(q, solver, server)) \
for server, solver in jobs.items()]
for th in threads:
th.daemon = True
th.start()
first = q.get(); print(first)
如果您還想獲得第二個或更多結果,那么您可以添加另一行帶有更多q.get()
調用。
second = q.get(); print(second)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.