<< Solveurs Solveurs pipe_network >>

metanet >> metanet > Solveurs > knapsack

knapsack

résout un problème du sac à dos 0-1 multiple

Séquence d'appel

[earn,ind] = knapsack(profit,weight,capa,[bck])

Paramètres

profit

vecteur ligne d'entiers

weight

vecteur ligne d'entiers

capa

vecteur ligne d'entiers

bck

entier

earn

entier

ind

vecteur ligne d'entiers

Description

Le problème du sac à dos multiple est défini mathématiquement comme suit:

Etants donnés n objets (n >= 2) et m sacs à dos (m >= 1)

Maximiser le "profit global" E=profit*sum(X,1) sous les contraintes:

X*weight <= capa

sum(X,1) <= 1 ; i=1,...,n

X(j,i)= 0 or 1

profit

est le vecteur des "profits" associés à chaque objet. Les élements de ce vecteur doivent être des entiers positifs.

weight

est le vecteur des "poids". Les élements de ce vecteur doivent être des entiers positifs.

capa

est le vecteur des "capacités de chacun des sacs à dos. Les élements de ce vecteur doivent être des entiers positifs.

X

est une matrice m par n à valeurs dans {0,1}.

[earn,ind] = knapsack(profit,weight,capa) résoud le problème ci-dessus. Il retourne dans

earn

La valeur du critère E pour la solution "optimale" si elle a pu être calculée. Sinon, earn est affecté à une valeur négative:

-3

signifie qu'un sac à dos ne peut contenir aucun objet.

-4

signifie qu'un objet ne peut entrer dans aucun sac à dos.

-5

signifie qu'un sac à dos contient tous les objets.

ind

Le vecteur entiers des localisations optimales: ind(i) donne le numéro du sac à dos où a été positionné l'objet i, si l'objet fait partie de la solution, sinon ind(i) est égal à 0. La matrice X peut être calculée à partir de ind par

items=1:n;
items(ind==0)==[ ];
ind(ind==0)=[ ];
X=sparse([ind;items]',ones(n,1),[m,n])
bck

est un entier optionnel qui donne le nombre maximum de "backtrackings" qui peuvent être éffectués si l'on recherche une solution heuristique. Si la solution exacte et requise alors bck doit être omis ou assigné à une valeur négative.

Exemples

weight=ones(1,15).*.[1:4];
profit=ones(1,60);
capa=[15 45 30 60];
[earn,ind]=knapsack(profit,weight,capa)

items=1:60;
items(ind==0)=[];
ind(ind==0)=[];
X=full(sparse([ind;items]',ones(ind),[4,60])) //one row per sacks
X*weight' //sack weights
x=sum(X,1);
and(x<=1) //contraints check
profit*x'==earn

Voir Aussi


Report an issue
<< Solveurs Solveurs pipe_network >>