/ / aggiunta di vincoli in ambiente pyomo - python, python-2.7, programmazione lineare, programmazione in interi, pyomo

aggiungendo un vincolo in ambiente pyomo - python, python-2.7, programmazione lineare, programmazione intera, pyomo

Sto lavorando sotto il pacchetto pyomo.environ. Ho provato ad aggiungere un vincolo qualcosa di simile http://imgur.com/a/pWJ79. io e j sono l'indice dei nodi.

Il node_set contiene da N0 a N5, sei nodi intotale. Arc_set è un set che memorizza i collegamenti tra i nodi, ad esempio [N1, N2] e non contiene alcun arco di loop automatico, ad esempio [N1, N1]. Il set F contiene [F1, F2, F3]

Quindi, ho fatto qualcosa del genere:

def c1_rule(m, j):
return sum(m.X[e[0], j, f] for e in m.arc_set if e[1] != "N0" for f in m.f_set) == 1
m.c1_cons = pe.Constraint(m.node_set, rule= c1_rule)

Tuttavia, ho capito che questo si sarebbe innescatoerrori quando my j è uguale a i, che è e [0] qui, dato che l'indice di mX [i, j, k] non ha qualcosa come [N1, N1, F1]. Ho una idea è che aggiungendo archi auto loop sull'arco impostato C'è un altro modo per evitare questo errore?

risposte:

1 per risposta № 1

Innanzitutto, un avvertimento: il vincolo che hai mostrato presuppone che X [i, j, f] esista per tutti i e j:

costrizione

Altrimenti, sarebbe stato descritto come qualcosa del genere:

vincoli

Quindi, se stai seguendo rigorosamente questo vincolo, il tuo codice è corretto, devi solo assicurarti che tutte le voci (incluso quando i == j) per parametro / variabile X esistono.


Ora ricevi un errore perché la regola del vincolo è stata generata per tutti j e f indipendentemente da ciò che è dentro arc_set.

Succede che se hai [N1, N2] in arc_set, la variabile e sarà uguale a [N1, N2] e quando j = N1 e f = F1, la seguente regola:

m.X[e[0], j, f]

sarà tradotto in:

m.X[N1, N1, F1]

Questo può causare errori se X è un parametro del tuo modello e voce X[N1, N1, F1] non esiste

Il modo in cui risolvi questo è includendo e[0] != j nella comprensione della lista per la regola del vincolo:

def c1_rule(m, j):
return sum(m.X[e[0], j, f] for e in m.arc_set for f in m.f_set
if e[1] != "N0" and e[0] != j) == 1
m.c1_cons = pe.Constraint(m.node_set, rule= c1_rule)