【问题标题】:How to do parallel Python Gekko?如何做并行 Python Gekko?
【发布时间】:2019-11-16 05:19:35
【问题描述】:

有时我的 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))

【问题讨论】:

  • 这有帮助吗? apmonitor.com/me575/index.php/Main/ParallelComputing 我不确定是使用multiprocessing 进行并行处理还是使用threading 进行多线程应用程序是最好的。如果您在联网的计算机集群上求解,多线程似乎会更好,因为您的主脚本可以按顺序生成这些脚本,然后等待第一个返回。
  • 这里有一些关于如何在一个线程完成后终止其他线程的信息:stackoverflow.com/questions/17564804/…

标签: python parallel-processing gekko


【解决方案1】:

您可以使用多线程应用程序同时在任意数量的服务器上求解。这是使用queue 的串行应用程序的并行版本,尽管它不会在第一个线程完成时停止其他线程。即使其他线程没有停止,您也可以包含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)

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 2020-08-12
    • 1970-01-01
    相关资源
    最近更新 更多