Sto cercando di fare qualcosa che logicamente dovrebbe essere possibile fare. Tuttavia, non sono sicuro di come farlo nell'ambito della programmazione lineare. Sto usando ZMPL/SCIP, ma questo dovrebbe essere leggibile per la maggior parte.possibile indicizzare un set con una variabile?
set I := {1,2,3,4,5};
param u[I] := <1> 10, <2> 20, <3> 30, <4> 40, <5> 50;
var a;
var b;
subto bval:
b == 2;
subto works:
a == u[2];
#subto does_not_work:
# a == u[b];
che sto cercando di fare in modo che la variabile a
è uguale al valore dell'indice b
in u
. Quindi, ad esempio, mi assicuro che sia b == 2
e quindi provo a impostare il vincolo che è a == u[b]
, ma che non funziona. Si lamenta che sto cercando di indicizzare con una variabile. Sono in grado di fare solo a == u[2]
tuttavia, che rende a
uguale a 20
.
C'è un modo per accedere facilmente a u
a un indice specificato da una variabile? Grazie per qualsiasi aiuto/guida.
EDIT: Credo che il consenso è che questo non è possibile perché diventa non più un LP. In tal caso, qualcuno può pensare a un altro modo per scrivere questo in modo che, in base al valore di b
, possa ottenere un valore associato dall'insieme u
? Questo dovrebbe evitare di indicizzarlo direttamente.
SOLUZIONE: Sulla base della risposta da Ram, sono stato in grado di provarlo e ha scoperto che si trattava sicuramente una soluzione praticabile e lineare. Grazie, Ram! Ecco il codice soluzione campione in ZMPL:
set I := {1,2,3,4,5};
param u[I] := <1> 10, <2> 20, <3> 30, <4> 40, <5> 50;
var a;
var b;
var y[I] binary;
subto bval:
b == 4;
subto only_one:
sum <i> in I : y[i] == 1;
subto trick:
b == (sum <i> in I : y[i] * i);
subto aval:
(sum <i> in I : u[i]*y[i]) == a;
Non essere scortese, ma non è necessario il consenso. Non è lineare perché non soddisfa la definizione di lineare. – raoulcousins
Cool, grazie! Sono contento che non abbiamo bisogno di consenso. – gnychis