Я пытаюсь решить стохастическую проблему.Задача на 24 шага и на каждом шаге я решаю ее для 450 разных экземпляров.Теперь можно решить проблему поочередно, но это занимает много времени, поэтому я хотел решить эти 450 экземпляров параллельно.
Я подошел к этому двумя способами:
с использованием solver_manager инесколько пиро мип серверов.Здесь я просто должен поставить в очередь инсайны, и менеджер решателя назначил бы проблемы пиро-mip-серверам.Но серверы Pyro MIP занимают много памяти и сохраняют ее даже после вычисления конечного результата.используя opt solver.а) Я могу решить с помощью opt solver напрямую, но это медленно.б) используя многопоточность.Я попытался создать threadPoolExecutor с 5 потоками, а затем решить эти 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 {}
Я получаю следующие ошибки / выходные данные:
Ничто не подходит. Решателю не удалось обнаружить входной файл проблемы: / usr / src /app / temp / pyomo / tmpn23yhmz_.pyomo.lp Я установил местоположение временного файла pyomo в "/ usr / src / app / temp / pyomo". Тот же самый код прекрасно работает без многопоточности.Есть ли причина, по которой pyomo не решил проблему?
ОБНОВЛЕНИЕ 1: Я пытался использовать mutex при попытке вызвать optsolver.solve (instance).Это помогло уменьшить вышеупомянутую ошибку и не полностью устранить.Всякий раз, когда возникают эти ошибки, я пытался решить экземпляр снова, и во второй попытке они будут устранены.Итак, многопоточность работает, но я не знаю, почему ошибки по-прежнему возникают.