有时,我的 Python Gekko 应用程序使用一种求解器比另一种求解器能更好地求解。很难预测哪个求解器表现最好。由于 Python Gekko 支持使用 m.GEKKO(server='http://{address}')
在不同服务器上进行本地或远程求解,因此是否可以创建一个并行的 Gekko 应用程序来尝试所有的求解器同时在任意数量的计算机(包括本地)上运行,然后在第一个进程成功返回时终止其他进程?我一直在研究 Python 的多线程和并行包。有没有可以与 Gekko 很好地配合进行并行求解的软件?这是一个顺序原型(prototype):
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))
最佳答案
您可以使用多线程应用程序同时在任意数量的服务器上进行求解。这是使用队列的串行应用程序的并行版本,尽管它在第一个线程完成时不会停止其他线程。即使其他线程没有停止,您也可以包含 MAX_TIME
value以便线程被迫在指定的秒数内完成。这种方法确实允许您继续主程序,同时让其他线程在完成或达到最大时间限制时终止。
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)
关于python - 如何并行Python Gekko?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58887835/