IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

probleme du sac a dos (knapsack)


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 5
    Par défaut probleme du sac a dos (knapsack)
    Bonjour a tous,
    le probleme du sac a dos me pose des problemes et je suis incapable de le resoudre alors je demande votre aide et vos remarques
    probleme:
    Un cambrioleur veut voler n objet
    Chaque objet i possède un poids pi et une valeur vi
    Son sac peut porter un poids limite Pmax.
    Il désire remplir son sac de façon à obtenir une valeur totale la plus grande possible sans dépasser le poids limite du sac.
    Le problème peut être décrit par:

    Max(∑vi )
    ∑ pi <=Pmax avec i l’indice de l’objet choisi


    voici le code source du programme que j'ai developpéé avec des fichiers input et output .J'ai pas su ou initialiser la variable valeur_optimale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    #include <stdio.h>
    int W;
    int sac[5],msac[5];
    int v[20];
    int w[20];
    int n;//=5;
    int poids_obj,Psac;
    int valeur_actuelle,valeur_restante,valeur_potentielle,valeur_optimale ;
    int choix(int i,int val,int poi);
     void remplir_l();
      void ecrire();
    FILE *fin,*fout;
     
     
     void main()
    { fin=fopen("sac.in","r");
     fout=fopen("sac.out","w");
        remplir_l();
     
    for(int i=0;i<n;i++)
    {poids_obj=poids_obj+w[i];
     printf("%d ",w[i]); 
     printf("%d \n",v[i]);
    sac[i]=msac[i]=0;}
    valeur_restante=poids_obj;
    valeur_actuelle=Psac=0;
         valeur_optimale=v[0];
    choix(0,W,0);
    ecrire();
    for(int i=0;i<n;i++)
    printf("%d",sac[i]);
    fclose(fin);
    fclose(fout);
    int h ;
    scanf("%d",h);
    }
     
    int choix(int i,int w_res,int val_obt)
    {
    int with,without;
    if (i==n)
    {
         if (with>without)
         {sac[i]=1 ;return with; }
            else {sac[i]=0;  return without;} }
     if(valeur_actuelle>valeur_optimale)
                         {
                        valeur_optimale=valeur_actuelle;
                        for(int h=0;h<n;h++)
                        {msac[h]=sac[h];
                        printf("%d",msac[h]); }
                        }
                        }
    else
     { without = choix( i+1,w_res, val_obt);
         if (w[i]>w_res)  return  val_obt;
         if (w[i]<=w_res)
           {
            with = choix( i+1,w_res-w[i], val_obt+v[i]);
            }
          }
      }
     
     
          /*  valeur_potentielle=valeur_actuelle+valeur_restante;
            printf("\npotentielle=%d\n",valeur_potentielle);
               if( valeur_potentielle-v[i]<valeur_optimale)
                 {  printf("\n********entre*******\n");
                 sac[i]=1;printf("\nsac[i]=%d\n",sac[i]);
                 Psac=Psac+w[i];printf("\nsac= %d\n",Psac);
             valeur_actuelle=valeur_actuelle+v[i]; printf("\nvaleur actuelle=%d\n",valeur_actuelle);
                 choix(i+1); valeur_restante=valeur_restante-v[i];
                 }
             }
            else
                    {sac[i]=0;
                 printf("\nsac[i]=%d\n",sac[i]);
                 choix(i+1);valeur_restante=valeur_restante-v[i];
                 } }        */
     
     
     
     
      void remplir_l()
       {
        int poid,val,nomb,i=0;
        fscanf(fin,"%d ",&W);
       fscanf(fin,"%d ",&nomb);
         n=nomb;
           while(i<n)
            {fscanf(fin,"%d",&poid);
                w[i] = poid;
                 fscanf(fin,"%d",&val);
                 v[i] =val;
                 i++;
            }
       }
     void ecrire()
      {
        fprintf(fout,"valeur_optimale=%d\n",valeur_optimale);
        fprintf(fout," ");
        for (int i=0;i<n;i++)
        if(sac[i]=1)
        fprintf(fout," %d",i);
        fprintf(fout,"\nw ");
        for (int j=0;j<n;j++)
        if(sac[j]=1)
        fprintf(fout,"%d ",w[j]);
        fprintf(fout,"\nv ");
        for (int k=0;k<n;k++)
        if(sac[k]=1)  fprintf(fout,"%d ",v[k]);
         }
    si quelqu'un pourrait m'aider je serait reconnaissante
    merci d'avance

  2. #2
    Membre Expert Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Par défaut
    C'est un problème combinatoire où tu as un certain nombre de contraintes à respecter.

    Grosso modo, tu as un ensemble de variables que tu peux modifier, et cet ensemble de variables peut violer des contraintes.
    Ici, ton ensembles de variables c'est "quels objets je mets dans le sac ?", et la contrainte violable c'est si la somme du poids des objets est supérieur au poids maximum supportable par le sac.

    On cherche à maximiser le nombre d'objets ou le poids maximum ou autre chose... Pour un voleur, je pense qu'il chercherait à maximiser la somme totale de la valeur des objets contenu dans son sac.

    Quoiqu'il en soit, les algorithmes génétiques sont vraiment géniaux pour régler les problèmes combinatoires de ce genre.

    Si tu as des questions après avoir lu ça, n'hésite pas.

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 481
    Par défaut
    regarde aussi les algo d'optimisation. (Lagrangien ... )

  4. #4
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Bonjour,

    il me semble que le problème est appartient à la classe P.
    Il ne sera donc pas facile à résoudre avec des méthodes directes et exaustives.

    - Cherche du cotés des méta heuristique comme la méthode Tabou principalement.
    - Il y a de nombreux algo issuent de l'IA qui traite ce genre de problèmes.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  5. #5
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Citation Envoyé par ToTo13
    Bonjour,

    il me semble que le problème est appartient à la classe P.
    Il ne sera donc pas facile à résoudre avec des méthodes directes et exaustives.
    Tu voulais dire qu'il appartient à la classe des problèmes NP complets plutôt parce que la classe P (Polynomiale) ne présente guère de difficulté...

    --
    Jedaï

  6. #6
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Bonjour,

    oups effectivement...
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

Discussions similaires

  1. Programmation dynamique pour le probleme du sac a dos
    Par ahmadou_20 dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 27/08/2014, 11h53
  2. Probleme du sac a dos avec des valeurs en Float
    Par ahmadou_20 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 26/08/2014, 13h06
  3. [Débutant] probleme de sac a dos
    Par yabo84 dans le forum MATLAB
    Réponses: 1
    Dernier message: 30/11/2010, 15h56
  4. Demande d'info sur optimisation sac-a-dos en prog dynamique
    Par poof65 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 13/02/2007, 00h43
  5. Diviser le traitement du sac a dos
    Par Treuze dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 18/12/2006, 15h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo