首页 > 解决方案 > python多线程中的Pyomo实例

问题描述

我正在尝试解决一个随机问题。24 个步骤的问题,在每个步骤中,我解决了 450 个不同的实例。现在可以串行解决问题,但这需要很多时间,所以我想并行解决这 450 个实例。

我通过两种方式解决了这个问题:

使用solver_manager 和多个pyro mip 服务器。在这里,我只需要对实例进行排队,求解器管理器会将问题分配给 pyro mip 服务器。但是 pyro mip 服务器会占用大量内存,即使在计算出最终结果后也会保留它。使用 opt 求解器。a) 我可以直接使用 opt 求解器求解,但速度很慢。b) 使用多线程。我试图用 5 个线程创建一个 threadPoolExecutor,然后在不同的线程中解决这 450 个实例。但只是转向多线程会导致 pyomo 抛出错误。

def optimize():
    optsolver = SolverFactory(self.solver_name)
    value = self.initialize_all_values()
    for timestep in range(24):
        instance_list = self.create_instance_list(value)
        futures = {}
        with concurrent.futures.ThreadPoolExecutor(max_workers=1) as executor:
            for instance_object in instance_list:
                futures = {executor.submit(self.thread_solver, instance_object["instance"], optsolver, timestep)}
            for future in concurrent.futures.as_completed(futures):
                try:
                    result = future.result()
                    value.update(result)
                except Exception as e:
                    self.logger.error(e)


def thread_solver(instance, optsolver, timestep):
    result = optsolver.solve(instance)
    if (result.solver.status == SolverStatus.ok) and (
            result.solver.termination_condition == TerminationCondition.optimal):

        instance.solutions.load_from(result)

        my_dict = {}
        for v in instance.component_objects(Var, active=True):
            varobject = getattr(instance, str(v))
            var_list = []
            try:
                for index in varobject:
                    var_list.append(varobject[index].value)
                my_dict[str(v)] = var_list
            except Exception as e:
                self.logger.error("error reading result " + str(e))

        value = {key: my_dict[k][0]}
        return value

    elif result.solver.termination_condition == TerminationCondition.infeasible:
        self.logger.info("Termination condition is infeasible")
        return {}
    else:
        self.logger.info("Nothing fits")
        return {}

我收到以下错误/输出:

没有什么适合 Solver failed to locate input problem file: /usr/src/app/temp/pyomo/tmpn23yhmz_.pyomo.lp 我已将 pyomo 临时文件位置设置为“/usr/src/app/temp/pyomo” 相同的代码在没有多线程的情况下运行得很好。pyomo 没有解决问题的任何理由?

更新 1:当我尝试调用 optsolver.solve(instance) 时,我尝试使用互斥锁。这有助于减少上述错误而不是完全消除。每当发生这些错误时,我都会尝试再次解决该实例,并在第二次尝试中解决它们。所以,多线程确实有效,但我不知道为什么仍然会出现错误。

标签: multithreadingpython-3.6pyomo

解决方案


推荐阅读