Цель — минимизировать общие инвестиционные затраты в течение определенного периода времени при условии соблюдения минимальных инвестиционных ограничений. Зависимая переменная X — это сумма инвестиций в проект i в период времени t. Параметр Y определяет стоимость единицы зависимой переменной. Общая инвестиционная стоимость определяется как произведенное количество, умноженное на стоимость единицы продукции в инвестиционном году, то есть в году, когда компания впервые инвестирует в проект i. Итак, если компания впервые инвестирует в проект i в 2024 году, инвестиционным годом будет 2024.
Теперь проблема в том, что ценность инвестиционного года имеет решающее значение для результат, потому что затраты на единицу продукции Y меняются со временем. При запуске модели и вызове правила инвестиционного года (t_inv) для экземпляра переменных модели значение инвестиционного года генерируется правильно.
Однако я использую правило t_inv также в функции total_cost и, следовательно, в целевой функции. А при минимизации общих затрат используется неверный инвестиционный год, как видно из результатов модели. Вместо 2022 года используется инвестиционный 2025 год. Я предполагаю, что это происходит потому, что я инициализирую переменную модели X как 0. Следовательно, при запуске целевой функции для переменной X используется 0, и, таким образом, инвестиционные годы оказываются 2025 (см. правило t_inv для случая, когда X = 0). ). Функция не использует фактические значения X, а только начальные значения. Как мне теперь изменить модель так, чтобы я мог достичь желаемых результатов, а целевая функция использовала правильные инвестиционные годы, а не инициализированные?
Рабочий мини-пример определяется следующим образом. :
from pyomo.environ import *
times = [2022, 2023, 2024, 2025]
projects = ["P1", "P2", "P3"]
model = AbstractModel()
model.time = Set(initialize = times) # refers to time periods
model.project_type = Set(initialize = projects) # refers to project types
model.Y = Param(model.project_type, model.time) # cost per unit of investment
model.X = Var(model.project_type, model.time, initialize=0). # amount of investment
# Define rule to derive the investment year for project type
def t_inv(i, times, X):
all_inv_years = [] # Initialize the list to store all investment years for the specified project type
for t in times:
if X[i, t].value > 0:
all_inv_years.append(t) # Append the investment year if investment is > 0
if all_inv_years: # Check if there are any investment years for the specified project type
inv_year = min(all_inv_years) # Find the minimum investment year for the specified project type
return inv_year # Return the minimum investment year
else:
return 2025 # Return 2025 if there are no investment years for the specified project
#Define rule to calculate total costs for a given year t
def total_costs_rule(t, project_types, times, Y, X):
# Define the terms inside the summation
summation_terms = []
summation_terms.extend([X[i, t] * Y[i, t_inv(i, times, X)] for i in project_types])
#Sum up all the terms
total_cost = sum(summation_terms)
#return total costs
return total_cost
#Define Objective Function
def cost_rule(model):
# compute total sum of future costs
return sum(
total_costs_rule(t, model.project_type, model.time, model.Y, model.X) for t in model.time)
#Add cost_rule to the model as an objective function to minimize
model.cost = Objective(rule=cost_rule, sense=minimize)
#Yearly constraints on investments (i.e., investment limits for each year)
def investments_constraint_rule(model, t):
return total_costs_rule(t, model.project_type, model.time, model.Y, model.X) >= 10
#add the rule to the model as a constraint
model.Investments_Constraint = Constraint(model.time, rule=investments_constraint_rule)
#feed in data
data= {None: {'Y': {('P1',2022): 1, ('P2',2022): 8, ('P3',2022): 12 , ('P1',2023): 0.9 , ('P2',2023): 7.5 ,
('P3',2023): 10, ('P1',2024): 0.8 ,('P2',2024): 7 ,('P3',2024): 8, ('P1',2025): 0.7 ,
('P2',2025): 6.5 ,('P3',2025): 6}}}
#create instance
instance = model.create_instance(data)
#solve
solver = SolverFactory('ipopt')
results = solver.solve(instance, tee=True)
#print model results
instance.pprint()
#print investment years
for i in instance.project_type:
print(t_inv(i, instance.time, instance.X))
Я попробовал использовать объект выражения для t_inv. Это ничего не изменило. Я также попробовал настроить t_inv как переменную и определить ее через переменную X. Но это тоже не сработало. Возможно, я сделал это неправильно, поскольку я еще новичок в Pyomo.
Цель — минимизировать общие инвестиционные затраты в течение определенного периода времени при условии соблюдения минимальных инвестиционных ограничений. Зависимая переменная X — это сумма инвестиций в проект i в период времени t. Параметр Y определяет стоимость единицы зависимой переменной. Общая инвестиционная стоимость определяется как произведенное количество, умноженное на стоимость единицы продукции в инвестиционном году, то есть в году, когда компания впервые инвестирует в проект i. Итак, если компания впервые инвестирует в проект i в 2024 году, инвестиционным годом будет 2024. Теперь проблема в том, что ценность инвестиционного года имеет решающее значение для результат, потому что затраты на единицу продукции Y меняются со временем. При запуске модели и вызове правила инвестиционного года (t_inv) для экземпляра переменных модели значение инвестиционного года генерируется правильно. Однако я использую правило t_inv также в функции total_cost и, следовательно, в целевой функции. А при минимизации общих затрат используется неверный инвестиционный год, как видно из результатов модели. Вместо 2022 года используется инвестиционный 2025 год. Я предполагаю, что это происходит потому, что я инициализирую переменную модели X как 0. Следовательно, при запуске целевой функции для переменной X используется 0, и, таким образом, инвестиционные годы оказываются 2025 (см. правило t_inv для случая, когда X = 0). ). Функция не использует фактические значения X, а только начальные значения. Как мне теперь изменить модель так, чтобы я мог достичь желаемых результатов, а целевая функция использовала правильные инвестиционные годы, а не инициализированные? Рабочий мини-пример определяется следующим образом. : [code]from pyomo.environ import *
times = [2022, 2023, 2024, 2025]
projects = ["P1", "P2", "P3"]
model = AbstractModel()
model.time = Set(initialize = times) # refers to time periods
model.project_type = Set(initialize = projects) # refers to project types
model.Y = Param(model.project_type, model.time) # cost per unit of investment
model.X = Var(model.project_type, model.time, initialize=0). # amount of investment
# Define rule to derive the investment year for project type def t_inv(i, times, X): all_inv_years = [] # Initialize the list to store all investment years for the specified project type for t in times: if X[i, t].value > 0: all_inv_years.append(t) # Append the investment year if investment is > 0 if all_inv_years: # Check if there are any investment years for the specified project type inv_year = min(all_inv_years) # Find the minimum investment year for the specified project type return inv_year # Return the minimum investment year else: return 2025 # Return 2025 if there are no investment years for the specified project
#Define rule to calculate total costs for a given year t def total_costs_rule(t, project_types, times, Y, X): # Define the terms inside the summation summation_terms = [] summation_terms.extend([X[i, t] * Y[i, t_inv(i, times, X)] for i in project_types])
#Sum up all the terms total_cost = sum(summation_terms)
#return total costs return total_cost
#Define Objective Function def cost_rule(model): # compute total sum of future costs return sum( total_costs_rule(t, model.project_type, model.time, model.Y, model.X) for t in model.time)
#Add cost_rule to the model as an objective function to minimize model.cost = Objective(rule=cost_rule, sense=minimize)
#Yearly constraints on investments (i.e., investment limits for each year) def investments_constraint_rule(model, t): return total_costs_rule(t, model.project_type, model.time, model.Y, model.X) >= 10
#add the rule to the model as a constraint model.Investments_Constraint = Constraint(model.time, rule=investments_constraint_rule)
#print investment years for i in instance.project_type: print(t_inv(i, instance.time, instance.X)) [/code] Я попробовал использовать объект выражения для t_inv. Это ничего не изменило. Я также попробовал настроить t_inv как переменную и определить ее через переменную X. Но это тоже не сработало. Возможно, я сделал это неправильно, поскольку я еще новичок в Pyomo.
Я хочу оптимизировать промышленный пакетный процесс с помощью pyomo в Python. Целевая функция – минимизация стоимости системы. В моем упрощенном примере я указываю производственные затраты со случайными значениями. Уникальность пакетного процесса...
Я хочу решить задачу оптимизации на Python. Я пытаюсь определить переменную x_{g,h}, где индекс g принадлежит множеству G, а индекс h принадлежит множеству H(g), т. е. набор индексов h варьируется для разных индексов g. Есть ли способ определить...
У меня есть крупномасштабная модель оптимизации на основе сценариев, решение которой в Pyomo с использованием решателя Gurobi занимает много времени. Хотя решение модели с использованием Gurobi (поскольку оно использует все доступные ядра)...
Мне интересно, как правильно ограничить переменную Pyomo определенным интервалом или нулевым значением, которое находится за пределами интервала.
В качестве примера: я хотите оптимизировать использование модели отопительного агрегата.Отопление,...
Я хочу решить задачу оптимизации с помощью Pyomo и убедиться, что переменные решения находятся либо в заданных пределах, либо равны нулю.
В качестве минимального примера я хотел бы показать следующая проблема оптимизации: