entrega de cÓdigo fuente del algoritmo usado para la ... · medellín, 28 de noviembre de 2019...
Post on 22-May-2020
3 Views
Preview:
TRANSCRIPT
ENTREGA DE CÓDIGO FUENTE DEL ALGORITMO USADO PARA LA SEGUNDA SUBASTA DE CLPE
NOVIEMBRE - 2019
Medellín, 28 de noviembre de 2019 Ingeniero RICARDO RAMÍREZ CARRERO Director UPME Asunto: Entrega código fuente algoritmo segunda subasta CLPE Estimado Ingeniero Ramirez,
En el presente documento se hace la entrega del código fuente del algoritmo desarrollado por Rightside para la segunda subasta de CLPE en Colombia. La versión descrita corresponde a la
ejecutada el día 22 de octubre de 2019, día en que fue realizada la adjudicación.
Quedamos atentos a cualquier inquietud que pueda surgir con el código.
Cordialmente, __________________________ Oscar Mauricio Carreño Rincón Representante Legal RIGHTSIDE S.A.S
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
CÓDIGO ARCHIVO DATOSENTRADA.PY
# --------------------------------------------------------
# MODELO SUBASTA CLPE
# DESARROLLADO PARA LA UPME Y EL MME
# Rightside SAS - 2019 - www.rightside.app
# --------------------------------------------------------
import pandas as pd
from pandasql import sqldf
import datetime
from os import getcwd
from openpyxl import load_workbook
import pyodbc
conn = pyodbc.connect('Driver={SQL Server};'
'Server=localhost\SQLEXPRESS;'
'Database=Subasta;'
'Trusted_Connection=yes;')
cursor = conn.cursor()
sqlp1 = 'SELECT [IdParametroSubasta],[DemandaObjetivo],[TopeMaximoPromedio],[TopeMaximoIndiv
idual],[TamanoPaquete]*1000 [TamanoPaquete] FROM [Subasta].[dbo].[ParametrosSubasta]'
for row in cursor.execute(sqlp1):
paqueteKWH=(row.TamanoPaquete)
PRECIOTOPE=(row.TopeMaximoPromedio)
PRECIOMAXIMO=(row.TopeMaximoIndividual)
DEMANDAOBJETIVO=(row.DemandaObjetivo)
optimizador = 'gams'
tolerancia = 0.000001
toleranciaABS = 1
tiempoLimite = 10000
sql1='SELECT rtrim([nombre]) [nombre],rtrim([ID_oferta]) [ID_oferta],[energiaMax] energiaMax_
MWh_d,[precio] precio_COP_kWh,[ordenllegada] ordenLlegada,[Sobre],[Proceso],[energiaMin] ener
giaMinima FROM [dbo].[ofertasCompra] where sobre=2'
sql2='SELECT rtrim([nombre]) [nombre],rtrim([ID_oferta]) [ID_oferta] , rtrim([bloque]) [bloq
ue],[numPaquetesMax],[numPaquetesMin],[precio] precio_COP_kWh,rtrim([simultanea]) [simultanea
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
],rtrim([excluyente]) [excluyente],rtrim([dependiente]) [dependiente],[ordenllegada] ordenLle
gada,[Sobre],[Proceso],0 [obligatorio] FROM [dbo].[ofertasVenta] where sobre=2'
sql3='SELECT rtrim([nombre]) [nombre],rtrim([empresa]) [empresa] ,[energiaMaximaGarantizada],
[Proceso] FROM [dbo].[proyectosGeneracion]'
sql4='SELECT rtrim([bloques]) [bloques],[pi],[pf] FROM [dbo].[bloques]'
ofertasCompra = pd.read_sql(sql1, conn).set_index(['ID_oferta'])
ofertasVenta = pd.read_sql(sql2, conn).set_index(['ID_oferta','bloque'])
proyectosVenta= pd.read_sql(sql2, conn).set_index(['nombre','ID_oferta'])
proyectosCompra = pd.read_sql(sql1, conn).set_index(['nombre','ID_oferta'])
proyectosGeneracion = pd.read_sql(sql3, conn).set_index(['nombre'])
Bloques = pd.read_sql(sql4, conn).set_index(['bloques'])
conn.close()
#LECTURA DE INDICES;
Comercializadores = sqldf("SELECT distinct(nombre) FROM ofertasCompra WHERE nombre <> ' ' OR
DER BY nombre;", locals())
Generadores = sqldf("SELECT distinct(nombre) FROM proyectosGeneracion WHERE nombre <> ' ' OR
DER BY nombre;", locals())
Empresas = sqldf("SELECT distinct(empresa) FROM proyectosGeneracion;", locals())
bloques = sqldf("SELECT distinct(bloques) FROM Bloques;", locals())
id_c = sqldf("SELECT distinct(ID_oferta) FROM ofertasCompra;", locals())
id_v = sqldf("SELECT distinct(ID_oferta) FROM ofertasVenta;", locals())
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
CÓDIGO ARCHIVO SUBASTACLPE.PY
# ___________________________________________________________________________
#
# Pyomo: Python Optimization Modeling Objects
# Copyright 2017 National Technology and Engineering Solutions of Sandia, LLC
# Under the terms of Contract DE-NA0003525 with National Technology and
# Engineering Solutions of Sandia, LLC, the U.S. Government retains certain
# rights in this software.
# This software is distributed under the 3-clause BSD License.
# ___________________________________________________________________________
# --------------------------------------------------------
# MODELO SUBASTA CLPE
# DESARROLLADO PARA LA UPME Y EL Ministerio de Minas y Energia
# Oscar Carreno - Rightside SAS - 2019 - www.rightside.app
# --------------------------------------------------------
from pyomo.environ import *
from pyomo.opt import SolverFactory , SolverStatus, TerminationCondition
from pyomo.core import Constraint
from pyomo.opt import ProblemFormat
from pandas import ExcelWriter
from pandas import ExcelFile
import pandas as pd
from openpyxl import load_workbook
from DatosEntrada import *
import linecache
import sys
import math
import pyodbc
conn = pyodbc.connect('Driver={SQL Server};'
'Server=localhost\SQLEXPRESS;'
'Database=Subasta;'
'Trusted_Connection=yes;')
cursor = conn.cursor()
print ()
print(" EJECUTANDO MODELO DE SUBASTA CLPE Version 5.3 - Version Definitiva")
print ()
def PrintException():
exc_type, exc_obj, tb = sys.exc_info()
f = tb.tb_frame
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
lineno = tb.tb_lineno
filename = f.f_code.co_filename
linecache.checkcache(filename)
line = linecache.getline(filename, lineno, f.f_globals)
print ('SE ENCONTRo UN ERROR ({}, LINE {} "{}"): {}'.format(filename, lineno, line.strip(
), exc_obj))
def truncate(number, digits) -> float:
stepper = 10.0 ** digits
return math.trunc(stepper * number) / stepper
segundoMecanismo = 1
PRECIOCOMPRA = {}
PRECIOVENTA = {}
MAXCOMPRA = {}
MAXVENTA = {}
MINVENTA ={}
DURACION = {}
BLOQUEOFERTAV = {}
POTENCIAMAXV_KWH = {}
ENERGIAMAXV_KWH = {}
sumMAXCOMPRA = 0
sumVENTA = 0
CRITERIOCOMPETENCIA = {}
ENERGIAMAXV_KWH_CC = {}
ENERGIAMAXV_KWH_TOTAL = 0
ID_G = {}
ID_B = {}
ID_C = {}
PRECIOCOMPRA_DESEMPATADO = {}
PRECIOVENTA_DESEMPATADO = {}
MINPRECIOVENTA = 0
ASIGNACION_COMPRA = {}
ASIGNACION_VENTA = {}
BINARIAS_VENTA = {}
DEMANDA_MINIMA = {}
ENERGIA_GARANTIZADA = {}
OFE_GEN = {}
try:
while segundoMecanismo >= 1:
clpe = ConcreteModel()
clpe.COMERCIALIZADORES = Set(initialize=Comercializadores.nombre, ordered = True)
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
clpe.GENERADORES = Set(initialize=Generadores.nombre, ordered = True)
clpe.EMPRESAS = Set(initialize=Empresas.empresa, ordered = True)
clpe.BLOQUES = Set(initialize=bloques.bloques, ordered = True)
clpe.ID_C = Set(initialize=id_c.ID_oferta, ordered = True)
clpe.ID_V = Set(initialize=id_v.ID_oferta, ordered = True)
clpe.NOMBRE_ID_VENTA = Set(clpe.GENERADORES)
for b in Bloques.index:
DURACION[b] = 1 + Bloques.pf[b] - Bloques.pi[b]
for p in proyectosVenta.index:
clpe.NOMBRE_ID_VENTA[p[0]].add(p[1])
ID_G[p[1]] = p[0]
for p in proyectosCompra.index:
ID_C[p[1]] = p[0]
for c in clpe.COMERCIALIZADORES:
DEMANDA_MINIMA [c] = 0
if segundoMecanismo == 1:
ASIGNACION_COMPRA[c] = 0
for c in ofertasCompra.index:
PRECIOCOMPRA[c] = 0
MAXCOMPRA[c] = 0
for c in ofertasCompra.index:
PRECIOCOMPRA[c] = ofertasCompra.precio_COP_kWh[c]
if str(ofertasCompra.precio_COP_kWh[c]) == 'nan': PRECIOCOMPRA[c] = 0
MAXCOMPRA[c] = ofertasCompra.energiaMax_MWh_d[c]*1000
sumMAXCOMPRA=sumMAXCOMPRA + MAXCOMPRA[c]
DEMANDA_MINIMA [ofertasCompra.nombre[c]] = ofertasCompra.energiaMinima[c]*1000
for i in clpe.ID_V:
for b in clpe.BLOQUES:
PRECIOVENTA[i] = 0
if segundoMecanismo == 1:
ASIGNACION_VENTA[i] = 0
BINARIAS_VENTA[i] = 0
for v in ofertasVenta.index:
MAXVENTA[v] = 0
MINVENTA[v] = 0
ID_B[v[0]] = v[1]
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
for g in proyectosGeneracion.index:
ENERGIA_GARANTIZADA[g] = proyectosGeneracion.energiaMaximaGarantizada[g]
OFE_GEN[g] = 0
for g in proyectosGeneracion.index:
for v in ofertasVenta.index:
if v[0] in clpe.NOMBRE_ID_VENTA[g]:
OFE_GEN[g] = 1
for v in ofertasVenta.index:
PRECIOVENTA[v[0]] = ofertasVenta.precio_COP_kWh[v]
MAXVENTA[v] = ofertasVenta.numPaquetesMax[v]*paqueteKWH*DURACION[v[1]]
MINVENTA[v] = ofertasVenta.numPaquetesMin[v]*paqueteKWH*DURACION[v[1]]
BLOQUEOFERTAV[v[0]] = v[1]
for e in clpe.EMPRESAS:
ENERGIAMAXV_KWH_CC[e] = 0
CRITERIOCOMPETENCIA[e] = 0
for c in ofertasCompra.index:
PRECIOCOMPRA_DESEMPATADO[c] = PRECIOCOMPRA[c]
for c in ofertasCompra.index:
for v in ofertasVenta.index:
if PRECIOCOMPRA[c] == PRECIOVENTA[v[0]]:
PRECIOCOMPRA_DESEMPATADO[c] = PRECIOCOMPRA[c] + 0.001
empatadosVenta = set()
unicoVenta = set()
for v in ofertasVenta.index:
PRECIOVENTA_DESEMPATADO[v[0]] = PRECIOVENTA[v[0]]
for v in ofertasVenta.index:
if PRECIOVENTA[v[0]] not in unicoVenta:
unicoVenta.add(PRECIOVENTA[v[0]])
else:
empatadosVenta.add(PRECIOVENTA[v[0]])
for v in ofertasVenta.index:
if PRECIOVENTA[v[0]] in empatadosVenta:
PRECIOVENTA_DESEMPATADO[v[0]] = PRECIOVENTA[v[0]] + ofertasVenta.ordenLlegada
[v]/100000
empatadosCompra = set()
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
unicoCompra = set()
for c in ofertasCompra.index:
if PRECIOCOMPRA[c] not in unicoCompra:
unicoCompra.add(PRECIOCOMPRA[c])
else:
empatadosCompra.add(PRECIOCOMPRA[c])
for c in ofertasCompra.index:
if PRECIOCOMPRA[c] in empatadosCompra:
PRECIOCOMPRA_DESEMPATADO[c] = PRECIOCOMPRA_DESEMPATADO[c] - ofertasCompra.ord
enLlegada[c]/100000
if segundoMecanismo == 2:
repetidoComercializador = set()
unicoComercializador = set()
contRepetido = {}
for c in proyectosCompra.index:
contRepetido[c[0]] = 0
if c[0] not in unicoComercializador:
unicoComercializador.add(c[0])
else:
repetidoComercializador.add(c[0])
for c in proyectosCompra.index:
PRECIOCOMPRA_DESEMPATADO[c[1]] = PRECIOMAXIMO
PRECIOCOMPRA[c[1]] = PRECIOMAXIMO
if ASIGNACION_COMPRA[c[0]] == 0:
if c[0] in repetidoComercializador:
MAXCOMPRA[c[1]] = 0
else:
MAXCOMPRA[c[1]] = DEMANDA_MINIMA[c[0]]
else:
if ASIGNACION_COMPRA[c[0]] >= DEMANDA_MINIMA[c[0]]:
MAXCOMPRA[c[1]] = 0
else:
if c[0] in repetidoComercializador:
contRepetido[c[0]] += 1
if contRepetido[c[0]] == 1:
MAXCOMPRA[c[1]] = DEMANDA_MINIMA[c[0]] - ASIGNACION_COMPRA[c[
0]]
else:
MAXCOMPRA[c[1]] = 0
else:
MAXCOMPRA[c[1]] = DEMANDA_MINIMA[c[0]] - ASIGNACION_COMPRA[c[0]]
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
for v in ofertasVenta.index:
MAXVENTA[v] = MAXVENTA[v] - ASIGNACION_VENTA[v[0]]
if ASIGNACION_VENTA[v[0]] > 0: MINVENTA[v] = 0
sumMAXCOMPRA = 0
for c in ofertasCompra.index:
sumMAXCOMPRA = sumMAXCOMPRA + MAXCOMPRA[c]
for v in ofertasVenta.index:
if PRECIOCOMPRA[c] == PRECIOVENTA[v[0]]:
PRECIOCOMPRA_DESEMPATADO[c] = PRECIOCOMPRA[c] + 0.001
porcentajeComercializadorMC = {}
if sumMAXCOMPRA < DEMANDAOBJETIVO*1000:
for c in ofertasCompra.index:
porcentajeComercializadorMC[c] = MAXCOMPRA[c]/sumMAXCOMPRA
MAXCOMPRA[c] = porcentajeComercializadorMC[c]*DEMANDAOBJETIVO*1000
# **************** INICIA MODELO MATEMaTICO ****************
# Variables enteras
clpe.asignacionV = Var(clpe.ID_V,domain=NonNegativeIntegers)
clpe.asignacionC = Var(clpe.ID_C,domain=NonNegativeIntegers)
clpe.binaria = Var(clpe.ID_V,domain=Boolean)
clpe.binariaC = Var(clpe.ID_C,domain=Boolean)
#------------------------------
# FUNCION OBJETIVO
#------------------------------
print ()
print(" MAXIMIZACIoN DE BENEFICIO CONSUMIDOR")
print ()
def Excedente_rule(clpe):
expr = sum (PRECIOCOMPRA_DESEMPATADO[c]*clpe.asignacionC[c]
for c in ofertasCompra.index)
expr -= sum ( PRECIOVENTA_DESEMPATADO[v[0]]*clpe.asignacionV[v[0]]
for v in ofertasVenta.index )
return expr
clpe.FuncionObjetivo = Objective(rule=Excedente_rule, sense=maximize)
# RESTRICCIONES DEL MODELO MATEMaTICO
# ********* Restriccion de balance
clpe.r0_balance = ConstraintList()
clpe.r0_balance.add (
sum (clpe.asignacionC[c]
for c in ofertasCompra.index )
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
== sum (clpe.asignacionV[v[0]]
for v in ofertasVenta.index)
)
# Restricciones para el segundo mecanismo
if segundoMecanismo == 2:
clpe.r_balanceSegundoMecanismo = ConstraintList()
clpe.r_balanceSegundoMecanismo.add (
sum (clpe.asignacionV[v[0]]
for v in ofertasVenta.index) <= DEMANDAOBJETIVO*1000
)
clpe.r_binariasSegundoMecanismo = ConstraintList()
for v in ofertasVenta.index:
if ASIGNACION_VENTA[v[0]] > 0:
clpe.r_binariasSegundoMecanismo.add (
clpe.binaria[v[0]] == 1
)
# ********* Restriccion de maximo compra
if segundoMecanismo == 1:
clpe.r1_maxCompra = ConstraintList()
for c in ofertasCompra.index:
clpe.r1_maxCompra.add ( clpe.asignacionC[c] <= MAXCOMPRA[c]*clpe.binariaC[c]
)
# ********* Restriccion de maximo venta potencia y
clpe.r2_maxVenta = ConstraintList()
clpe.r2_binMax = ConstraintList()
for v in ofertasVenta.index:
if PRECIOVENTA[v[0]] > PRECIOMAXIMO:
clpe.r2_maxVenta.add ( clpe.asignacionV[v[0]] == 0 )
clpe.r2_binMax.add ( clpe.binaria[v[0]] == 0 )
else:
clpe.r2_maxVenta.add ( clpe.asignacionV[v[0]] <= MAXVENTA[v]*clpe.binaria[v[0
]] )
# ********* Restriccion de maxima energia garantizada
clpe.r3_maxVentaEnergia = ConstraintList()
for g in proyectosGeneracion.index:
if OFE_GEN[g] > 0:
clpe.r3_maxVentaEnergia.add (
sum ( clpe.asignacionV[v[0]]
for v in ofertasVenta.index
if v[0] in clpe.NOMBRE_ID_VENTA[g] ) <= ENERGIA_GARANTIZADA[g]
)
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
# ********* Restriccion de minimo venta
clpe.r4_minVenta = ConstraintList()
for v in ofertasVenta.index:
clpe.r4_minVenta.add (
clpe.asignacionV[v[0]] >= MINVENTA[v]*clpe.binaria[v[0]] )
clpe.r4_obligatorio = ConstraintList()
for v in ofertasVenta.index:
if ofertasVenta.obligatorio[v] == 1:
clpe.r4_obligatorio.add ( clpe.binaria[v[0]] == 1 )
printclpe.binaria[v[0]]
if segundoMecanismo == 1:
clpe.r5_precioPonderado = ConstraintList()
for c in ofertasCompra.index:
clpe.r5_precioPonderado.add (
PRECIOCOMPRA[c]*sum (clpe.asignacionV[v[0]]
for v in ofertasVenta.index)
+ 9999999999*(1-
clpe.binariaC[c]) >= sum (PRECIOVENTA[v[0]] * clpe.asignacionV[v[0]]
for v in ofertasVenta.index)
)
# ********* Control de ofertas dependientes
clpe.r6_bindependiente = ConstraintList()
for v in ofertasVenta.index:
if (ofertasVenta.dependiente[v]) is not None:
clpe.r6_bindependiente.add (
clpe.binaria[v[0]] <= clpe.binaria[ofertasVenta.dependiente[v]]
)
# ********* Control de ofertas excluyentes
clpe.r7_binexcluyente = ConstraintList()
for v in ofertasVenta.index:
if (ofertasVenta.excluyente[v]) is not None:
clpe.r7_binexcluyente.add (
clpe.binaria[v[0]] <= 1 - clpe.binaria[ofertasVenta.excluyente[v]]
)
# ********* Control de ofertas simultaneas
clpe.r8_binsimultanea = ConstraintList()
for v in ofertasVenta.index:
if (ofertasVenta.simultanea[v]) is not None:
clpe.r8_binsimultanea.add (
clpe.binaria[v[0]] == clpe.binaria[ofertasVenta.simultanea[v]]
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
)
# ********* Restriccion para garantizar precio ponderado de
clpe.r9_precioPonderadoTope = ConstraintList()
clpe.r9_precioPonderadoTope.add (
sum ( (PRECIOTOPE - PRECIOVENTA[v[0]] ) * clpe.asignacionV[v[0]]
for v in ofertasVenta.index ) >= 0
)
#------------------------------
# EJECUTAR EL MODELO
#------------------------------
opt = SolverFactory(optimizador)
if optimizador == 'cbc':
opt.options['ratioGap'] = tolerancia
opt.options['allowableGap'] = toleranciaABS
opt.options['sec'] = tiempoLimite
if optimizador == 'cplex':
opt.options['mipgap'] = tolerancia
opt.options['mip_tolerances_absmipgap'] = toleranciaABS
opt.options['timelimit'] = tiempoLimite
clpe.write("clpe" + str(segundoMecanismo) + ".lp",io_options={"symbolic_solver_labels
":True})
print ()
if optimizador == 'gams':
print("Ejecutando con optimizador " , optimizador)
print ()
results = opt.solve(clpe,tee=1,solver='cplex',logfile ="clpeMIP" + str(segundoMec
anismo) + ".log", keepfiles= 0,symbolic_solver_labels=True)
else:
print("Optimizador: " , opt.name)
results = opt.solve(clpe,tee=1,logfile ="clpeMIP" + str(segundoMecanismo) + ".log
", keepfiles= 0,symbolic_solver_labels=True)
print ()
if (results.solver.status == SolverStatus.ok) and (results.solver.termination_conditi
on == TerminationCondition.optimal):
print ()
print ()
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
print(" ----- SE ENCONTRo SOLUCIoN oPTIMA ------")
print ()
print ("Funcion Objetivo PROBLEMA ENTERO: ", float(value(clpe.FuncionObjetivo)))
print ()
#------------------------------
# ESCRIBIR RESULTADOS
#------------------------------
print ("ESCRIBIENDO RESULTADOS EN LA BASE DE DATOS: ")
print ()
funcionObjetivo = 0
funcionObjetivo = round(value(clpe.FuncionObjetivo),2)
ofertasCompraOrder = ofertasCompra.sort_values(by=['precio_COP_kWh','ID_oferta','
ordenLlegada'],ascending=[False,True,True])
ofertasVentaOrder = ofertasVenta.sort_values(by=['precio_COP_kWh','ID_oferta','or
denLlegada'])
if segundoMecanismo == 1:
procesobd = 'Subasta'
else:
procesobd = 'Mecanismo'
if (procesobd =='Subasta'):
sqlborrar1='DELETE FROM [dbo].[ofertasCompraSalida]'
cursor.execute(sqlborrar1)
sqlborrar2='DELETE FROM [dbo].[ofertasVentaSalida]'
cursor.execute(sqlborrar2)
sqlborrar3='DELETE FROM [dbo].[ComprasVentasSalida]'
cursor.execute(sqlborrar3)
sqlborrar4='DELETE FROM [dbo].[resumenResultadosSubasta]'
cursor.execute(sqlborrar4)
sqlborrar5='DELETE FROM [dbo].[ContratosASIC]'
cursor.execute(sqlborrar5)
sqlborrar6='DELETE FROM [dbo].[asignaciones]'
cursor.execute(sqlborrar6)
conn.commit()
Concepto="'LA FUNCIoN OBJETIVO ES [$] ='"
InstruccionInsert='exec [dbo].[GrabarresumenResultadosPython] ' + Concepto + ",'"
+ str(funcionObjetivo) + "','" + procesobd + "'"
cursor.execute(InstruccionInsert)
Mensaje1='TOTAL ASIGNADO \n VENTA kWh-bloque'
Mensaje2='% ASIGNACIoN'
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
Concepto="'BLOQUE'"
InstruccionInsert='exec [dbo].[GrabarresumenResultadosPython] ' + Concepto + ",'"
+ str(Mensaje1) + " " + str(Mensaje2) + "','" + procesobd + "'"
cursor.execute(InstruccionInsert)
columnasAsignacionV = ["GENERADOR","ID_OFE","BLOQUE","ENERGIA_MAX (kWh-
b)","ENERGIA_MIN (kWh-b)","PRECIO (COP/kWh)","DESEMPATE (COP/kWh)","SIMULTaNEA",
"EXCLUYENTE","DEPENDIENTE","ASIGNACIoN (kWh-
b)","PORCENTAJE ASIGNACIoN %"]
columnasAsignacionC = ["COMERCIALIZADOR","ID_OFE","PRECIO (COP/kWh)","DESEMPATE (
COP/kWh)","ENERGIA_MAX_DIA (kWh-d)","ASIGNACIoN (kWh-d)","PORCENTAJE ASIGNACIoN %"]
columnasAsignacionContratos = ["VENDEDOR","ID_OFE","BLOQUE"]
columnasAsignacionContratosSIC = ["COMPRADOR","VENDEDOR","CONCEPTO"]
for p in range(1,25):
columnasAsignacionContratosSIC.append(p)
for c in ofertasCompraOrder.index:
columnasAsignacionContratos.append(ID_C[c])
out_asignacionVenta = pd.DataFrame(columns=columnasAsignacionV)
out_asignacionCompra = pd.DataFrame(columns=columnasAsignacionC)
out_asignacionContratos = pd.DataFrame(columns=columnasAsignacionContratos)
out_asignacionContratosASIC = pd.DataFrame(columns=columnasAsignacionContratosSIC
)
sumAsignacionTotal = 0
sumaproductoVenta = 0
precioPonderadoVenta = 0
sumAsignacionVentaBloque = {}
sumAsignacionCompraBloque = {}
sumAsignacionCompra = {}
sumAsignacionVenta = {}
sumAsignacionCompraBloqueT = {}
sumAsignacionVentaBloqueT = {}
porcentajeAsignacionBloque = {}
reAsignacionCompra = {}
prorataContratos = {}
MAXCOMPRA_C = {}
MAXCOMPRA_T = 0
sumaProductoPrecioPonderado = {}
precioPonderadoCompra = {}
PRECIOPROMEDIOVENTA = {}
reAsignacionCompraT = {}
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
for v in ofertasVentaOrder.index:
sumAsignacionVentaBloque[v[0]] = 0
for b in clpe.BLOQUES:
sumAsignacionVentaBloqueT[b] = 0
for c in ofertasCompraOrder.index:
sumaProductoPrecioPonderado[c] = 0
precioPonderadoCompra[c] = 0
reAsignacionCompraT[c] = 0
for b in clpe.BLOQUES:
sumAsignacionCompraBloque[c,b] = 0
sumAsignacionCompra[c] = 0
reAsignacionCompra[c,b] = 0
sumAsignacionCompraBloqueT[b] = 0
for c in ofertasCompraOrder.index:
for v in ofertasVentaOrder.index:
prorataContratos[c,v] = 0
fila = 0
for v in ofertasVentaOrder.index:
if clpe.asignacionV[v[0]].value >= 0.000001:
fila += 1
asignacionVenta = []
asignacionVenta.append(ID_G[v[0]])
asignacionVenta.append(v[0])
asignacionVenta.append(v[1])
asignacionVenta.append(ofertasVentaOrder.numPaquetesMax[v]*paqueteKWH*DUR
ACION[v[1]])
asignacionVenta.append(ofertasVentaOrder.numPaquetesMin[v]*paqueteKWH*DUR
ACION[v[1]])
asignacionVenta.append(PRECIOVENTA[v[0]])
asignacionVenta.append(PRECIOVENTA_DESEMPATADO[v[0]])
asignacionVenta.append(ofertasVentaOrder.simultanea[v])
asignacionVenta.append(ofertasVentaOrder.excluyente[v])
asignacionVenta.append(ofertasVentaOrder.dependiente[v])
asignacionVenta.append(clpe.asignacionV[v[0]].value)
asignacionVenta.append(round((clpe.asignacionV[v[0]].value/(ofertasVentaO
rder.numPaquetesMax[v]*paqueteKWH*DURACION[v[1]]))*100))
out_asignacionVenta.loc[fila] = asignacionVenta
insertar='exec [dbo].[GrabarOfertasVentasPython] ' + "'"+ID_G[v[0]]+"'" +
","+"'"+v[0] + "',"+ "'"+ v[1] + "',"+ str(ofertasVentaOrder.numPaquetesMax[v]*paqueteKWH*DU
RACION[v[1]]) + "," + str(ofertasVentaOrder.numPaquetesMin[v]*paqueteKWH*DURACION[v[1]])
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
insertar=insertar + ","+str(ofertasVentaOrder.precio_COP_kWh[v]) + "," +
str(PRECIOVENTA_DESEMPATADO[v[0]]) + ",'"+ str(ofertasVentaOrder.simultanea[v]) + "',"
insertar=insertar + "'"+ str(ofertasVentaOrder.excluyente[v]) + "','"+ st
r(ofertasVentaOrder.dependiente[v]) + "'," + str(clpe.asignacionV[v[0]].value) + ","
insertar=insertar + str(round((clpe.asignacionV[v[0]].value/(ofertasVenta
Order.numPaquetesMax[v]*paqueteKWH*DURACION[v[1]]))*100)) + ",'" + procesobd + "'"
cursor.execute(insertar)
conn.commit()
for v in ofertasVentaOrder.index:
if clpe.asignacionV[v[0]].value >= 0.000001:
BINARIAS_VENTA[v[0]] = clpe.binaria[v[0]].value
ASIGNACION_VENTA[v[0]] = clpe.asignacionV[v[0]].value
for c in ofertasCompraOrder.index:
if clpe.asignacionC[c].value >= 0.000001:
ASIGNACION_COMPRA[ofertasCompra.nombre[c]] = ASIGNACION_COMPRA[ofertasCom
pra.nombre[c]] + clpe.asignacionC[c].value
fila = 0
for c in ofertasCompraOrder.index:
if clpe.asignacionC[c].value >= 0.000001:
fila += 1
asignacionCompra = []
asignacionCompra.append(ID_C[c])
asignacionCompra.append(c)
asignacionCompra.append(PRECIOCOMPRA[c])
asignacionCompra.append(PRECIOCOMPRA_DESEMPATADO[c])
if segundoMecanismo == 1:
asignacionCompra.append(ofertasCompraOrder.energiaMax_MWh_d[c]*1000)
else:
asignacionCompra.append(MAXCOMPRA[c])
asignacionCompra.append(clpe.asignacionC[c].value)
if ofertasCompraOrder.energiaMax_MWh_d[c] == 0:
asignacionCompra.append(round((clpe.asignacionC[c].value/(DEMANDA_MIN
IMA[ofertasCompraOrder.nombre[c]]))*100))
else:
asignacionCompra.append(round((clpe.asignacionC[c].value/(ofertasComp
raOrder.energiaMax_MWh_d[c]*1000))*100))
out_asignacionCompra.loc[fila] = asignacionCompra
OfertasComprasql=str(asignacionCompra)
OfertasComprasql=OfertasComprasql.replace("[","")
OfertasComprasql=OfertasComprasql.replace("]","")
insertar='exec [dbo].[GrabarOfertasPython] ' + OfertasComprasql + ",'" +
procesobd + "'"
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
cursor.execute(insertar)
conn.commit()
for b in clpe.BLOQUES:
for v in ofertasVenta.index:
if v[1] == b:
sumAsignacionVentaBloqueT[v[1]] += clpe.asignacionV[v[0]].value
for b in clpe.BLOQUES:
sumAsignacionTotal += sumAsignacionVentaBloqueT[b]
for b in clpe.BLOQUES:
if sumAsignacionTotal < 0.0000001:
porcentajeAsignacionBloque[b] = 0
else:
porcentajeAsignacionBloque[b] = sumAsignacionVentaBloqueT[b]/sumAsignacio
nTotal
f = 3
for b in clpe.BLOQUES:
f += 1
Concepto=str(b)
InstruccionInsert='exec [dbo].[GrabarresumenResultadosPython] ' + Concepto +
",'" + str(sumAsignacionVentaBloqueT[b]) + " " + str(porcentajeA
signacionBloque[b]) + "','" + procesobd + "'"
cursor.execute(InstruccionInsert)
Concepto="'TOTAL ASIGNADO kWh-d'"
InstruccionInsert='exec [dbo].[GrabarresumenResultadosPython] ' + Concepto + ",'"
+ str(sumAsignacionTotal) + "','" + procesobd + "'"
cursor.execute(InstruccionInsert)
Concepto="'DEMANDA OBJETIVO kWh-d'"
InstruccionInsert='exec [dbo].[GrabarresumenResultadosPython] ' + Concepto + ",'"
+ str(DEMANDAOBJETIVO*1000) + "','" + procesobd + "'"
cursor.execute(InstruccionInsert)
Concepto="'DEMANDA SIN ATENDER kWh-d'"
InstruccionInsert='exec [dbo].[GrabarresumenResultadosPython] ' + Concepto + ",'"
+ str(max(0,DEMANDAOBJETIVO*1000 - sumAsignacionTotal)) + "','" + procesobd + "'"
cursor.execute(InstruccionInsert)
for v in ofertasVenta.index:
sumaproductoVenta += PRECIOVENTA[v[0]]*clpe.asignacionV[v[0]].value
if sumAsignacionTotal < 0.0000001:
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
precioPonderadoVenta = 0
else:
precioPonderadoVenta = sumaproductoVenta/sumAsignacionTotal
Concepto="'PRECIO PONDERADO DE VENTA $/kWh'"
InstruccionInsert='exec [dbo].[GrabarresumenResultadosPython] ' + Concepto + ",'"
+ str(precioPonderadoVenta) + "','" + procesobd + "'"
cursor.execute(InstruccionInsert)
Concepto="'PRECIO TOPE PROMEDIO $/kWh'"
InstruccionInsert='exec [dbo].[GrabarresumenResultadosPython] ' + Concepto + ",'"
+ str(PRECIOTOPE) + "','" + procesobd + "'"
cursor.execute(InstruccionInsert)
Concepto="'PRECIO TOPE INDIVIDUAL $/kWh'"
InstruccionInsert='exec [dbo].[GrabarresumenResultadosPython] ' + Concepto + ",'"
+ str(PRECIOMAXIMO) + "','" + procesobd + "'"
cursor.execute(InstruccionInsert)
fila = 0
if sumAsignacionTotal > 0:
for v in ofertasVenta.index:
if not clpe.asignacionV[v[0]] == 0:
fila += 1
asignacionContratos = []
asignacionContratos.append(ID_G[v[0]])
asignacionContratos.append(v[0])
asignacionContratos.append(v[1])
for c in ofertasCompraOrder.index:
if segundoMecanismo == 1:
prorataContratos[c,v] = clpe.asignacionC[c].value/sumAsignaci
onTotal * clpe.asignacionV[v[0]].value
insertar='exec [dbo].[GrabarOfertasVentasComprasPython] ' + "
'"+v[0] + "','" + c + "','" + v[1] + "'," + str(prorataContratos[c,v])
insertar=insertar + ",'" + procesobd + "'"
cursor.execute(insertar)
conn.commit()
else:
if sumMAXCOMPRA < DEMANDAOBJETIVO*1000:
prorataContratos[c,v] = (MAXCOMPRA[c]/(DEMANDAOBJETIVO*10
00)) * clpe.asignacionV[v[0]].value
insertar='exec [dbo].[GrabarOfertasVentasComprasPython] '
+ "'"+v[0] + "','" + c + "','" + v[1] + "'," + str(prorataContratos[c,v])
insertar=insertar + ",'" + procesobd + "'"
cursor.execute(insertar)
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
conn.commit()
else:
prorataContratos[c,v] = MAXCOMPRA[c]/sumMAXCOMPRA * clpe.
asignacionV[v[0]].value
insertar='exec [dbo].[GrabarOfertasVentasComprasPython] '
+ "'"+v[0] + "','" + c + "','" + v[1] + "'," + str(prorataContratos[c,v])
insertar=insertar + ",'" + procesobd + "'"
cursor.execute(insertar)
conn.commit()
asignacionContratos.append(prorataContratos[c,v])
out_asignacionContratos.loc[fila] = asignacionContratos
asignacionContratos = []
fila = 0
for c in ofertasCompraOrder.index:
for v in ofertasVenta.index:
if not prorataContratos[c,v] == 0:
fila += 1
asignacionContratos = []
asignacionContratos.append(c)
asignacionContratos.append(v[0])
asignacionContratos.append("CANTIDAD")
for b in Bloques.index:
if v[1] == b:
for p in range(Bloques.pi[b],Bloques.pf[b]+1):
asignacionContratos.append(truncate(prorataContratos[c,v]
/DURACION[b],2))
else:
for p in range(Bloques.pi[b],Bloques.pf[b]+1):
asignacionContratos.append(0)
out_asignacionContratosASIC.loc[fila] = asignacionContratos
ContratosASIC=str(asignacionContratos)
ContratosASIC=ContratosASIC.replace("[","")
ContratosASIC=ContratosASIC.replace("]","")
insertar='exec [dbo].[GrabarContratosASICPython] '+ str(fila) + ","+
ContratosASIC + ",'" + procesobd + "'"
cursor.execute(insertar)
conn.commit()
fila = 0
for c in ofertasCompraOrder.index:
for v in ofertasVenta.index:
if not prorataContratos[c,v] == 0:
fila += 1
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
asignacionContratos = []
asignacionContratos.append(c)
asignacionContratos.append(v[0])
asignacionContratos.append("PRECIO")
for b in Bloques.index:
if v[1] == b:
for p in range(Bloques.pi[b],Bloques.pf[b]+1):
asignacionContratos.append(PRECIOVENTA[v[0]])
else:
for p in range(Bloques.pi[b],Bloques.pf[b]+1):
asignacionContratos.append(0)
out_asignacionContratosASIC.loc[fila] = asignacionContratos
ContratosASIC1=str(asignacionContratos)
ContratosASIC1=ContratosASIC1.replace("[","")
ContratosASIC1=ContratosASIC1.replace("]","")
insertar='exec [dbo].[GrabarContratosASICPython] '+ str(fila) + "," +
ContratosASIC1 + ",'" + procesobd + "'"
cursor.execute(insertar)
conn.commit()
energia = 0
for c in ofertasCompraOrder.index:
if clpe.asignacionC[c].value >= 0.000001:
insertar='exec [dbo].[GrabarAsignacionesGraficoPython] '+ "'"+c+"','" + I
D_C[c] + "','Compra'," + str(PRECIOCOMPRA[c]) + "," + str(energia) + ",'" + procesobd + "'"
cursor.execute(insertar)
energia = energia + clpe.asignacionC[c].value
insertar='exec [dbo].[GrabarAsignacionesGraficoPython] '+ "'"+c+"','" + I
D_C[c] + "','Compra'," + str(PRECIOCOMPRA[c]) + "," + str(energia) + ",'" + procesobd + "'"
cursor.execute(insertar)
conn.commit()
energia = 0
if sumAsignacionTotal > 0:
for v in ofertasVentaOrder.index:
if not clpe.asignacionV[v[0]] == 0:
insertar='exec [dbo].[GrabarAsignacionesGraficoPython] '+ "'" + v[0]
+"','" + ID_G[v[0]] + "','Venta'," + str(PRECIOVENTA[v[0]]) + "," + str(energia) + ",'" + pro
cesobd + "'"
cursor.execute(insertar)
insertar='[dbo].[GrabarAsignacionesGraficoPython] ' + "'" + v[0] +"',
'" + ID_G[v[0]] + "','PrecioTopeP'," + str(PRECIOTOPE) + "," + str(energia) + ",'" + procesob
d + "'"
cursor.execute(insertar)
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
insertar='[dbo].[GrabarAsignacionesGraficoPython] ' + "'" + v[0] +"',
'" + ID_G[v[0]] + "','PrecioTopeI'," + str(PRECIOMAXIMO) + "," + str(energia) + ",'" + proces
obd + "'"
cursor.execute(insertar)
energia = energia + clpe.asignacionV[v[0]].value
insertar='exec [dbo].[GrabarAsignacionesGraficoPython] ' + "'" + v[0]
+"','" + ID_G[v[0]] + "','Venta'," + str(PRECIOVENTA[v[0]]) + "," + str(energia) + ",'" + pr
ocesobd + "'"
cursor.execute(insertar)
insertar='exec [dbo].[GrabarAsignacionesGraficoPython] ' + "'" + v[0]
+"','" + ID_G[v[0]] + "','PrecioTopeP'," + str(PRECIOTOPE) + "," + str(energia) + ",'" + pro
cesobd + "'"
cursor.execute(insertar)
insertar='exec [dbo].[GrabarAsignacionesGraficoPython] ' + "'" + v[0]
+"','" + ID_G[v[0]] + "','PrecioTopeI'," + str(PRECIOMAXIMO) + "," + str(energia) + ",'" + p
rocesobd + "'"
cursor.execute(insertar)
conn.commit()
insertar='exec [dbo].[GrabarAsignacionesGraficoPython] ' + "'" + v[0] +"','" + ID
_G[v[0]] + "','DemandaObjetivo'," + str(0) + "," + str(DEMANDAOBJETIVO*1000) + ",'" + proceso
bd + "'"
cursor.execute(insertar)
insertar='exec [dbo].[GrabarAsignacionesGraficoPython] ' + "'" + v[0] +"','" + ID
_G[v[0]] + "','DemandaObjetivo'," + str(PRECIOMAXIMO) + "," + str(DEMANDAOBJETIVO*1000+1) + "
,'" + procesobd + "'"
cursor.execute(insertar)
conn.commit()
if segundoMecanismo == 2:
print()
print()
break
if sumAsignacionTotal < DEMANDAOBJETIVO*1000:
if segundoMecanismo == 2:
segundoMecanismo = 0
print()
print("TERMINo EJECUCIoN DE SUBASTA EN FORMA EXITOSA")
print()
print("LA ASIGNACIoN ES MENOR A LA DEMANDA OBJETIVO DEFINIDA POR MINENERGIA")
print()
DEMANDAOBJETIVO = DEMANDAOBJETIVO - sumAsignacionTotal/1000
segundoMecanismo = 2
omcarreno@rightside.com.co Carrera 48ª # 16 sur – 86 piso 6 MEDELLÍN-COLOMBIA
else:
print("TERMINo CON ASIGNACIoN MAYOR O IGUAL A LA DEMANDA OBJETIVO DEFNIDA POR
MINENERGIA ... STOP ....")
segundoMecanismo = 0
elif (results.solver.termination_condition == TerminationCondition.infeasible):
print("EL PROBLEMA ES INFACTIBLE 2")
print()
print("TERMINo EJECUCIoN CON ERRORES")
segundoMecanismo = 0
elif(results.solver.termination_condition == TerminationCondition.unbounded):
print("EL PROBLEMA ES INFACTIBLE 2")
segundoMecanismo = 0
elif(results.solver.termination_condition == TerminationCondition.maxTimeLimit):
print()
print("TERMINo POR TIEMPO LiMITE")
print()
segundoMecanismo = 0
else:
print ("Solver Status: ", results.solver.status)
print("La solucion del problema es: ",results.solver.termination_condition)
print()
print("TERMINo EJECUCIoN CON ERRORES")
segundoMecanismo = 0
except:
PrintException()
print()
segundoMecanismo = 0
print()
print("TERMINo EJECUCIoN CON ERRORES")
top related