Добавление пользовательских переменных в целевую функцию PyPSA без необходимости внесения изменений вOptimize.py в базовPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Добавление пользовательских переменных в целевую функцию PyPSA без необходимости внесения изменений вOptimize.py в базов

Сообщение Anonymous »

Я моделирую сеть в pypsa с ограничениями, которые имеют статистически рассчитанное RHS, а это означает, что всегда существует вероятность неосуществимого решения (например, X > 10 и X < 9)
Чтобы обойти эту проблему, я добавляю штрафной член в целевую функцию, пример приведен ниже. Однако мне пришлось изменитьоптимизировать.py следующим образом:

Код: Выделить всё

def assign_solution(n: Network) -> None:
"""
Map solution to network components.
"""
m = n.model
sns = n.model.parameters.snapshots.to_index()

for name, variable in m.variables.items():
sol = variable.solution
if name == "objective_constant":
continue
**if name[:7].lower() == "penalty":
continue**
try:
c, attr = name.split("-", 1)
df = sol.to_pandas()
except ValueError:
continue
Где находятся добавленные строки

Код: Выделить всё

    if name[:7].lower() == "penalty":
continue
Если я не внесу это изменение, pypsa завершится с ошибкой KeyError, потому что функция Assign_solution, которая «сопоставляет решение с сетевыми компонентами», не сможет найти компонент для новой целевой переменной.
p>
Есть ли какой-нибудь способ добавить эти штрафные переменные к какому-то инертному компоненту, или мы можем добавить что-то вроде этих двух строк в репозиторий pypsa, чтобы помочь кому-либо еще использовать ослабление ограничений. Или есть другое решение?
Игрушечный пример ослабления ограничений, требующий вышеуказанных изменений для оптимизации.py

Код: Выделить всё

import pypsa

def build_model():
# Create toy network
n = pypsa.Network()
n.add("Carrier", "AC")
n.add("Bus", "Bus 0",carrier = 'AC')
n.add("Bus", "Bus 1",carrier = 'AC')
n.add("Line","Line 01", bus0 = "Bus 0", bus1 = "Bus 1", x=0.1, s_nom=50, carrier =     'AC', r = 1)

n.add("Generator", "Gen 0",
bus=f"Bus 0",
p_nom=100,
carrier = 'AC',
marginal_cost=10,
)

n.add("Load", "Load 0",
bus="Bus 1",
p_set=50,
carrier = 'AC',
)
n.optimize.create_model()

return n

n = build_model()
n.optimize.solve_model()
Эта сеть из генератора мощностью 100 МВт, подключенного к генератору мощностью 50 МВт по 1 линии, решает проблему, без проблем
[img]https://i.sstatic .net/6mX6sKBM.png[/img]

Однако, если я добавлю ограничение, ограничивающее эту линию до 40 МВт, этого не произойдет

Код: Выделить всё

# Set constraint restricting line flow to 40MW or less (infeasible, as load is 50MW)
n = build_model()
m = n.model
line_flow = m.variables["Line-s"].sel({'Line':'Line 01'})
m.add_constraints(line_flow 

Подробнее здесь: [url]https://stackoverflow.com/questions/79353815/adding-custom-variables-to-pypsa-objective-function-without-requiring-a-change-t[/url]
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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