Próbuję zrobić coś, co logicznie powinno być możliwe. Jednak nie jestem pewien, jak to zrobić w ramach programowania liniowego. Używam ZMPL/SCIP, ale powinno to być możliwe do odczytania dla większości.można indeksować zestaw według zmiennej?
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];
Staram się upewnić, że zmienna a
jest równa wartości w indeksie b
w u
. Tak na przykład, zapewniam, że b == 2
, a następnie próbuję ustawić ograniczenie, które a == u[b]
, ale to nie działa. Narzeka, że próbuję indeksować za pomocą zmiennej. Mogę jednak zrobić tylko a == u[2]
, co powoduje, że a
jest równe 20
.
Czy istnieje sposób na łatwy dostęp do u
w indeksie określonym przez zmienną? Dzięki za pomoc/wskazówki.
EDIT: Myślę, że konsensus jest, że nie jest to możliwe, ponieważ nie staje się PR. W takim przypadku, czy ktokolwiek może wymyślić inny sposób zapisu tego, aby w zależności od wartości b
, uzyskać skojarzoną wartość z zestawu u
? Musiałoby to uniknąć bezpośredniego indeksowania.
ROZWIĄZANIE: Na podstawie odpowiedzi z pamięci RAM, udało mi się go wypróbować i okazało się, że to z pewnością rozwiązanie opłacalne i liniowy. Dzięki, Ram! Oto przykładowy kod rozwiązanie w 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;
Nie należy być niegrzecznym, ale nie potrzeba konsensusu. Nie jest liniowy, ponieważ nie spełnia definicji liniowej. – raoulcousins
Fajnie, dzięki! Cieszę się, że nie potrzebujemy konsensusu. – gnychis