Pyomo optimization RuntimeError

29 Views Asked by At

I'm trying to implement an optimization problem on gurobi unsuccessfully. I have this script below in which I cut out the upper part because it would be huge.

\##CONCRETE MODEL
ONR = ConcreteModel(name="Radialità+Connettività")

\#COSTANTI

\#VARIABILI CONTINUE
\#Ci dovrei inserrire Fij e Fsorgente ma alla fine dovrei inserirle come variabili binarie
ONR.f_szk = Var(NomiBus, within=Reals) #per vedere se funziona nella cmd eseguire "ONR.f_s.pprint()"  
ONR.fijk = Var(NomiBus, nomi_switch, within=Reals)
ONR.lamb_k = Var(NomiBus, within=Reals) #NonNegativeReals(?)
ONR.ENS = Var(within=Reals) #e che set di eq devo dargli?
ONR.U_k = Var(NomiBus, within=Reals)

\#VARIABILI BINARIE
ONR.y_ij = Var(nomi_switch, within=Binary)
ONR.Z_act_i = Var(zona_bus, NomiBus, within=Binary)
ONR.Z_act_j = Var(zona_bus, NomiBus, within=Binary)
ONR.w_zk_i = Var(zona_bus, NomiBus, within=Binary)
ONR.w_zk_j = Var(zona_bus, NomiBus, within=Binary)
ONR.Z_act = Var(zona_bus, NomiBus, within=Binary)

\#Definisco le funzioni costo in questo caso della lunghezza della linea solo per verificare il corretto funzionamento del codice
Ca = 10
c_ENS = 10
c_SAIDI = 10
c_SAIFI = 10

\#VINCOLI

\#26
\#27
def FlussiArtificiali_rule(ONR,bus,zona):

    membroA = 0
    membroB = 0
    
    for sw in nomi_switch:
        
        i = dict_bus_from_sw[sw]
        j = dict_bus_to_sw[sw]
        
        # se il bus k è nella zona z, allora fdzk = 1:
        if bus in dict_bus_zone[zona]:
            membroB = 1
        
        # se il busfrom dello switch sta nella zona z prendi il flusso col segno meno:
        if i in dict_bus_zone[zona]:
            membroA = membroA - ONR.fijk[bus,sw]
        # se il busto dello switch sta nella zona z prendi il flusso col segno più:
        elif j in dict_bus_zone[zona]:
            membroA = membroA + ONR.fijk[bus,sw] 
           
    # Solo per la zona contenente la slack, aggiungi fskz:           
    if zona == 'Z0':
        membroA = membroA + ONR.f_szk[bus]
    
    # Equazione di bilancio dei flussi artificiali:        
    return membroA == membroB

ONR.FlussiArtificiali = Constraint(NomiBus,zona_bus,rule=FlussiArtificiali_rule)

\#Rubata da Roberto per garantire la radialità
def LimitY_rule(ONR,y_ij):
return sum(ONR.y_ij\[sw\] for sw in nomi_switch) \<= 7
ONR.LimitY = Constraint(nomi_switch,rule=LimitY_rule)

\#28
def stato_flusso_ij_switch_UB_rule(ONR, switch, bus):
return ONR.fijk\[bus,switch\] \<= ONR.y_ij\[switch\]
ONR.stato_flusso_ij_switch_UB = Constraint(nomi_switch, NomiBus, rule=stato_flusso_ij_switch_UB_rule)

def stato_flusso_ij_switch_LB_rule(ONR, switch, bus):
return ONR.fijk\[bus,switch\] \>= - ONR.y_ij\[switch\]
ONR.stato_flusso_ij_switch_LB = Constraint(nomi_switch, NomiBus, rule=stato_flusso_ij_switch_LB_rule)

\#29
def Zact_rule(ONR,sw,bus):
i = dict_bus_from_swfrom\[sw\]
j = dict_bus_from_sw\[sw\]
if i in dict_bus_zone\[zona\] or j in dict_bus_zone\[zona\]:
return (ONR.Z_act\[zona,bus\] \>= ONR.fijk\[bus, sw\]) or (- ONR.Z_act\[z,k\] \<= ONR.fijk\[bus, sw\])
ONR.Z_act = Constraint(nomi_switch,NomiBus,rule=Zact_rule)  \

So I'm trying to implement Z_act_rule in which I should know if my zone is active for the shortest path. I look for the fij in both i and j nodes and then I want to know if one of them is active. But I do get the following error

I even tried to do it like this

def zona_attiva_j_UB_rule(ONR, switch, bus):
    for zona in dict_bus_zone.keys(): 
        return ONR.Z_act_j[zona, bus] <= - ONR.fijk[bus, switch] 
ONR.zona_attiva_j_UB = Constraint(nomi_switch, NomiBus, rule=zona_attiva_j_UB_rule)

But it does not loop for every zone but only for one. Instead I would like to run it for every zone and to know which one is active and part of the shortest path

0

There are 0 best solutions below