Пьомо: неограниченная целевая функция, хотя и ограниченная - PullRequest
0 голосов
/ 13 июля 2020

В настоящее время я реализую задачу оптимизации с помощью 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 имеют разные решения, хотя оба рассчитываются одинаково? Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Я решил проблему, установив нижнюю границу для члена, который принимает отрицательное значение:

model.total_investment_storage = Var(bounds=(0, None)

Я все еще не уверен, почему этот термин может принимать отрицательные значения, но это решило, по крайней мере, мою проблему

0 голосов
/ 13 июля 2020

Я думаю, вы неверно истолковываете «неограниченный». Когда решающая программа говорит, что проблема неограничена, это означает, что значение целевой функции неограничено на основе переменных и ограничений в задаче. Это не имеет ничего общего с границами переменных, если только одна из этих границ переменных не препятствует освобождению цели.

Если вам нужна помощь по вышеуказанной проблеме, вам необходимо отредактировать и опубликовать полную проблему с целью функция и (если возможно) ошибка. Теперь у вас есть набор различных фрагментов различных вариантов проблемы, которые не очень информативны по общей проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...