Оптимизация пакетного процесса в pyomo Python. Как установить фиксированное время работы для каждого пакета? ⇐ Python
Оптимизация пакетного процесса в pyomo Python. Как установить фиксированное время работы для каждого пакета?
Я хочу оптимизировать промышленный пакетный процесс с помощью pyomo в Python. Целевая функция – минимизация стоимости системы. В моем упрощенном примере я указываю производственные затраты со случайными значениями. Уникальность пакетного процесса заключается в том, что после включения системы она должна работать в течение четырех или кратных четырех временных шагов (несколько партий подряд). Down_time не обязательно должно быть кратно четырем. (Только в упрощенной задаче время простоя не должно превышать двух или хотя бы 20 временных шагов).
Я пытался определить правило блокировки, которое должно гарантировать время выполнения %4, но оно не работает. Тем не менее время выполнения > 4 появляется. Если я переключу ограничение с >= 4 на == 4 (см. ниже), оптимизация вообще не будет работать.
Обновление:
Все работает нормально, за исключением окна выключения, поскольку оно приводит к остановке производства на 20 временных шагов, как показано на рисунке ниже:
Принудительная остановка производства
Удаление ограничения выключения приводит к следующему рисунку. Видно, что пакетный процесс хорошо оптимизирован, но пауза максимум 2 или 20+ не обеспечена:
Без ограничения отключения
Обновленный код:
импортировать pyomo.environ как pyo импортировать numpy как np импортировать случайный # Определим модель модель = pyo.ConcreteModel() # 1. Определите модель, наборы и параметры. T = 56 # количество временных шагов производственная_цель = 16 model.timesteps = pyo.RangeSet(1, T) # Функция производственных затрат Production_cost = (np.sin(np.linspace(0, 8*np.pi, T)) + 1) * 50 Production_cost = [_ для _ в диапазоне (T)] Production_cost = [random.randint(1,100) для _ в диапазоне (T)] # 2. Определите переменные решения. model.production = pyo.Var(model.timesteps, Within=pyo.Binary) # производственное решение model.running = pyo.Var(model.timesteps, Within=pyo.Binary) # статус завода model.start = pyo.Var(model.timesteps, Within=pyo.Binary) # запуск завода # 3. Определить целевую функцию. защита obj_rule (модель): возвращаемая сумма (production_cost[t-1] * model.production[t] для t в model.timesteps) model.obj = pyo.Objective(rule=obj_rule, sense=pyo.minimize) # 4. Определите ограничения. # Общее ограничение производства защита total_production_rule (модель): return sum(model.production[t] для t в model.timesteps) == Production_goal model.total_production_con = pyo.Constraint(rule=total_production_rule) # Производство возможно только при работающем заводе def Production_on_rule (модель, т): return model.production[t] == model.running[t] model.production_on_con = pyo.Constraint(model.timesteps, rule=production_on_rule) # Работает, если запущен в текущем или предыдущих 3 периодах защита Running_rule (модель, т): return model.running[t] 0) model.running_con = pyo.Constraint(model.timesteps, rule=running_rule) # Запуск, если ни одного запуска не произошло в течение предыдущих 3 периодов Защиту start_rule (модель, т): return model.start[t] 0) model.start_con = pyo.Constraint(model.timesteps, rule=start_rule) # Ограничение окна выключения защита Shutdown_window_rule (модель, т): if t > 3 и t
Я хочу оптимизировать промышленный пакетный процесс с помощью pyomo в Python. Целевая функция – минимизация стоимости системы. В моем упрощенном примере я указываю производственные затраты со случайными значениями. Уникальность пакетного процесса заключается в том, что после включения системы она должна работать в течение четырех или кратных четырех временных шагов (несколько партий подряд). Down_time не обязательно должно быть кратно четырем. (Только в упрощенной задаче время простоя не должно превышать двух или хотя бы 20 временных шагов).
Я пытался определить правило блокировки, которое должно гарантировать время выполнения %4, но оно не работает. Тем не менее время выполнения > 4 появляется. Если я переключу ограничение с >= 4 на == 4 (см. ниже), оптимизация вообще не будет работать.
Обновление:
Все работает нормально, за исключением окна выключения, поскольку оно приводит к остановке производства на 20 временных шагов, как показано на рисунке ниже:
Принудительная остановка производства
Удаление ограничения выключения приводит к следующему рисунку. Видно, что пакетный процесс хорошо оптимизирован, но пауза максимум 2 или 20+ не обеспечена:
Без ограничения отключения
Обновленный код:
импортировать pyomo.environ как pyo импортировать numpy как np импортировать случайный # Определим модель модель = pyo.ConcreteModel() # 1. Определите модель, наборы и параметры. T = 56 # количество временных шагов производственная_цель = 16 model.timesteps = pyo.RangeSet(1, T) # Функция производственных затрат Production_cost = (np.sin(np.linspace(0, 8*np.pi, T)) + 1) * 50 Production_cost = [_ для _ в диапазоне (T)] Production_cost = [random.randint(1,100) для _ в диапазоне (T)] # 2. Определите переменные решения. model.production = pyo.Var(model.timesteps, Within=pyo.Binary) # производственное решение model.running = pyo.Var(model.timesteps, Within=pyo.Binary) # статус завода model.start = pyo.Var(model.timesteps, Within=pyo.Binary) # запуск завода # 3. Определить целевую функцию. защита obj_rule (модель): возвращаемая сумма (production_cost[t-1] * model.production[t] для t в model.timesteps) model.obj = pyo.Objective(rule=obj_rule, sense=pyo.minimize) # 4. Определите ограничения. # Общее ограничение производства защита total_production_rule (модель): return sum(model.production[t] для t в model.timesteps) == Production_goal model.total_production_con = pyo.Constraint(rule=total_production_rule) # Производство возможно только при работающем заводе def Production_on_rule (модель, т): return model.production[t] == model.running[t] model.production_on_con = pyo.Constraint(model.timesteps, rule=production_on_rule) # Работает, если запущен в текущем или предыдущих 3 периодах защита Running_rule (модель, т): return model.running[t] 0) model.running_con = pyo.Constraint(model.timesteps, rule=running_rule) # Запуск, если ни одного запуска не произошло в течение предыдущих 3 периодов Защиту start_rule (модель, т): return model.start[t] 0) model.start_con = pyo.Constraint(model.timesteps, rule=start_rule) # Ограничение окна выключения защита Shutdown_window_rule (модель, т): if t > 3 и t
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение