В настоящее время я реализую задачу оптимизации с помощью pyomo, и вот уже несколько часов я получаю сообщение о том, что моя проблема не ограничена. После поиска проблемы я нашел один термин, который кажется неограниченным. Я исключил этот член из целевой функции, и он показывает, что он принимает очень большое отрицательное значение, что подтверждает предположение о том, что он неограничен для -Inf.
Но я проверил проблему дальше, и невозможно, чтобы термин не ограничен, как показывают следующий код и результаты:
model.nominal_cap_storage = Var(model.STORAGE, bounds=(0,None)) #lower bound is 0
#I assumed very high CAPEX for each storage (see print)
dict_capex_storage = {'battery': capex_battery_storage,
'co2': capex_co2_storage,
'hydrogen': capex_hydrogen_storage,
'heat': capex_heat_storage,
'syncrude': capex_syncrude_storage}
print(dict_capex_storage)
>>> {'battery': 100000000000000000, 'co2': 100000000000000000,
'hydrogen': 1000000000000000000, 'heat': 1000000000000000, 'syncrude': 10000000000000000000}
Исходя из этих предположений, я уже предполагаю, что невозможно, чтобы один член мог быть неограниченным по отношению к -Inf, поскольку емкость имеет нижнюю границу 0 а CAPEX - это положительное фиксированное значение. Но теперь это сходит с ума. Следующий член имеет проблему отсутствия ограничений:
model.total_investment_storage = Var()
def total_investment_storage_rule(model):
return model.total_investment_storage == sum(model.nominal_cap_storage[storage] * dict_capex_storage[storage] \
for storage in model.STORAGE)
model.total_investment_storage_con = Constraint(rule=total_investment_storage_rule)
Если я исключу член из целевой функции, я получу следующее значение после оптимизации. Кажется, что он может принимать высокие отрицательные значения.
>>>>
Variable total_investment_storage
-1004724108.3426505
Итак, я проверил термин, относящийся к модели компонента .nominal_cap_storage, чтобы увидеть значение емкости:
model.total_cap_storage = Var()
def total_cap_storage_rule(model):
return model.total_cap_storage == sum(model.nominal_cap_storage[storage] for storage in model.STORAGE)
model.total_cap_storage_con = Constraint(rule=total_cap_storage_rule)
>>>>
Variable total_cap_storage
0.0
Я сделал то же самое для словаря, но допустил ошибку: забыл удалить model.nominal_cap_storage. Но результат сбивает с толку:
model.total_capex_storage = Var()
def total_capex_storage_rule(model):
return model.total_capex_storage == sum(model.nominal_cap_storage[storage] * dict_capex_storage[storage] \
for storage in model.STORAGE)
model.total_capex_storage_con = Constraint(rule=total_capex_storage_rule)
>>>>
Variable total_capex_storage
0.0
Итак, мой вопрос: почему термин неограниченный и как возможно, что model.total_investment_storage и model.total_capex_storage имеют разные решения, хотя оба рассчитываются одинаково? Любая помощь приветствуется.