В Pyomo: почему экземпляр переменной отличается от значения переменной в целевой функции?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 В Pyomo: почему экземпляр переменной отличается от значения переменной в целевой функции?

Сообщение Anonymous »

Цель — минимизировать общие инвестиционные затраты в течение определенного периода времени при условии соблюдения минимальных инвестиционных ограничений. Зависимая переменная 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.

Подробнее здесь: https://stackoverflow.com/questions/783 ... e-value-in
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Оптимизация пакетного процесса в pyomo Python. Как установить фиксированное время работы для каждого пакета?
    Гость » » в форуме Python
    0 Ответы
    76 Просмотры
    Последнее сообщение Гость
  • Многомерная переменная с разной длиной индекса в Pyomo или Gurobi
    Anonymous » » в форуме Python
    0 Ответы
    84 Просмотры
    Последнее сообщение Anonymous
  • Позволяет ли Pyomo параллельное построение модели?
    Anonymous » » в форуме Python
    0 Ответы
    38 Просмотры
    Последнее сообщение Anonymous
  • Ограничить Pyomo Var нулем или указанным интервалом [дубликат]
    Anonymous » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Как я могу гарантировать, что переменная в Pyomo либо останется между границами, либо будет равна нулю?
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»