|
@@ -9,11 +9,15 @@ from os import path
|
|
|
import pandas as pd
|
|
import pandas as pd
|
|
|
import pyomo.environ as pe
|
|
import pyomo.environ as pe
|
|
|
import pyutilib.subprocess.GlobalData
|
|
import pyutilib.subprocess.GlobalData
|
|
|
|
|
+from common.data import APPDIRS
|
|
|
from numpy import array, zeros
|
|
from numpy import array, zeros
|
|
|
|
|
+from pandas import ExcelWriter
|
|
|
from pyomo.environ import SolverFactory
|
|
from pyomo.environ import SolverFactory
|
|
|
|
|
+from validacion.validacion import validar_flujos
|
|
|
|
|
|
|
|
-from common.data import APPDIRS
|
|
|
|
|
|
|
+from simsdt.mct.makeEXP import linexp, readexp
|
|
|
from simsdt.mct.makeMCT import linmct, readmct, set_dir_flujo
|
|
from simsdt.mct.makeMCT import linmct, readmct, set_dir_flujo
|
|
|
|
|
+from simsdt.mct.makeMCTP import readmctp
|
|
|
from simsdt.ofertas.readBids import (readexistentes, readofertas, setT, setTE,
|
|
from simsdt.ofertas.readBids import (readexistentes, readofertas, setT, setTE,
|
|
|
setVIT, setVITE, setVITEX, setVITX,
|
|
setVIT, setVITE, setVITEX, setVITX,
|
|
|
setVRT, setVRTE)
|
|
setVRT, setVRTE)
|
|
@@ -32,9 +36,11 @@ model_logger = logging.getLogger('simsdt.model')
|
|
|
|
|
|
|
|
class ModeloSubasta:
|
|
class ModeloSubasta:
|
|
|
|
|
|
|
|
- def __init__(self, file, tee=True):
|
|
|
|
|
|
|
+ def __init__(self, file, p_exec, all_year=True, tee=True):
|
|
|
self.file = file
|
|
self.file = file
|
|
|
self.tee = tee
|
|
self.tee = tee
|
|
|
|
|
+ self.p_exec = p_exec
|
|
|
|
|
+ self.all_year = all_year
|
|
|
|
|
|
|
|
def setmodel(self):
|
|
def setmodel(self):
|
|
|
model_logger.info('Modelo de Subasta de Derechos Firmes')
|
|
model_logger.info('Modelo de Subasta de Derechos Firmes')
|
|
@@ -51,8 +57,7 @@ class ModeloSubasta:
|
|
|
model_logger.info(
|
|
model_logger.info(
|
|
|
"Leyendo información de ofertas y derechos firmes existentes")
|
|
"Leyendo información de ofertas y derechos firmes existentes")
|
|
|
|
|
|
|
|
- ex = readexistentes(self.file)
|
|
|
|
|
- nex = ex.shape[0]
|
|
|
|
|
|
|
+ ex_t = readexistentes(self.file)
|
|
|
of = readofertas(self.file)
|
|
of = readofertas(self.file)
|
|
|
nof = of.shape[0]
|
|
nof = of.shape[0]
|
|
|
|
|
|
|
@@ -83,9 +88,17 @@ class ModeloSubasta:
|
|
|
|
|
|
|
|
# Lineas para límites de MCT
|
|
# Lineas para límites de MCT
|
|
|
lin_mct = linmct(brnames)
|
|
lin_mct = linmct(brnames)
|
|
|
- mct = readmct(self.file)/100
|
|
|
|
|
|
|
+ mct = readmct(self.file)
|
|
|
dirf = set_dir_flujo()
|
|
dirf = set_dir_flujo()
|
|
|
|
|
|
|
|
|
|
+ # Max impo/exp
|
|
|
|
|
+ lin_exp = linexp(brnames)
|
|
|
|
|
+ exp = readexp(self.file)
|
|
|
|
|
+
|
|
|
|
|
+ # Lectura de MCTP
|
|
|
|
|
+ model_logger.info("Leyendo los MCTP para validación posterior")
|
|
|
|
|
+ mctp = readmctp(self.file)
|
|
|
|
|
+
|
|
|
model_logger.info("Cálculando la matriz H")
|
|
model_logger.info("Cálculando la matriz H")
|
|
|
# Cálculo de la matriz H
|
|
# Cálculo de la matriz H
|
|
|
H = makePTDF(bus, branch)
|
|
H = makePTDF(bus, branch)
|
|
@@ -95,405 +108,526 @@ class ModeloSubasta:
|
|
|
_, _, A = makeBdc(bus, branch)
|
|
_, _, A = makeBdc(bus, branch)
|
|
|
inc = A.toarray()**2
|
|
inc = A.toarray()**2
|
|
|
|
|
|
|
|
- model_logger.info("Creando Vectores de Derechos Firmes existentes")
|
|
|
|
|
- # Datos de los Derechos Firmes Existentes
|
|
|
|
|
- vite = setVITE(bus, ex)/100
|
|
|
|
|
- vrte = setVRTE(bus, ex)/100
|
|
|
|
|
- vitex = setVITEX(bus, ex)/100
|
|
|
|
|
- te = setTE(vite, vrte)
|
|
|
|
|
-
|
|
|
|
|
- model_logger.info("Creando vectores de Ofertas de Derechos firmes")
|
|
|
|
|
- # Datos de las ofertas de Derechos Firmes
|
|
|
|
|
- c = of.oferta.values
|
|
|
|
|
- cper = of.cper.values
|
|
|
|
|
- perk = of.per.values/100
|
|
|
|
|
- vit = setVIT(bus, of)/100
|
|
|
|
|
- vrt = setVRT(bus, of)/100
|
|
|
|
|
- vitx = setVITX(bus, of)/100
|
|
|
|
|
- t = setT(vit, vrt)
|
|
|
|
|
-
|
|
|
|
|
- # ============================================================================
|
|
|
|
|
- # Modelo de optimización subasta de derechos Firmes
|
|
|
|
|
- # ============================================================================
|
|
|
|
|
-
|
|
|
|
|
- model_logger.info("Inicio del problema de Optimización")
|
|
|
|
|
- # Inicio del modelo de optimización
|
|
|
|
|
-
|
|
|
|
|
- model = pe.ConcreteModel()
|
|
|
|
|
-
|
|
|
|
|
- # SETS
|
|
|
|
|
-
|
|
|
|
|
- model_logger.info("Creando Sets del problema")
|
|
|
|
|
- model.c = pe.Set(initialize=range(0, nbr)) # Número de circuitos
|
|
|
|
|
- model.n = pe.Set(initialize=range(0, nb)) # Número de nodos
|
|
|
|
|
- model.o = pe.Set(initialize=range(0, nex)) # Número de DF existentes
|
|
|
|
|
- model.k = pe.Set(initialize=range(0, nof)) # Número de Ofertas DF
|
|
|
|
|
- model.i = pe.Set(initialize=lin_mct.keys()) # Interconexiones
|
|
|
|
|
- # Sentidos de interconexiones
|
|
|
|
|
- model.s = pe.Set(initialize=['sn', 'ns'])
|
|
|
|
|
-
|
|
|
|
|
- # PARAMETERS
|
|
|
|
|
|
|
+ # model_logger.info("Creando Vectores de Derechos Firmes existentes")
|
|
|
|
|
+ # # Datos de los Derechos Firmes Existentes
|
|
|
|
|
+ # vite = setVITE(bus, ex)/100
|
|
|
|
|
+ # vrte = setVRTE(bus, ex)/100
|
|
|
|
|
+ # vitex = setVITEX(bus, ex)/100
|
|
|
|
|
+ # te = setTE(vite, vrte)
|
|
|
|
|
+
|
|
|
|
|
+ for Mes in range(1, 2):
|
|
|
|
|
+ model_logger.info(f"Ejecutando para el mes {Mes}")
|
|
|
|
|
+ model_logger.info("Creando vectores de Ofertas de Derechos firmes")
|
|
|
|
|
+ # Datos de las ofertas de Derechos Firmes
|
|
|
|
|
+ c = of.oferta.values
|
|
|
|
|
+ cper = of.cper.values
|
|
|
|
|
+ perk = of.per.values/100
|
|
|
|
|
+ vit = setVIT(bus, of)/100
|
|
|
|
|
+ vrt = setVRT(bus, of)/100
|
|
|
|
|
+ vitx = setVITX(bus, of)/100
|
|
|
|
|
+ t = setT(vit, vrt)
|
|
|
|
|
+
|
|
|
|
|
+ # Filtra las ofertas existentes por Mes
|
|
|
|
|
+ ex = ex_t[ex_t.mes_vig.isin([Mes])].copy()
|
|
|
|
|
+ ex.reset_index(drop=True, inplace=True) # Reset de indices del df
|
|
|
|
|
+ # Quitamos la columna de Mes para usar la funciones
|
|
|
|
|
+ ex.drop(['mes_vig'], axis='columns', inplace=True)
|
|
|
|
|
+
|
|
|
|
|
+ nex = ex.shape[0]
|
|
|
|
|
+
|
|
|
|
|
+ model_logger.info("Creando Vectores de Derechos Firmes existentes")
|
|
|
|
|
+ # Datos de los Derechos Firmes Existentes
|
|
|
|
|
+ vite = setVITE(bus, ex)/100
|
|
|
|
|
+ vrte = setVRTE(bus, ex)/100
|
|
|
|
|
+ vitex = setVITEX(bus, ex)/100
|
|
|
|
|
+ te = setTE(vite, vrte)
|
|
|
|
|
+
|
|
|
|
|
+ # ============================================================================
|
|
|
|
|
+ # Modelo de optimización subasta de derechos Firmes
|
|
|
|
|
+ # ============================================================================
|
|
|
|
|
+
|
|
|
|
|
+ model_logger.info("Inicio del problema de Optimización")
|
|
|
|
|
+ # Inicio del modelo de optimización
|
|
|
|
|
+
|
|
|
|
|
+ model = pe.ConcreteModel()
|
|
|
|
|
+
|
|
|
|
|
+ # SETS
|
|
|
|
|
+
|
|
|
|
|
+ model_logger.info("Creando Sets del problema")
|
|
|
|
|
+ model.c = pe.Set(initialize=range(0, nbr)) # Número de circuitos
|
|
|
|
|
+ model.n = pe.Set(initialize=range(0, nb)) # Número de nodos
|
|
|
|
|
+ # Número de DF existentes
|
|
|
|
|
+ model.o = pe.Set(initialize=range(0, nex))
|
|
|
|
|
+ model.k = pe.Set(initialize=range(0, nof)) # Número de Ofertas DF
|
|
|
|
|
+ model.i = pe.Set(initialize=lin_mct.keys()) # Interconexiones
|
|
|
|
|
+ model.p = pe.Set(initialize=lin_exp.keys()) # Paises
|
|
|
|
|
+
|
|
|
|
|
+ # Sentidos de interconexiones
|
|
|
|
|
+ model.s = pe.Set(initialize=['sn', 'ns'])
|
|
|
|
|
+ model.trans = pe.Set(initialize=['i', 'e'])
|
|
|
|
|
+ model.m = pe.Set(initialize=range(1, 12))
|
|
|
|
|
+
|
|
|
|
|
+ # PARAMETERS
|
|
|
|
|
+
|
|
|
|
|
+ model_logger.info("Creando Parametros del problema")
|
|
|
|
|
+ # Ofertas derechos firmes
|
|
|
|
|
+ model_logger.info("Parametros de Ofertas de Derechos Firmes")
|
|
|
|
|
+ model.C = pe.Param(model.k, initialize=dict(enumerate(c)))
|
|
|
|
|
+ model.Cper = pe.Param(model.k, initialize=dict(enumerate(cper)))
|
|
|
|
|
+ model.Perk = pe.Param(model.k, initialize=dict(enumerate(perk)))
|
|
|
|
|
+
|
|
|
|
|
+ # Parametros de la red
|
|
|
|
|
+
|
|
|
|
|
+ model_logger.info("Parametros de Red")
|
|
|
|
|
+ model.Bu = pe.Param(model.c, initialize=dict(enumerate(bu)))
|
|
|
|
|
+ model.Bl = pe.Param(model.c, initialize=dict(enumerate(bl)))
|
|
|
|
|
+ model.R = pe.Param(model.c, initialize=dict(enumerate(r)))
|
|
|
|
|
+ model.Inc = pe.Param(model.c, model.n, initialize=arr2dict(inc))
|
|
|
|
|
+
|
|
|
|
|
+ # elemento H[c,n]
|
|
|
|
|
+
|
|
|
|
|
+ model_logger.info("Parametros de Matriz H")
|
|
|
|
|
+ model.He = pe.Param(model.c, model.n, initialize=arr2dict(H))
|
|
|
|
|
+
|
|
|
|
|
+ model_logger.info("Parametros de Derechos Firmes Existentes")
|
|
|
|
|
+ # Vector de inyecciones df existentes
|
|
|
|
|
+ model.VITE = pe.Param(model.n, model.o, initialize=arr2dict(vite))
|
|
|
|
|
+ # Vector de retiros df existentes
|
|
|
|
|
+ model.VRTE = pe.Param(model.n, model.o, initialize=arr2dict(vrte))
|
|
|
|
|
+ # Vector de perididas df existentes
|
|
|
|
|
+ model.VITEX = pe.Param(
|
|
|
|
|
+ model.n, model.o, initialize=arr2dict(vitex))
|
|
|
|
|
+ # DF existentes
|
|
|
|
|
+ model.TE = pe.Param(model.n, model.o, initialize=arr2dict(te))
|
|
|
|
|
|
|
|
- model_logger.info("Creando Parametros del problema")
|
|
|
|
|
- # Ofertas derechos firmes
|
|
|
|
|
- model_logger.info("Parametros de Ofertas de Derechos Firmes")
|
|
|
|
|
- model.C = pe.Param(model.k, initialize=dict(enumerate(c)))
|
|
|
|
|
- model.Cper = pe.Param(model.k, initialize=dict(enumerate(cper)))
|
|
|
|
|
- model.Perk = pe.Param(model.k, initialize=dict(enumerate(perk)))
|
|
|
|
|
|
|
+ model_logger.info("Parametros de Inyecciones y Retiros de Ofertas")
|
|
|
|
|
+ # Vector inyecciones ofertas de compra df
|
|
|
|
|
+ model.VIT = pe.Param(model.n, model.k, initialize=arr2dict(vit))
|
|
|
|
|
+ # Vector retiros ofertas de compra df
|
|
|
|
|
+ model.VRT = pe.Param(model.n, model.k, initialize=arr2dict(vrt))
|
|
|
|
|
+ # Vector inyecciones perdidas oferta de compra df
|
|
|
|
|
+ model.VITX = pe.Param(model.n, model.k, initialize=arr2dict(vitx))
|
|
|
|
|
+ # Ofertas de compora DF
|
|
|
|
|
+ model.T = pe.Param(model.n, model.k, initialize=arr2dict(t))
|
|
|
|
|
|
|
|
- # Parametros de la red
|
|
|
|
|
|
|
+ model_logger.info("Parametros de Limites de flujos en las líneas")
|
|
|
|
|
|
|
|
- model_logger.info("Parametros de Red")
|
|
|
|
|
- model.Bu = pe.Param(model.c, initialize=dict(enumerate(bu)))
|
|
|
|
|
- model.Bl = pe.Param(model.c, initialize=dict(enumerate(bl)))
|
|
|
|
|
- model.R = pe.Param(model.c, initialize=dict(enumerate(r)))
|
|
|
|
|
- model.Inc = pe.Param(model.c, model.n, initialize=arr2dict(inc))
|
|
|
|
|
|
|
+ # Lim. Superior flujos asociados a linea c
|
|
|
|
|
+ def bfu_param(model, c):
|
|
|
|
|
+ return model.Bu[c]
|
|
|
|
|
+ - sum(max(0, sum(model.He[c, n]*model.TE[n, o]
|
|
|
|
|
+ for n in model.n)) for o in model.o)
|
|
|
|
|
|
|
|
- # elemento H[c,n]
|
|
|
|
|
|
|
+ model.BFu = pe.Param(model.c, initialize=bfu_param)
|
|
|
|
|
|
|
|
- model_logger.info("Parametros de Matriz H")
|
|
|
|
|
- model.He = pe.Param(model.c, model.n, initialize=arr2dict(H))
|
|
|
|
|
|
|
+ # LIm. Inferior flujos asociados a linea c
|
|
|
|
|
+ def bfl_param(model, c):
|
|
|
|
|
+ return model.Bl[c]
|
|
|
|
|
+ - sum(max(0, -sum(model.He[c, n]*model.TE[n, o]
|
|
|
|
|
+ for n in model.n)) for o in model.o)
|
|
|
|
|
|
|
|
- model_logger.info("Parametros de Derechos Firmes Existentes")
|
|
|
|
|
- # Vector de inyecciones df existentes
|
|
|
|
|
- model.VITE = pe.Param(model.n, model.o, initialize=arr2dict(vite))
|
|
|
|
|
- # Vector de retiros df existentes
|
|
|
|
|
- model.VRTE = pe.Param(model.n, model.o, initialize=arr2dict(vrte))
|
|
|
|
|
- # Vector de perididas df existentes
|
|
|
|
|
- model.VITEX = pe.Param(model.n, model.o, initialize=arr2dict(vitex))
|
|
|
|
|
- # DF existentes
|
|
|
|
|
- model.TE = pe.Param(model.n, model.o, initialize=arr2dict(te))
|
|
|
|
|
|
|
+ model.BFl = pe.Param(model.c, initialize=bfl_param)
|
|
|
|
|
|
|
|
- model_logger.info("Parametros de Inyecciones y Retiros de Ofertas")
|
|
|
|
|
- # Vector inyecciones ofertas de compra df
|
|
|
|
|
- model.VIT = pe.Param(model.n, model.k, initialize=arr2dict(vit))
|
|
|
|
|
- # Vector retiros ofertas de compra df
|
|
|
|
|
- model.VRT = pe.Param(model.n, model.k, initialize=arr2dict(vrt))
|
|
|
|
|
- # Vector inyecciones perdidas oferta de compra df
|
|
|
|
|
- model.VITX = pe.Param(model.n, model.k, initialize=arr2dict(vitx))
|
|
|
|
|
- # Ofertas de compora DF
|
|
|
|
|
- model.T = pe.Param(model.n, model.k, initialize=arr2dict(t))
|
|
|
|
|
|
|
+ # Máximas Capacidades de Trasferencia
|
|
|
|
|
+ model.Mct = pe.Param(
|
|
|
|
|
+ model.i, model.s, model.m, initialize=mct.mct.to_dict())
|
|
|
|
|
+ model.DirF = pe.Param(model.i, initialize=dirf)
|
|
|
|
|
|
|
|
- model_logger.info("Parametros de Limites de flujos en las líneas")
|
|
|
|
|
|
|
+ # Maxima Imp/Exp
|
|
|
|
|
+ model.Imp = pe.Param(model.p, model.trans, model.m,
|
|
|
|
|
+ initialize=exp.MW.to_dict())
|
|
|
|
|
|
|
|
- # Lim. Superior flujos asociados a linea c
|
|
|
|
|
- def bfu_param(model, c):
|
|
|
|
|
- return model.Bu[c]
|
|
|
|
|
- - sum(max(0, sum(model.He[c, n]*model.TE[n, o]
|
|
|
|
|
- for n in model.n)) for o in model.o)
|
|
|
|
|
|
|
+ # VARIABLES
|
|
|
|
|
|
|
|
- model.BFu = pe.Param(model.c, initialize=bfu_param)
|
|
|
|
|
|
|
+ model_logger.info("Creando Variables del problema")
|
|
|
|
|
+ # Variables primales
|
|
|
|
|
|
|
|
- # LIm. Inferior flujos asociados a linea c
|
|
|
|
|
- def bfl_param(model, c):
|
|
|
|
|
- return model.Bl[c]
|
|
|
|
|
- - sum(max(0, -sum(model.He[c, n]*model.TE[n, o]
|
|
|
|
|
- for n in model.n)) for o in model.o)
|
|
|
|
|
|
|
+ model.alpha_k = pe.Var(
|
|
|
|
|
+ model.k, within=pe.NonNegativeReals, bounds=(0, 1))
|
|
|
|
|
+ model.gamma_k = pe.Var(model.k, within=pe.NonNegativeReals)
|
|
|
|
|
|
|
|
- model.BFl = pe.Param(model.c, initialize=bfl_param)
|
|
|
|
|
|
|
+ # Flujos
|
|
|
|
|
|
|
|
- # Máximas Capacidades de Trasferencia
|
|
|
|
|
- model.Mct = pe.Param(model.i, model.s, initialize=mct.mct.to_dict())
|
|
|
|
|
- model.DirF = pe.Param(model.i, initialize=dirf)
|
|
|
|
|
|
|
+ model.F = pe.Var(model.c)
|
|
|
|
|
+ model.PL = pe.Var(model.c)
|
|
|
|
|
+ model.Per = pe.Var(model.n)
|
|
|
|
|
+ model.F_k = pe.Var(model.c, model.k)
|
|
|
|
|
+ model.Fp_k = pe.Var(model.c, model.k, within=pe.NonNegativeReals)
|
|
|
|
|
+ model.Fp = pe.Var(model.c, within=pe.NonNegativeReals)
|
|
|
|
|
+ model.Fn_k = pe.Var(model.c, model.k, within=pe.NonNegativeReals)
|
|
|
|
|
+ model.Fn = pe.Var(model.c, within=pe.NonNegativeReals)
|
|
|
|
|
|
|
|
- # VARIABLES
|
|
|
|
|
|
|
+ # EQUATIONS
|
|
|
|
|
|
|
|
- model_logger.info("Creando Variables del problema")
|
|
|
|
|
- # Variables primales
|
|
|
|
|
|
|
+ model_logger.info("Creando Ecuaciones del problema")
|
|
|
|
|
+ # Ecuación Objetivo
|
|
|
|
|
+ # =============================================================================
|
|
|
|
|
|
|
|
- model.alpha_k = pe.Var(
|
|
|
|
|
- model.k, within=pe.NonNegativeReals, bounds=(0, 1))
|
|
|
|
|
- model.gamma_k = pe.Var(model.k, within=pe.NonNegativeReals)
|
|
|
|
|
|
|
+ model_logger.info("Ecuación de Función Objetivo Max Z")
|
|
|
|
|
|
|
|
- # Flujos
|
|
|
|
|
|
|
+ def eq_Z(model):
|
|
|
|
|
+ return sum(model.alpha_k[k]*model.C[k]
|
|
|
|
|
+ - model.gamma_k[k]*model.Cper[k] for k in model.k)
|
|
|
|
|
|
|
|
- model.F = pe.Var(model.c)
|
|
|
|
|
- model.PL = pe.Var(model.c)
|
|
|
|
|
- model.Per = pe.Var(model.n)
|
|
|
|
|
- model.F_k = pe.Var(model.c, model.k)
|
|
|
|
|
- model.Fp_k = pe.Var(model.c, model.k, within=pe.NonNegativeReals)
|
|
|
|
|
- model.Fp = pe.Var(model.c, within=pe.NonNegativeReals)
|
|
|
|
|
- model.Fn_k = pe.Var(model.c, model.k, within=pe.NonNegativeReals)
|
|
|
|
|
- model.Fn = pe.Var(model.c, within=pe.NonNegativeReals)
|
|
|
|
|
|
|
+ model.Z = pe.Objective(rule=eq_Z, sense=pe.maximize)
|
|
|
|
|
|
|
|
- # EQUATIONS
|
|
|
|
|
|
|
+ # Restricciones
|
|
|
|
|
+ # =============================================================================
|
|
|
|
|
|
|
|
- model_logger.info("Creando Ecuaciones del problema")
|
|
|
|
|
- # Ecuación Objetivo
|
|
|
|
|
- # =============================================================================
|
|
|
|
|
|
|
+ model_logger.info("Restricciones del Modelo de Optimización")
|
|
|
|
|
+ model_logger.info("Límites de Gamma")
|
|
|
|
|
|
|
|
- model_logger.info("Ecuación de Función Objetivo Max Z")
|
|
|
|
|
|
|
+ def eq_gamma_k_rule(model, k):
|
|
|
|
|
+ return model.gamma_k[k] <= model.alpha_k[k]
|
|
|
|
|
|
|
|
- def eq_Z(model):
|
|
|
|
|
- return sum(model.alpha_k[k]*model.C[k]
|
|
|
|
|
- - model.gamma_k[k]*model.Cper[k] for k in model.k)
|
|
|
|
|
|
|
+ model.eq_gamma_k = pe.Constraint(model.k, rule=eq_gamma_k_rule)
|
|
|
|
|
|
|
|
- model.Z = pe.Objective(rule=eq_Z, sense=pe.maximize)
|
|
|
|
|
|
|
+ # Factibilidad de derechos firmes
|
|
|
|
|
|
|
|
- # Restricciones
|
|
|
|
|
- # =============================================================================
|
|
|
|
|
|
|
+ model_logger.info("Factibilidad de derechos Firmes")
|
|
|
|
|
|
|
|
- model_logger.info("Restricciones del Modelo de Optimización")
|
|
|
|
|
- model_logger.info("Límites de Gamma")
|
|
|
|
|
|
|
+ def eq_F_k_rule(model, c, k):
|
|
|
|
|
+ return model.F_k[c, k] == (
|
|
|
|
|
+ model.alpha_k[k] *
|
|
|
|
|
+ sum(model.He[c, n] * model.T[n, k] for n in model.n))
|
|
|
|
|
|
|
|
- def eq_gamma_k_rule(model, k):
|
|
|
|
|
- return model.gamma_k[k] <= model.alpha_k[k]
|
|
|
|
|
|
|
+ model.eq_F_k = pe.Constraint(model.c, model.k, rule=eq_F_k_rule)
|
|
|
|
|
|
|
|
- model.eq_gamma_k = pe.Constraint(model.k, rule=eq_gamma_k_rule)
|
|
|
|
|
|
|
+ # Flujos positivos
|
|
|
|
|
|
|
|
- # Factibilidad de derechos firmes
|
|
|
|
|
|
|
+ model_logger.info("Flujos positivos")
|
|
|
|
|
|
|
|
- model_logger.info("Factibilidad de derechos Firmes")
|
|
|
|
|
|
|
+ def eq_Fp_k_rule(model, c, k):
|
|
|
|
|
+ return model.Fp_k[c, k] >= model.F_k[c, k]
|
|
|
|
|
|
|
|
- def eq_F_k_rule(model, c, k):
|
|
|
|
|
- return model.F_k[c, k] == (
|
|
|
|
|
- model.alpha_k[k] *
|
|
|
|
|
- sum(model.He[c, n] * model.T[n, k] for n in model.n))
|
|
|
|
|
|
|
+ model.eq_Fp_k = pe.Constraint(model.c, model.k, rule=eq_Fp_k_rule)
|
|
|
|
|
|
|
|
- model.eq_F_k = pe.Constraint(model.c, model.k, rule=eq_F_k_rule)
|
|
|
|
|
|
|
+ def eq_Fp_rule(model, c):
|
|
|
|
|
+ return model.Fp[c] == sum(model.Fp_k[c, k] for k in model.k)
|
|
|
|
|
|
|
|
- # Flujos positivos
|
|
|
|
|
|
|
+ model.eq_Fp = pe.Constraint(model.c, rule=eq_Fp_rule)
|
|
|
|
|
|
|
|
- model_logger.info("Flujos positivos")
|
|
|
|
|
|
|
+ def eq_Fpl_rule(model, c):
|
|
|
|
|
+ return sum(model.Fp_k[c, k] for k in model.k) <= model.BFu[c]
|
|
|
|
|
|
|
|
- def eq_Fp_k_rule(model, c, k):
|
|
|
|
|
- return model.Fp_k[c, k] >= model.F_k[c, k]
|
|
|
|
|
|
|
+ model.eq_Fpl = pe.Constraint(model.c, rule=eq_Fpl_rule)
|
|
|
|
|
|
|
|
- model.eq_Fp_k = pe.Constraint(model.c, model.k, rule=eq_Fp_k_rule)
|
|
|
|
|
|
|
+ # Flujos negativos
|
|
|
|
|
|
|
|
- def eq_Fp_rule(model, c):
|
|
|
|
|
- return model.Fp[c] == sum(model.Fp_k[c, k] for k in model.k)
|
|
|
|
|
|
|
+ model_logger.info("Flujos negativos")
|
|
|
|
|
|
|
|
- model.eq_Fp = pe.Constraint(model.c, rule=eq_Fp_rule)
|
|
|
|
|
|
|
+ def eq_Fn_k_rule(model, c, k):
|
|
|
|
|
+ return model.Fn_k[c, k] >= -model.F_k[c, k]
|
|
|
|
|
|
|
|
- def eq_Fpl_rule(model, c):
|
|
|
|
|
- return sum(model.Fp_k[c, k] for k in model.k) <= model.BFu[c]
|
|
|
|
|
|
|
+ model.eq_Fn_k = pe.Constraint(model.c, model.k, rule=eq_Fn_k_rule)
|
|
|
|
|
|
|
|
- model.eq_Fpl = pe.Constraint(model.c, rule=eq_Fpl_rule)
|
|
|
|
|
|
|
+ def eq_Fn_rule(model, c):
|
|
|
|
|
+ return model.Fn[c] == sum(model.Fn_k[c, k] for k in model.k)
|
|
|
|
|
|
|
|
- # Flujos negativos
|
|
|
|
|
|
|
+ model.eq_Fn = pe.Constraint(model.c, rule=eq_Fn_rule)
|
|
|
|
|
|
|
|
- model_logger.info("Flujos negativos")
|
|
|
|
|
|
|
+ def eq_Fnl_rule(model, c):
|
|
|
|
|
+ return sum(model.Fn_k[c, k] for k in model.k) <= model.BFl[c]
|
|
|
|
|
|
|
|
- def eq_Fn_k_rule(model, c, k):
|
|
|
|
|
- return model.Fn_k[c, k] >= -model.F_k[c, k]
|
|
|
|
|
|
|
+ model.eq_Fnl = pe.Constraint(model.c, rule=eq_Fnl_rule)
|
|
|
|
|
|
|
|
- model.eq_Fn_k = pe.Constraint(model.c, model.k, rule=eq_Fn_k_rule)
|
|
|
|
|
|
|
+ # Suficiencia Financiera
|
|
|
|
|
|
|
|
- def eq_Fn_rule(model, c):
|
|
|
|
|
- return model.Fn[c] == sum(model.Fn_k[c, k] for k in model.k)
|
|
|
|
|
|
|
+ model_logger.info("Suficiencia Financiera")
|
|
|
|
|
|
|
|
- model.eq_Fn = pe.Constraint(model.c, rule=eq_Fn_rule)
|
|
|
|
|
|
|
+ def eq_sf1_rule(model, c):
|
|
|
|
|
+ return model.F[c] <= model.Bu[c]
|
|
|
|
|
|
|
|
- def eq_Fnl_rule(model, c):
|
|
|
|
|
- return sum(model.Fn_k[c, k] for k in model.k) <= model.BFl[c]
|
|
|
|
|
|
|
+ model.eq_sf1 = pe.Constraint(model.c, rule=eq_sf1_rule)
|
|
|
|
|
|
|
|
- model.eq_Fnl = pe.Constraint(model.c, rule=eq_Fnl_rule)
|
|
|
|
|
|
|
+ def eq_sf2_rule(model, c):
|
|
|
|
|
+ return model.F[c] >= -model.Bl[c]
|
|
|
|
|
|
|
|
- # Suficiencia Financiera
|
|
|
|
|
|
|
+ model.eq_sf2 = pe.Constraint(model.c, rule=eq_sf2_rule)
|
|
|
|
|
|
|
|
- model_logger.info("Suficiencia Financiera")
|
|
|
|
|
|
|
+ # Balance de Pérdidas
|
|
|
|
|
|
|
|
- def eq_sf1_rule(model, c):
|
|
|
|
|
- return model.F[c] <= model.Bu[c]
|
|
|
|
|
|
|
+ model_logger.info("Balance de Pérdidas")
|
|
|
|
|
|
|
|
- model.eq_sf1 = pe.Constraint(model.c, rule=eq_sf1_rule)
|
|
|
|
|
|
|
+ def eq_PL_rule(model, c):
|
|
|
|
|
+ return model.PL[c] == model.R[c]*(model.F[c]*model.F[c])
|
|
|
|
|
|
|
|
- def eq_sf2_rule(model, c):
|
|
|
|
|
- return model.F[c] >= -model.Bl[c]
|
|
|
|
|
|
|
+ model.eq_PL = pe.Constraint(model.c, rule=eq_PL_rule)
|
|
|
|
|
|
|
|
- model.eq_sf2 = pe.Constraint(model.c, rule=eq_sf2_rule)
|
|
|
|
|
|
|
+ def eq_Per_rule(model, n):
|
|
|
|
|
+ return model.Per[n] == (
|
|
|
|
|
+ sum(model.Inc[c, n]*(model.PL[c]/2) for c in model.c))
|
|
|
|
|
|
|
|
- # Balance de Pérdidas
|
|
|
|
|
|
|
+ model.eq_Per = pe.Constraint(model.n, rule=eq_Per_rule)
|
|
|
|
|
|
|
|
- model_logger.info("Balance de Pérdidas")
|
|
|
|
|
|
|
+ # Balance de Flujos
|
|
|
|
|
|
|
|
- def eq_PL_rule(model, c):
|
|
|
|
|
- return model.PL[c] == model.R[c]*(model.F[c]*model.F[c])
|
|
|
|
|
|
|
+ model_logger.info("Balance de Flujos")
|
|
|
|
|
|
|
|
- model.eq_PL = pe.Constraint(model.c, rule=eq_PL_rule)
|
|
|
|
|
|
|
+ def eq_Balance_rule(model, c):
|
|
|
|
|
+ return model.F[c] == sum(model.He[c, n]*(
|
|
|
|
|
+ sum(model.alpha_k[k]*model.T[n, k] for k in model.k) +
|
|
|
|
|
+ sum(model.TE[n, o] for o in model.o) +
|
|
|
|
|
+ sum(model.gamma_k[k]*model.VITX[n, k] for k in model.k) +
|
|
|
|
|
+ sum(model.VITEX[n, o]for o in model.o) -
|
|
|
|
|
+ model.Per[n]) for n in model.n)
|
|
|
|
|
|
|
|
- def eq_Per_rule(model, n):
|
|
|
|
|
- return model.Per[n] == (
|
|
|
|
|
- sum(model.Inc[c, n]*(model.PL[c]/2) for c in model.c))
|
|
|
|
|
|
|
+ model.eq_Balance = pe.Constraint(model.c, rule=eq_Balance_rule)
|
|
|
|
|
|
|
|
- model.eq_Per = pe.Constraint(model.n, rule=eq_Per_rule)
|
|
|
|
|
|
|
+ # Perdidas en estado base
|
|
|
|
|
|
|
|
- # Balance de Flujos
|
|
|
|
|
|
|
+ model_logger.info("Perdidas en estado Base")
|
|
|
|
|
|
|
|
- model_logger.info("Balance de Flujos")
|
|
|
|
|
|
|
+ def eq_perdidas_base_rule(model):
|
|
|
|
|
+ return sum(model.PL[c] for c in model.c) == sum(
|
|
|
|
|
+ sum(model.gamma_k[k]*model.VITX[n, k] for k in model.k) +
|
|
|
|
|
+ sum(model.VITEX[n, o] for o in model.o) for n in model.n)
|
|
|
|
|
|
|
|
- def eq_Balance_rule(model, c):
|
|
|
|
|
- return model.F[c] == sum(model.He[c, n]*(
|
|
|
|
|
- sum(model.alpha_k[k]*model.T[n, k] for k in model.k) +
|
|
|
|
|
- sum(model.TE[n, o] for o in model.o) +
|
|
|
|
|
- sum(model.gamma_k[k]*model.VITX[n, k] for k in model.k) +
|
|
|
|
|
- sum(model.VITEX[n, o]for o in model.o) -
|
|
|
|
|
- model.Per[n]) for n in model.n)
|
|
|
|
|
|
|
+ model.eq_perdidas_base = pe.Constraint(rule=eq_perdidas_base_rule)
|
|
|
|
|
|
|
|
- model.eq_Balance = pe.Constraint(model.c, rule=eq_Balance_rule)
|
|
|
|
|
|
|
+ # Máximas capacidades de trasferencia entre áreas de control
|
|
|
|
|
|
|
|
- # Perdidas en estado base
|
|
|
|
|
|
|
+ model_logger.info(
|
|
|
|
|
+ "Máxima Capacidad de Trasnferencia entre áreas de control")
|
|
|
|
|
|
|
|
- model_logger.info("Perdidas en estado Base")
|
|
|
|
|
|
|
+ def eq_mct_ns_rule(model, i):
|
|
|
|
|
+ return sum(model.DirF[i]*model.F[c] for c in lin_mct[i]) <= \
|
|
|
|
|
+ model.Mct[i, 'ns', Mes]/100
|
|
|
|
|
|
|
|
- def eq_perdidas_base_rule(model):
|
|
|
|
|
- return sum(model.PL[c] for c in model.c) == sum(
|
|
|
|
|
- sum(model.gamma_k[k]*model.VITX[n, k] for k in model.k) +
|
|
|
|
|
- sum(model.VITEX[n, o] for o in model.o) for n in model.n)
|
|
|
|
|
|
|
+ model.eq_mct_ns = pe.Constraint(model.i, rule=eq_mct_ns_rule)
|
|
|
|
|
|
|
|
- model.eq_perdidas_base = pe.Constraint(rule=eq_perdidas_base_rule)
|
|
|
|
|
|
|
+ def eq_mct_sn_rule(model, i):
|
|
|
|
|
+ return sum(model.DirF[i]*model.F[c] for c in lin_mct[i]) >= \
|
|
|
|
|
+ -model.Mct[i, 'sn', Mes]/100
|
|
|
|
|
|
|
|
- # Máximas capacidades de trasferencia entre áreas de control
|
|
|
|
|
|
|
+ model.eq_mct_sn = pe.Constraint(model.i, rule=eq_mct_sn_rule)
|
|
|
|
|
|
|
|
- model_logger.info(
|
|
|
|
|
- "Máxima Capacidad de Trasnferencia entre áreas de control")
|
|
|
|
|
|
|
+ # Maxima importacion/exportacion
|
|
|
|
|
+ def eq_imp_i_rule(model, p):
|
|
|
|
|
+ if p == 'ES': # Maxima exportacion de El Salvador
|
|
|
|
|
+ return ((sum(model.F[c] for c in lin_mct['ELSHON'])) -
|
|
|
|
|
+ (sum(model.F[c] for c in lin_mct['GUAELS']))) <= model.Imp[p, 'e', Mes]/100
|
|
|
|
|
|
|
|
- def eq_mct_ns_rule(model, i):
|
|
|
|
|
- return sum(model.DirF[i]*model.F[c] for c in lin_mct[i]) <= \
|
|
|
|
|
- model.Mct[i, 'ns']
|
|
|
|
|
|
|
+ elif p == 'GUA':
|
|
|
|
|
+ return ((sum(model.F[c] for c in lin_mct['GUAHON'])) +
|
|
|
|
|
+ (sum(model.F[c] for c in lin_mct['GUAELS']))) <= model.Imp[p, 'e', Mes]/100
|
|
|
|
|
|
|
|
- model.eq_mct_ns = pe.Constraint(model.i, rule=eq_mct_ns_rule)
|
|
|
|
|
|
|
+ elif p == 'HON': # Maxima importacion de Honduras
|
|
|
|
|
+ return (-(sum(model.F[c] for c in lin_mct['ELSHON'])) -
|
|
|
|
|
+ (sum(model.F[c] for c in lin_mct['GUAHON'])) +
|
|
|
|
|
+ (sum(model.F[c] for c in lin_mct['HONNIC']))) <= model.Imp[p, 'e', Mes]/100
|
|
|
|
|
|
|
|
- def eq_mct_sn_rule(model, i):
|
|
|
|
|
- return sum(model.DirF[i]*model.F[c] for c in lin_mct[i]) >= \
|
|
|
|
|
- -model.Mct[i, 'sn']
|
|
|
|
|
|
|
+ elif p == 'NIC': # Maxima exportacion de Nicaragua
|
|
|
|
|
+ return ((sum(model.F[c] for c in lin_mct['NICCRI'])) -
|
|
|
|
|
+ (sum(model.F[c] for c in lin_mct['HONNIC']))) <= model.Imp[p, 'e', Mes]/100
|
|
|
|
|
|
|
|
- model.eq_mct_sn = pe.Constraint(model.i, rule=eq_mct_sn_rule)
|
|
|
|
|
|
|
+ elif p == 'CR': # Maxima exportacion de Costa Rica
|
|
|
|
|
+ return (-((sum(model.F[c] for c in lin_mct['NICCRI'])) +
|
|
|
|
|
+ (sum(model.F[c] for c in lin_mct['CRIPAN'])))) <= model.Imp[p, 'e', Mes]/100
|
|
|
|
|
|
|
|
- model.dual = pe.Suffix(direction=pe.Suffix.IMPORT)
|
|
|
|
|
|
|
+ elif p == 'PAN':
|
|
|
|
|
+ return sum(model.F[c] for c in lin_mct['CRIPAN']) <= model.Imp[p, 'e', Mes]/100
|
|
|
|
|
+ model.eq_i = pe.Constraint(model.p, rule=eq_imp_i_rule)
|
|
|
|
|
|
|
|
- model_logger.info("Construcción del modelo terminada.")
|
|
|
|
|
|
|
+ def eq_imp_e_rule(model, p):
|
|
|
|
|
+ if p == 'ES': # Maxima exportacion de El Salvador
|
|
|
|
|
+ return ((sum(model.F[c] for c in lin_mct['ELSHON'])) -
|
|
|
|
|
+ (sum(model.F[c] for c in lin_mct['GUAELS']))) >= - model.Imp[p, 'i', Mes]/100
|
|
|
|
|
|
|
|
- filename = path.basename(self.file).split('.')[0]
|
|
|
|
|
- filepath = path.dirname(self.file)
|
|
|
|
|
|
|
+ elif p == 'GUA':
|
|
|
|
|
+ return ((sum(model.F[c] for c in lin_mct['GUAHON'])) +
|
|
|
|
|
+ (sum(model.F[c] for c in lin_mct['GUAELS']))) >= - model.Imp[p, 'i', Mes]/100
|
|
|
|
|
|
|
|
- try:
|
|
|
|
|
- model_logger.info("Enviando modelo algebraico al solver")
|
|
|
|
|
- opt = SolverFactory(
|
|
|
|
|
- 'ipopt'
|
|
|
|
|
- )
|
|
|
|
|
|
|
+ elif p == 'HON': # Maxima importacion de Honduras
|
|
|
|
|
+ return (-(sum(model.F[c] for c in lin_mct['ELSHON'])) -
|
|
|
|
|
+ (sum(model.F[c] for c in lin_mct['GUAHON'])) +
|
|
|
|
|
+ (sum(model.F[c] for c in lin_mct['HONNIC']))) >= - model.Imp[p, 'i', Mes]/100
|
|
|
|
|
|
|
|
- model_logger.info("Buscando una solución optima al problema")
|
|
|
|
|
- result = opt.solve(
|
|
|
|
|
- model, tee=self.tee,
|
|
|
|
|
- logfile=f"log/solver_{filename}.log")
|
|
|
|
|
|
|
+ elif p == 'NIC': # Maxima exportacion de Nicaragua
|
|
|
|
|
+ return ((sum(model.F[c] for c in lin_mct['NICCRI'])) -
|
|
|
|
|
+ (sum(model.F[c] for c in lin_mct['HONNIC']))) >= - model.Imp[p, 'i', Mes]/100
|
|
|
|
|
|
|
|
- model.solutions.store_to(result)
|
|
|
|
|
- result.write(
|
|
|
|
|
- filename=f"{APPDIRS['DATA']}/results_{filename}.json",
|
|
|
|
|
- format='json')
|
|
|
|
|
- model_logger.info("Solucion encontrada")
|
|
|
|
|
|
|
+ elif p == 'CR': # Maxima exportacion de Costa Rica
|
|
|
|
|
+ return (-((sum(model.F[c] for c in lin_mct['NICCRI'])) +
|
|
|
|
|
+ (sum(model.F[c] for c in lin_mct['CRIPAN'])))) >= - model.Imp[p, 'i', Mes]/100
|
|
|
|
|
|
|
|
- except Exception as e:
|
|
|
|
|
- model_logger.error("No se ejecutó el problema.")
|
|
|
|
|
- model_logger.critical("Error: {}".format(e))
|
|
|
|
|
- return
|
|
|
|
|
|
|
+ elif p == 'PAN':
|
|
|
|
|
+ return sum(model.F[c] for c in lin_mct['CRIPAN']) >= - model.Imp[p, 'i', Mes]/100
|
|
|
|
|
+ model.eq_e = pe.Constraint(model.p, rule=eq_imp_e_rule)
|
|
|
|
|
|
|
|
- # Cálculo de Precios Nodales
|
|
|
|
|
- # =============================================================================
|
|
|
|
|
- model_logger.info("Calculando Precios Nodales")
|
|
|
|
|
|
|
+ model.dual = pe.Suffix(direction=pe.Suffix.IMPORT)
|
|
|
|
|
|
|
|
- Sigma = zeros(nbr)
|
|
|
|
|
- for c in model.c:
|
|
|
|
|
- Sigma[c] = model.dual[model.eq_Balance[c]]
|
|
|
|
|
|
|
+ model_logger.info("Construcción del modelo terminada.")
|
|
|
|
|
|
|
|
- Lambda = model.dual[model.eq_perdidas_base]
|
|
|
|
|
|
|
+ filename = path.basename(self.file).split('.')[0]
|
|
|
|
|
+ filepath = path.dirname(self.file)
|
|
|
|
|
|
|
|
- PON = (H.T @ Sigma) + Lambda
|
|
|
|
|
|
|
+ try:
|
|
|
|
|
+ model_logger.info("Enviando modelo algebraico al solver")
|
|
|
|
|
+ opt = SolverFactory(
|
|
|
|
|
+ 'ipopt'
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
- # Cálculo de Pagos por Derechos Firmes
|
|
|
|
|
- # =============================================================================
|
|
|
|
|
- model_logger.info("Calculando Pagos Asignados por Derechos Firmes")
|
|
|
|
|
|
|
+ model_logger.info("Buscando una solución optima al problema")
|
|
|
|
|
+ result = opt.solve(
|
|
|
|
|
+ model, tee=self.tee,
|
|
|
|
|
+ logfile=f"log/solver_{filename}.log")
|
|
|
|
|
|
|
|
- alpha = array(list(model.alpha_k.get_values().values()))
|
|
|
|
|
- psi = array(list(model.gamma_k.get_values().values()))
|
|
|
|
|
|
|
+ model.solutions.store_to(result)
|
|
|
|
|
+ result.write(
|
|
|
|
|
+ filename=f"{APPDIRS['DATA']}/results_{filename}.json",
|
|
|
|
|
+ format='json')
|
|
|
|
|
+ model_logger.info("Solucion encontrada")
|
|
|
|
|
|
|
|
- PDF_k = zeros(nof)
|
|
|
|
|
|
|
+ except Exception as e:
|
|
|
|
|
+ model_logger.error("No se ejecutó el problema.")
|
|
|
|
|
+ model_logger.critical("Error: {}".format(e))
|
|
|
|
|
+ return
|
|
|
|
|
|
|
|
- for i in range(0, nof):
|
|
|
|
|
- PDF_k[i] = -PON.T @ (alpha[i]*t[:, i] + psi[i]*vitx[:, i])
|
|
|
|
|
|
|
+ # Cálculo de Precios Nodales
|
|
|
|
|
+ # =============================================================================
|
|
|
|
|
+ model_logger.info("Calculando Precios Nodales")
|
|
|
|
|
|
|
|
- # Construcción de array flujos en interconexiones
|
|
|
|
|
- # =============================================================================
|
|
|
|
|
|
|
+ Sigma = zeros(nbr)
|
|
|
|
|
+ for c in model.c:
|
|
|
|
|
+ Sigma[c] = model.dual[model.eq_Balance[c]]
|
|
|
|
|
|
|
|
- intercon = {}
|
|
|
|
|
|
|
+ Lambda = model.dual[model.eq_perdidas_base]
|
|
|
|
|
|
|
|
- for i in model.i:
|
|
|
|
|
- intercon[i] = [pe.value(model.eq_mct_sn[i].lower),
|
|
|
|
|
- pe.value(model.eq_mct_ns[i].body),
|
|
|
|
|
- pe.value(model.eq_mct_ns[i].upper)]
|
|
|
|
|
|
|
+ PON = (H.T @ Sigma) + Lambda
|
|
|
|
|
|
|
|
- flujos_inter = pd.DataFrame.from_dict(intercon)
|
|
|
|
|
- flujos_inter = flujos_inter * 100
|
|
|
|
|
|
|
+ # Cálculo de Pagos por Derechos Firmes
|
|
|
|
|
+ # =============================================================================
|
|
|
|
|
+ model_logger.info("Calculando Pagos Asignados por Derechos Firmes")
|
|
|
|
|
|
|
|
- # Construcción de array para grabar
|
|
|
|
|
- # =============================================================================
|
|
|
|
|
- # filename = path.basename(self.file).split('.')
|
|
|
|
|
- # filepath = path.dirname(self.file)
|
|
|
|
|
|
|
+ alpha = array(list(model.alpha_k.get_values().values()))
|
|
|
|
|
+ psi = array(list(model.gamma_k.get_values().values()))
|
|
|
|
|
|
|
|
- model_logger.info(
|
|
|
|
|
- "Escribiendo resultados en carpeta {0}".format(filepath))
|
|
|
|
|
|
|
+ PDF_k = zeros(nof)
|
|
|
|
|
|
|
|
- # Resultados de Asignación
|
|
|
|
|
|
|
+ for i in range(0, nof):
|
|
|
|
|
+ PDF_k[i] = -PON.T @ (alpha[i]*t[:, i] + psi[i]*vitx[:, i])
|
|
|
|
|
|
|
|
- resultado = of.copy()
|
|
|
|
|
|
|
+ # Construcción de array flujos en interconexiones
|
|
|
|
|
+ # =============================================================================
|
|
|
|
|
|
|
|
- resultado['alpha'] = alpha
|
|
|
|
|
- resultado['gamma'] = psi
|
|
|
|
|
- resultado['MW_asign'] = resultado['MWo'] * resultado['alpha']
|
|
|
|
|
- resultado['per_asign'] = resultado['per'] * resultado['gamma']
|
|
|
|
|
- resultado['monto_asign'] = PDF_k.round(2)
|
|
|
|
|
- resultado['precio_mw'] = resultado['monto_asign'] / \
|
|
|
|
|
- (resultado['MW_asign'] * 24 * 31) # Se toman meses de 31 días
|
|
|
|
|
|
|
+ intercon = {}
|
|
|
|
|
|
|
|
- resultado.to_pickle(
|
|
|
|
|
- path=f'{APPDIRS["DATA"]}/asignaciones_{filename}.dat')
|
|
|
|
|
|
|
+ for i in model.i:
|
|
|
|
|
+ intercon[i] = [pe.value(model.eq_mct_sn[i].lower),
|
|
|
|
|
+ pe.value(model.eq_mct_ns[i].body),
|
|
|
|
|
+ pe.value(model.eq_mct_ns[i].upper)]
|
|
|
|
|
|
|
|
- # Flujos de Potencia
|
|
|
|
|
|
|
+ flujos_inter = pd.DataFrame.from_dict(intercon)
|
|
|
|
|
+ flujos_inter = flujos_inter * 100
|
|
|
|
|
|
|
|
- flujos = net.copy()
|
|
|
|
|
- flujos = flujos.drop(['x', 'r', 'max', 'min'], axis=1)
|
|
|
|
|
- f = array(list(model.F.get_values().values()))
|
|
|
|
|
- flujos['linea'] = brnames
|
|
|
|
|
- flujos['flujo'] = f
|
|
|
|
|
- flujos['perdidas'] = array(list(model.PL.get_values().values()))
|
|
|
|
|
- flujos['sigma'] = Sigma
|
|
|
|
|
|
|
+ intercon_pais = {}
|
|
|
|
|
|
|
|
- flujos.to_pickle(
|
|
|
|
|
- path=f'{APPDIRS["DATA"]}/flujos_{filename}.dat')
|
|
|
|
|
|
|
+ for p in model.p:
|
|
|
|
|
+ intercon_pais[p] = [pe.value(model.eq_e[p].lower),
|
|
|
|
|
+ pe.value(model.eq_i[p].body),
|
|
|
|
|
+ pe.value(model.eq_i[p].upper)]
|
|
|
|
|
|
|
|
- # Precios por Nodo
|
|
|
|
|
|
|
+ flujos_paises = pd.DataFrame.from_dict(intercon_pais)
|
|
|
|
|
+ flujos_paises = flujos_paises * 100
|
|
|
|
|
+
|
|
|
|
|
+ # Construcción de array para grabar
|
|
|
|
|
+ # =============================================================================
|
|
|
|
|
+ # filename = path.basename(self.file).split('.')
|
|
|
|
|
+ # filepath = path.dirname(self.file)
|
|
|
|
|
+
|
|
|
|
|
+ model_logger.info(
|
|
|
|
|
+ "Escribiendo resultados en carpeta {0}".format(filepath))
|
|
|
|
|
+
|
|
|
|
|
+ # Resultados de Asignación
|
|
|
|
|
|
|
|
- pon = bus.copy()
|
|
|
|
|
- pon['PON'] = PON
|
|
|
|
|
|
|
+ resultado = of.copy()
|
|
|
|
|
|
|
|
- pon.to_pickle(
|
|
|
|
|
- path=f'{APPDIRS["DATA"]}/pon_{filename}.dat')
|
|
|
|
|
|
|
+ resultado['alpha'] = alpha
|
|
|
|
|
+ resultado['gamma'] = psi
|
|
|
|
|
+ resultado['MW_asign'] = resultado['MWo'] * resultado['alpha']
|
|
|
|
|
+ resultado['per_asign'] = resultado['per'] * resultado['gamma']
|
|
|
|
|
+ resultado['monto_asign'] = PDF_k.round(2)
|
|
|
|
|
+ resultado['precio_mw'] = resultado['monto_asign'] / \
|
|
|
|
|
+ (resultado['MW_asign'] * 24 * 31) # Se toman meses de 31 días
|
|
|
|
|
|
|
|
- flujos_inter.to_pickle(
|
|
|
|
|
- path=f'{APPDIRS["DATA"]}/flujos_inter_{filename}.dat')
|
|
|
|
|
|
|
+ resultado.to_pickle(
|
|
|
|
|
+ path=f'{APPDIRS["DATA"]}/asignaciones_{filename}.dat')
|
|
|
|
|
|
|
|
- # Grabar en csv
|
|
|
|
|
- # =================================================================================
|
|
|
|
|
- csv_path = filepath
|
|
|
|
|
- model_logger.info("Escribiendo archivo de asignaciones")
|
|
|
|
|
- resultado.to_csv(
|
|
|
|
|
- path.join(csv_path,
|
|
|
|
|
- filename + '_asignacion.csv'), sep=',', index=False)
|
|
|
|
|
|
|
+ # Flujos de Potencia
|
|
|
|
|
+
|
|
|
|
|
+ flujos = net.copy()
|
|
|
|
|
+ flujos = flujos.drop(['x', 'r', 'max', 'min'], axis=1)
|
|
|
|
|
+ f = array(list(model.F.get_values().values()))
|
|
|
|
|
+ flujos['linea'] = brnames
|
|
|
|
|
+ flujos['flujo'] = f
|
|
|
|
|
+ flujos['perdidas'] = array(list(model.PL.get_values().values()))
|
|
|
|
|
+ flujos['sigma'] = Sigma
|
|
|
|
|
+
|
|
|
|
|
+ flujos.to_pickle(
|
|
|
|
|
+ path=f'{APPDIRS["DATA"]}/flujos_{filename}.dat')
|
|
|
|
|
+
|
|
|
|
|
+ # Precios por Nodo
|
|
|
|
|
+
|
|
|
|
|
+ pon = bus.copy()
|
|
|
|
|
+ pon['PON'] = PON
|
|
|
|
|
+
|
|
|
|
|
+ pon.to_pickle(
|
|
|
|
|
+ path=f'{APPDIRS["DATA"]}/pon_{filename}.dat')
|
|
|
|
|
+
|
|
|
|
|
+ flujos_inter.to_pickle(
|
|
|
|
|
+ path=f'{APPDIRS["DATA"]}/flujos_inter_{filename}.dat')
|
|
|
|
|
|
|
|
- model_logger.info("Escribiendo archivo de flujos de potencia")
|
|
|
|
|
- flujos.to_csv(
|
|
|
|
|
- path.join(csv_path,
|
|
|
|
|
- filename + '_flujos.csv'), sep=',', index=False)
|
|
|
|
|
|
|
+ flujos_paises.to_pickle(
|
|
|
|
|
+ path=f'{APPDIRS["DATA"]}/flujos_paises_{filename}.dat')
|
|
|
|
|
|
|
|
- model_logger.info("Escribiendo archivo de flujos de precios")
|
|
|
|
|
- pon.to_csv(
|
|
|
|
|
- path.join(csv_path,
|
|
|
|
|
- filename + '_pon.csv'), sep=',', index=False)
|
|
|
|
|
|
|
+ picklefile = filename
|
|
|
|
|
|
|
|
- model_logger.info(
|
|
|
|
|
- "Escribiendo archivo de flujos de potencia entre areas de control")
|
|
|
|
|
- flujos_inter.to_csv(
|
|
|
|
|
- path.join(csv_path,
|
|
|
|
|
- filename + '_flujos_inter.csv'), sep=',', index=False)
|
|
|
|
|
|
|
+ # Grabar en excel
|
|
|
|
|
+ # ================================================================================
|
|
|
|
|
+ model_logger.info("Escribiendo archivo de resultados")
|
|
|
|
|
+ filename = path.basename(self.file).split('.')
|
|
|
|
|
+ filepath = path.dirname(self.file)
|
|
|
|
|
+ new_filename = filename[0] + \
|
|
|
|
|
+ '_results_{}.'.format(str(Mes))+filename[1]
|
|
|
|
|
+ new_file = path.join(filepath, new_filename)
|
|
|
|
|
+ writer = ExcelWriter(new_file)
|
|
|
|
|
+ resultado.to_excel(writer, sheet_name='MW Asignacion',
|
|
|
|
|
+ index=False, header=True)
|
|
|
|
|
+ flujos.to_excel(writer, sheet_name='Flujos',
|
|
|
|
|
+ index=False, header=True)
|
|
|
|
|
+ flujos_inter.to_excel(
|
|
|
|
|
+ writer, sheet_name='Flujos inter', index=False, header=True)
|
|
|
|
|
+ flujos_paises.to_excel(
|
|
|
|
|
+ writer, sheet_name='IMP-EXP TOT', index=False, header=True)
|
|
|
|
|
+ pon.to_excel(writer, sheet_name='pon', index=False, header=True)
|
|
|
|
|
+ writer.save()
|
|
|
|
|
+
|
|
|
|
|
+ # # Validacion de flujos
|
|
|
|
|
+ # # =================================================================================
|
|
|
|
|
+
|
|
|
|
|
+ validar_flujos(picklefile, mctp, Mes)
|
|
|
|
|
+
|
|
|
|
|
+ # # Grabar en csv
|
|
|
|
|
+ # # =================================================================================
|
|
|
|
|
+ # csv_path = filepath
|
|
|
|
|
+ # model_logger.info("Escribiendo archivo de asignaciones")
|
|
|
|
|
+ # resultado.to_csv(
|
|
|
|
|
+ # path.join(csv_path,
|
|
|
|
|
+ # filename + '_asignacion.csv'), sep=',', index=False)
|
|
|
|
|
+
|
|
|
|
|
+ # model_logger.info("Escribiendo archivo de flujos de potencia")
|
|
|
|
|
+ # flujos.to_csv(
|
|
|
|
|
+ # path.join(csv_path,
|
|
|
|
|
+ # filename + '_flujos.csv'), sep=',', index=False)
|
|
|
|
|
+
|
|
|
|
|
+ # model_logger.info("Escribiendo archivo de flujos de precios")
|
|
|
|
|
+ # pon.to_csv(
|
|
|
|
|
+ # path.join(csv_path,
|
|
|
|
|
+ # filename + '_pon.csv'), sep=',', index=False)
|
|
|
|
|
+
|
|
|
|
|
+ # model_logger.info(
|
|
|
|
|
+ # "Escribiendo archivo de flujos de potencia entre areas de control")
|
|
|
|
|
+ # flujos_inter.to_csv(
|
|
|
|
|
+ # path.join(csv_path,
|
|
|
|
|
+ # filename + '_flujos_inter.csv'), sep=',', index=False)
|