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 :

Implémentation d'une solution dynamique au problème du sac-à-dos


Sujet :

Algorithmes et structures de données

  1. #1
    Nouveau Candidat au Club  
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Lesotho

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Implémentation d'une solution dynamique au problème du sac-à-dos
    Bonjour;
    alors dans mon projet fin d'étude, qui n'a aucune relation avec mes études sous nom de sac-à-dos, j'ai besoin de mettre algorithme glouton et algorithme programmation-dynamique pour un problème sac-à-dos'
    j'ai travaillé avec un algorithme pré-préparé, donc j'ajoute des truc et je les change... mais j'arrive pas a faire le code qui afficher les objets qui a choisis pour le mettre dans le sac,
    j'aimerai des idées qui peuvent m'aidez a avance, sachant que pour mon projet je suis censé apprendre le tout moi même, je n'ai jamais étudié la programmation en c ni en c++, juste la base, mais ça m'aidera pas. Et je ne connais presque sur les 2algo car je les découvre au fil de ces 3mois mais je ne connais que la définition donc voilà

    je sais que c'est 'interdit' de faire un exercice à la place de quelqu'un, mais j'ai fort besoin de vous, personne ne peut m'aider sauf sur internet

    voici mon code, c'est de la programmation dynamique normalement ou du Glouton? ^^

    Code c++ : 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
     
    #include <iostream>
     
    using namespace std;
     
    #define max(a,b) (a > b ? a : b)
     
    int matrix[100][100] = {0};
     bool x[100];
    int knapsack(int i, int size, int weights[],int values[]){
        int take,dontTake;
     
     
        take = dontTake = 0;
     
        if (matrix[i][size]!=0)
            return matrix[i][size];
     
        if (i==0){
            if (weights[0]<=size){
                matrix[i][size] = values[0];
                return values[0];
            }
            else{
                matrix[i][size] = 0;
                return 0;
            }
        }
     
        if (weights[i]<=size){
            take = values[i] + knapsack(i-1, size-weights[i], weights, values);
            x[i]=0;}
            else {
            dontTake = knapsack(i-1, size, weights, values);
            x[i]=1;}
            cout<< "pour l'objet "<<i<< " , x[i]="<<x[i]<<endl;
            matrix[i][size] = max (take, dontTake);
     
     
        return matrix[i][size];
     
    }
     
    int main(){
        int n,knapsackSize,weights[100],values[100];
        int i;
        cout<<"entrer the number of items"<<endl;
        cin>>n;
       cout<<"enter the knapsackSize"<<endl;
        cin>>knapsackSize;
     
        for(i=0;i<n;i++)
        {
           cout<<"enter weight and value of item "<<i+1<<endl;
           cin>>weights[i]>>values[i];
        }
     
     
     
        cout<<"Max value ="<<knapsack(n,knapsackSize,weights,values)<<endl;
     
        return 0;
    }

    Voici mes questions:

    -le code me donne la valeur maximal fausse, ça dois me donner un 90 comme valeur, voici l'exemple que j'ai pris de la programmation dynamique:

    Nom : 9l0z.jpg
Affichages : 4219
Taille : 32,8 Ko

    - j'aimerai savoir c'est quoi la fonction qui permet de me donner les objet choisi a mettre dans le sac
    - normalement dans la programmation dynamique: et ce que je dois avoir la matrice ou quoi ? si oui comment le faire, je suis perdu

    aidez moi s'il vous plait,

    et voici les résulats qui me semble fausse puisque je dois avoir 90comme valeur max.
    Code x : 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
    entrer the number of items
    4
    enter the knapsackSize
    10
    enter weight and value of item 1
    5 10
    enter weight and value of item 2
    4 40
    enter weight and value of item 3
    6 30
    enter weight and value of item 4
    3 50
    pour l'objet 1 , x[i]=1
    pour l'objet 2 , x[i]=0
    pour l'objet 3 , x[i]=0
    pour l'objet 4 , x[i]=0
    Max value =4713208
    
    --------------------------------
    Process exited after 22.29 seconds with return value 0
    Appuyez sur une touche pour continuer...

    Encore merci.

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Bonjour,

    3 remarques en vrac:

    1. L'index pour la création des items (weights[] et values[]) varie entre 0 et n-1.
    Mais lors de l'appel de la
    fonction knapsack(), on passe en paramètre "n" => on va accéder à values[n] et weights[n].
    Vraisemblablement, tu devais avoir un truc du genre: take = values[i-1] + knapsack(i-1, ...

    2. Il faut toujours évaluer "
    take" ET "dontTake" pour choisir le meilleur des deux. Dans ton algo, tu évalues l'un OU l'autre.

    3. Ce n'est pas un algo dynamique mais un algo d'évaluation récursive: pour calculer knapsack(n) on calcule knapsack(n-1), qui lui même calcule knapsack(n-2), etc.

    Dans un algo dynamique on fait une évaluation incrémentale en utilisant les résultats intermédiaires pour calculer le prochain incrément
    - knapsack(0) est calculé à partir des données du problème initial.
    - knapsack(1) est calculé à partir de knapsack(0) et des données du problème initial.
    - knapsack(2) est calculé à partir de knapsack(0), knapsack(1) et des données du problème initial.
    - etc.

    A+
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Nouveau Candidat au Club  
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Lesotho

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    bien Merci, je vais corriger celà,

Discussions similaires

  1. [Python 2.X] Est ce qu'il existe une solution pour ce problème ?
    Par wissssam dans le forum Général Python
    Réponses: 5
    Dernier message: 17/03/2016, 10h58
  2. Une solution pour tous problèmes
    Par kadden dans le forum Gestion de projet
    Réponses: 7
    Dernier message: 02/03/2012, 10h21
  3. Une solution pour tous problèmes
    Par kadden dans le forum Méthodes Agiles
    Réponses: 1
    Dernier message: 11/02/2012, 11h49
  4. Réponses: 0
    Dernier message: 19/11/2010, 17h10
  5. Implémentation d'une solution de e-commerce
    Par superfafa dans le forum ASP
    Réponses: 2
    Dernier message: 15/01/2007, 10h35

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