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 № 1Innanzitutto, un avvertimento: il vincolo che hai mostrato presuppone che X [i, j, f] esista per tutti i e j:
Altrimenti, sarebbe stato descritto come qualcosa del genere:
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)