programmation en c++ du Branch and bound du problème du sac à dos
Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

programmation en c++ du Branch and bound du problème du sac à dos



  1. #1
    lailach

    programmation en c++ du Branch and bound du problème du sac à dos


    ------

    Bonjour,

    Je dois programmer la méthode de Branch and bound spécialisé pour le probème du sac à dos:
    Les elements sont ranges par ordre des ui
    wi
    decroissant, le parcours se fait en profondeur d'abord, la
    priorite de branchement est calquee sur l'heuristique gloutonne.
    Pas 1. Initialisation: le sac-a-dos est vide et on a considere aucun objet.
    Pas 2. Calcul de UB:
    UB = l'utilite des objets deja presents dans le sac-a-dos + la valeur de la relaxation lineaire du
    probleme residuel.
    Si UB  LB, alors le noeud est elague et on va au Pas 6.
    Pas 3. Plongeon de xations a 1:
    Tant que c'est possible, on met les objets dans le sac-a-dos (on les considere dans l'ordre donne).
    Pas 4. Une xation a 0:
    Si on n'a pas encore passe en revue tous les objets, alors l'objet en cours de consideration ne peut
    pas ^etre pris dans le sac-a-dos et on retourne au Pas 2.
    Pas 5. Mise a jour des LB: Les objets ont tous ete inclus ou exclus du sac-a-dos et le sac-a-dos obtenu
    est realisable. Si sa valeur est ameliorative, alors on le garde en memoire.
    Pas 6. Remontee (backtracking):
    Si le dernier objet considere a ete mis dans le sac-a-dos, il est enleve.
    On remonte jusqu'au dernier objet qui a ete mis dans le sac-a-dos.
    S'il n'y en a pas, STOP.
    On enleve cet objet du sac-a-dos et on retourne au Pas 3.
    J'ai fait le code suivant, mais il y a une erreur, car ça donne pas le bon résultat:
    #include <iostream>
    #include<vector>
    #include <algorithm>
    using namespace std;
    struct objet {
    int indice;
    int poids;
    int utilite;
    } ;
    /*Trier */
    bool mafonction(objet o1,objet o2){return (o1.utilite/o1.poids>o2.utilite/o2.poids);}
    void trier (vector <objet> V){
    std::sort (V.begin(),V.end(),mafonction) ;
    }
    /*Calculer la borne */
    int borne(int i, int n, int W,vector<objet> V)
    {
    int j=i;
    int Poids = 0;
    int resultat = 0;
    while ((j < n) && (Poids+ V[j].poids <= W))
    {
    Poids= Poids + V[j].poids;
    resultat = resultat +V[j]. utilite;
    j++;
    }
    if (j < n)
    {
    resultat= resultat + (W - Poids) * V[j].utilite/V[j].poids;
    }
    return resultat;
    }
    void BB(vector<objet> V, int W){
    int i=1;
    int n=3;
    int C=W;
    int Z=0;
    int BS=99999999; int BI=0;
    bool x[n] ;
    bool _x[n];
    for(int k=0;k<n;k++){_x[k]=x[k]=0;}
    cout<<"ok";
    /* etape 2 */
    while(1){
    BS=Z+borne( i, n, W,V);
    if (BS <= BI){
    /*etpae 6 */
    if(x[n-1]==1){
    x[n-1]=0;
    Z=Z-V[n-1].utilite;
    C=C+V[n-1].poids;
    i=n-1;
    }
    while ((x[i]==0)and (i!=0 )){
    cout<<"x "<<endl;
    i=i-1;
    if(i==0) { for(int k=0;k<n;k++){cout<<"s"<<k<<" "<<_x[k]<<endl;}
    break;
    }
    }
    if (i ==0 ) break;
    x[i]=0;
    Z=Z-V[i].utilite;
    C=C+V[i].poids;
    i=i+1;
    }
    else {
    /* etape 3 */
    while (i<=n && V[i].poids <=C)
    {
    x[i]=1;
    Z=Z+V[i].utilite;
    C=C-V[i].poids;
    i=i+1;
    }
    /* etape 4 */
    if(i<=n)
    {
    x[i]=0;
    i=i+1;
    }
    /*etape 5 */
    if(i>n) {
    if (Z>BI) {
    for(int k=1;k<n;k++)
    {
    _x[k]=x[k];
    }
    BI=Z ;
    }
    if(x[n]==1){
    x[n]=0;
    Z=Z-V[n].utilite;
    C=C+V[n].poids;
    i=n-1;
    }
    while (x[i]==0) {
    i=i-1;
    if(i==0) {break;}
    }
    if(i==0) {
    for(int k=0;k<n;k++){cout<<"s"<<_x[k]<<endl;}
    break;}
    }
    x[i]=0;
    Z=Z-V[i].utilite;
    C=C+V[i].poids;
    i=i+1;
    }
    }
    }
    int main(){
    /* Test */
    objet v={1,2,8};
    objet t={2,2,3};
    objet u={3,3,15};
    vector<objet> V;
    V.push_back(v);
    V.push_back(t);
    V.push_back(u);

    BB (V,6);
    return 0;
    }

    Pouvez vous,m'aider à corriger le code?j'ai besoin vraiment de votre aide. Je suis débutante en Informatique et je trouve des grands difficultés.
    Merci d'avance.

    -----

  2. #2
    lailach

    Re : programmation en c++ du Branch and bound du problème du sac à dos

    Voici l'algorithme.

    pas 1:i = 1, c = W, Z = 0, LB = 0, UB =infini,
    x*k = xk = 0 pour k = 1.... n.
    Pas 2. UB = Z + LP(i; n; c). Si UB <=LB, aller au Pas 6.
    Pas 3. Tant que i <=n et wi <=c, faire xi = 1, Z = Z + ui, c = c-wi, i = i + 1.
    Pas 4. Si i <= n, poser xi = 0, i = i + 1. Si i <=n, aller au Pas 2.
    Pas 5. Si Z > LB, x = x et LB = Z.
    Pas 6. Si xn = 1, poser xn = 0, Z = Z-Un, c = c +wn, i = n -1.
    Tant que xi = 0, faire i = i -1.
    Si i = 0, STOP.
    Poser xi = 0, Z = Z -ui, c = c + wi, i = i + 1. Retourner au Pas 2.

  3. #3
    Jack
    Modérateur

    Re : programmation en c++ du Branch and bound du problème du sac à dos

    Pourquoi ne pas respecter les consignes (et les lecteurs) en présentant code lisible?
    http://forums.futura-sciences.com/pr...ves-forum.html
    Dernière modification par JPL ; 10/10/2014 à 22h08. Motif: activation du lien

  4. #4
    JPL
    Responsable des forums

    Re : programmation en c++ du Branch and bound du problème du sac à dos

    Le problème est plus grave que l'absence de balise Code : le programme n'est pas indenté !
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  5. A voir en vidéo sur Futura
  6. #5
    lailach

    Re : programmation en c++ du Branch and bound du problème du sac à dos

    Citation Envoyé par Jack Voir le message
    Pourquoi ne pas respecter les consignes (et les lecteurs) en présentant code lisible?
    http://forums.futura-sciences.com/pr...ves-forum.html
    je sais que le code n est pas lisible. Mais si quelque un a déjà une idée sur l'algorithme ou il veut m'aider pour le programmer ,je peux le bien expliquer et brièvement

  7. #6
    bisou10

    Re : programmation en c++ du Branch and bound du problème du sac à dos

    Citation Envoyé par JPL Voir le message
    Le problème est plus grave que l'absence de balise Code : le programme n'est pas indenté !
    Je ne reviens pas sur la question initiale: ces posts sont des torchons qui ne donnent pas envie d'y passer 1 seule seconde.

    Par contre, je pensais que la balise code "indentait" automagiquement ? Ce n'est pas le cas ? Quand toi en tant que modo tu entoures de cette balise, tu dois te taper l'indentation à la main si tu en souhaites une ?

  8. #7
    lailach

    Re : programmation en c++ du Branch and bound du problème du sac à dos

    Bonsoir,

    Je sais que vous n'arrivez pas à comprendre l'algo et le code, mais si vous pouvez me donner un peu de votre temps, je peux vous les expliquer. Je trouve des grandes difficultés à programmer le Branch and bound et j'ai besoin de votre aide, si c'est possible.
    Merci

  9. #8
    fred1599

    Re : programmation en c++ du Branch and bound du problème du sac à dos

    J'avais jamais entendu cette méthode, mais avec l'algo, malheureusement on ne comprend pas. Pour répondre met toi en mode avancé, tu pourras ainsi utiliser les indices et exposants à ta guise. Ne lésine pas sur les renseignements, par exemple xk, veut dire en faite xk ou x*k ? Que vaut x, d'où vient-il ? Qu'est-ce que LP ? wi, ui ? bref, difficile pour quelqu'un ne connaissant pas cette méthode de t'aider ne serait-ce qu'avec l'algorithme que tu donnes.

    Va falloir faire un effort pour bien détailler l'algorithme avec qui normalement on devrait s'en sortir.

  10. #9
    lailach

    Re : programmation en c++ du Branch and bound du problème du sac à dos

    Citation Envoyé par fred1599 Voir le message
    J'avais jamais entendu cette méthode, mais avec l'algo, malheureusement on ne comprend pas. Pour répondre met toi en mode avancé, tu pourras ainsi utiliser les indices et exposants à ta guise. Ne lésine pas sur les renseignements, par exemple xk, veut dire en faite xk ou x*k ? Que vaut x, d'où vient-il ? Qu'est-ce que LP ? wi, ui ? bref, difficile pour quelqu'un ne connaissant pas cette méthode de t'aider ne serait-ce qu'avec l'algorithme que tu donnes.

    Va falloir faire un effort pour bien détailler l'algorithme avec qui normalement on devrait s'en sortir.
    Oui vous avez complètement raison. Je me disais peut être quelqu un 'a déjà fait. Mais bon je vais bosser toute seule. Merci beaucoup

  11. #10
    JPL
    Responsable des forums

    Re : programmation en c++ du Branch and bound du problème du sac à dos

    Citation Envoyé par bisou10 Voir le message
    Par contre, je pensais que la balise code "indentait" automagiquement ? Ce n'est pas le cas ? Quand toi en tant que modo tu entoures de cette balise, tu dois te taper l'indentation à la main si tu en souhaites une ?
    Quand je mets une balise Code dans un message qui n'en comportait pas c'est parce qu'à l'édition j'ai vu que les espaces étaient là. Il faut juste se rappeler de le html ignore les espaces en début de ligne et de plus, quand il y en a plusieurs il n'en affiche qu'un.

    Par exemple j'écris :
    Code:
    ping                 pong
    et sans balise Code cela s'affiche ainsi : ping pong
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

Discussions similaires

  1. Branch and Bound pour le problème d'ordonnancement sur machine parallèl
    Par invite8b421ec7 dans le forum Mathématiques du supérieur
    Réponses: 6
    Dernier message: 26/05/2012, 20h40
  2. mathematica principal branch cut
    Par kalish dans le forum Mathématiques du supérieur
    Réponses: 0
    Dernier message: 09/03/2012, 14h39
  3. branch cuts
    Par kalish dans le forum Mathématiques du supérieur
    Réponses: 5
    Dernier message: 25/01/2012, 15h49
  4. Algorithme de Branch&Bound
    Par invite83c1e388 dans le forum Mathématiques du supérieur
    Réponses: 0
    Dernier message: 07/11/2010, 21h11
  5. Déterminer l'ordonancement optimal à l'aide de l'algorithme branch and bound
    Par invite8b421ec7 dans le forum Mathématiques du collège et du lycée
    Réponses: 2
    Dernier message: 17/06/2009, 20h38