Чтобы обойти эту проблему, я добавляю штрафной член в целевую функцию, пример приведен ниже. Однако мне пришлось изменитьоптимизировать.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
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()
[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]