|
Hrvatski matematički elektronski časopis math.e |
| http://www.math.hr/~mathe/ |
Heuristički algoritmi za 0-1 problem naprtnjače
Anamari Nakić
array tabu_algorithm (int cmax, int L, array w, array p, int n, real M) {
set N;
int start, c, i;
array Xbest, X, TabuList;
c = 1;
X = [x0, ..., xn-1]; // x[i] = 0 ili x[i] = 1,
// neko slucajno dopustivo rjesenje
CurW = 0;
for i = 0 to n-1
CurW = CurW + X[i]*w[i];
Xbest = X;
while( c <= cmax) {
N = {0, ..., n-1};
start = max{0, c-L};
for j = start to c-1
N = N \ {TabuList[j]};
for each i element_of N {
if (X[i] == 0) && (CurW + w[i] > M)
N = N \ {i};
}
if ( empty(N) )
exit;
find i element_of N so that (-1)^X[i]*p[i]/w[i] is maximum;
TabuList[c] = i:
X[i] = 1 - X[i];
if ( X[i] == 1 )
CurW = CurW + w[i];
else
CurW = CurW - w[i];
if ( P(X) > P(Xbest) )
Xbest = X;
c = c + 1;
}
return (Xbest);
}
|