0-1 Knapsack Problem Matlab Code

5 min read Jun 03, 2024
0-1 Knapsack Problem Matlab Code

Résoudre le problème du sac à dos 0-1 avec MATLAB

Le problème du sac à dos 0-1 est un problème d'optimisation classique qui consiste à trouver le meilleur ensemble d'objets à inclure dans un sac à dos, compte tenu de limites de poids et de valeurs. Chaque objet peut être inclus dans le sac à dos ou non (d'où le nom "0-1").

Comprendre le problème

Imaginez que vous êtes en randonnée et que vous devez choisir les objets à emporter dans votre sac à dos. Chaque objet a un poids et une valeur. Votre sac à dos a une capacité de poids limitée. Votre objectif est de maximiser la valeur totale des objets que vous emportez, tout en respectant la limite de poids.

Le code MATLAB

function [valeur_max, choix] = sac_a_dos_01(poids, valeurs, capacite)
  % poids : vecteur des poids des objets
  % valeurs : vecteur des valeurs des objets
  % capacite : capacité de poids du sac à dos

  n = length(poids);
  % Matrice de programmation dynamique
  M = zeros(n+1, capacite+1);

  % Initialisation
  for i = 1:n+1
    M(i, 0) = 0;
  end
  for j = 1:capacite+1
    M(1, j) = 0;
  end

  % Calculer la valeur maximale
  for i = 2:n+1
    for j = 1:capacite+1
      if poids(i-1) <= j
        M(i, j) = max(M(i-1, j), M(i-1, j-poids(i-1)) + valeurs(i-1));
      else
        M(i, j) = M(i-1, j);
      end
    end
  end

  % Trouver la solution optimale
  valeur_max = M(n+1, capacite);
  choix = zeros(1, n);
  i = n;
  j = capacite;
  while i > 1 && j > 0
    if M(i, j) != M(i-1, j)
      choix(i-1) = 1;
      j = j - poids(i-1);
    end
    i = i - 1;
  end

  % Afficher la solution
  fprintf('Valeur maximale: %d\n', valeur_max);
  fprintf('Choix des objets: %s\n', num2str(choix));
end

Comment utiliser le code

  1. Définir les données du problème:
    • poids: Un vecteur contenant les poids de chaque objet.
    • valeurs: Un vecteur contenant les valeurs de chaque objet.
    • capacite: La capacité de poids du sac à dos.
  2. Appeler la fonction:
    [valeur_max, choix] = sac_a_dos_01(poids, valeurs, capacite);
    
  3. Interpréter les résultats:
    • valeur_max: La valeur maximale que vous pouvez obtenir en remplissant le sac à dos.
    • choix: Un vecteur indiquant quels objets sont inclus dans le sac à dos (1 = inclus, 0 = non inclus).

Exemple d'utilisation

% Données du problème
poids = [10 20 30 40];
valeurs = [60 100 120 140];
capacite = 50;

% Résoudre le problème
[valeur_max, choix] = sac_a_dos_01(poids, valeurs, capacite);

% Afficher les résultats
fprintf('Valeur maximale: %d\n', valeur_max);
fprintf('Choix des objets: %s\n', num2str(choix));

Ce code affichera:

Valeur maximale: 220
Choix des objets: 1 1 0 0

Cela signifie que la valeur maximale que vous pouvez obtenir est de 220, en incluant les objets 1 et 2 dans le sac à dos.

Conclusion

Ce code MATLAB vous permet de résoudre efficacement le problème du sac à dos 0-1. Vous pouvez l'utiliser pour trouver la meilleure solution pour diverses applications, telles que la planification de la production, la gestion de l'inventaire et l'optimisation des investissements.

Related Post


Featured Posts