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

avec Java Discussion :

Programmtion dynamique - Sac a dos


Sujet :

avec Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 54
    Points : 47
    Points
    47
    Par défaut Programmtion dynamique - Sac a dos
    Salut les gars,

    J ai implemente une premiere version (tres basique et tres simple) d un algo de programmation dynamique du probleme du sac a dos. Mais j ai pas compris pourquoi une exception de NullPointer est levee a chaque fois (ligne 33).

    Help please !!!

    Ci dessous le code que j ai ecrit :

    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
     
    Integer[] values = new Integer[100];
     Integer[] weights = new Integer[100];
     
        values[1] = 2;
        values[2] = 2;
        values[3] = 3;
        values[4] = 1;
        weights[1] = 1;
        weights[2] = 2;
        weights[3] = 1;
        weights[4] = 2;
     
        Integer C = 6;
     
        int n = 4;
     
     
     
        Integer[][] tableau = new Integer[100][100];
     
     
        for(int v = 1; v <= C; v++) {
          tableau[v][0] = 0;
        }
     
        for(int i = 1; i <= n; i++) {
          for(int v = 0; v <= C; v++) {
            if(v < weights[i]) {
              tableau[v][i] = tableau[v][i - 1];
            }
            else {
              tableau[v][i] = Math.max(tableau[v][i - 1], tableau[v - weights[i]][i - 1] + values[i]);
            }
          }
        }
     
        System.out.println("Valeur optimale" + tableau[C][n]);
     
        Integer[] x = new Integer[n + 1];
     
        for(int i = 0; i <= n; i++) {
          x[i] = 0;
        }
     
        int k = n;
        while(C > 0 || k > 0) {
          if(tableau[C][k] != tableau[C][k - 1]) {
            x[k] = x[k] + 1;
            C = C - weights[k];
          }
          k--;
        }
     
        System.out.println("On va prendre le(s) objet(s) : ");
     
        for(int j = 1; j <= n; j++) {
          if(x[j] == 1) {
            System.out.println("Object " + j);
     
          }
        }
    Merci d avance pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    lorsque i=1 et v=1

    weights[i]=1

    donc v-weights[i] = 0

    et donc tu lit tableau[v-weights[i]][i-1], c'est à dire tableau[0][0] mais tu n'a jamais rien stocké dans cette case, donc tu te chope un null, qu'il est impossible de transformer en int pour le faire intervenir dans ton calcul => erreur.


    Solution: initialise proprement ton tableau plutot que d'y mettre des null partout. Voir, remplace Integer par int, car je ne vois pas ici l'intérêt d'utiliser les objets plutôt que les int.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 54
    Points : 47
    Points
    47
    Par défaut
    Merci C est fait et ca marche (enfin presque !!!).

    Sauf que un autre probleme surgit cette fois.

    Un probleme de ArrayIndexOutOfBounds que je n avais pas avant (je m en suis rendu compte en modifiant values[4] de 1 a 7 par exemple) : je comprends pas trop ce qui se passe ici !!!

    Le dernier code.

    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
     
     
    Integer[] values = new Integer[100];
     Integer[] weights = new Integer[100];
     
        values[1] = 2;
        values[2] = 2;
        values[3] = 3;
        values[4] = 7;
        weights[1] = 1;
        weights[2] = 2;
        weights[3] = 1;
        weights[4] = 2;
     
        Integer C = 6;
     
        int n = 4;
     
     
     
        Integer[][] tableau = new Integer[100][100];
     
     
        for(int v = 1; v <= C; v++) {
          tableau[v][0] = 0;
        }
     
        for(int i = 1; i <= n; i++) {
          for(int v = 0; v <= C; v++) {
            if(v < weights[i]) {
              tableau[v][i] = tableau[v][i - 1];
            }
            else {
              tableau[v][i] = Math.max(tableau[v][i - 1], tableau[v - weights[i]][i - 1] + values[i]);
            }
          }
        }
     
        System.out.println("Valeur optimale" + tableau[C][n]);
     
        Integer[] x = new Integer[n + 1];
     
        for(int i = 0; i <= n; i++) {
          x[i] = 0;
        }
     
        int k = n;
        while(C > 0 || k > 0) {
          if(tableau[C][k] != tableau[C][k - 1]) {
            x[k] = x[k] + 1;
            C = C - weights[k];
          }
          k--;
        }
     
        System.out.println("On va prendre le(s) objet(s) : ");
     
        for(int j = 1; j <= n; j++) {
          if(x[j] == 1) {
            System.out.println("Object " + j);
     
          }
        }

    Merci encore une fois.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ben tu regarde ton message d'erreur, tu regarde la ligne indiquée, et tu aura toutes les information nécessaires: la tableau concerné, l'index auquel tu essaie d'accéder et le fait que cette combinaison sort de la taille du tableau.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 54
    Points : 47
    Points
    47
    Par défaut
    c est bon merci
    c est resolu

+ Répondre à la discussion
Cette discussion est résolue.

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. [Débutant] probleme de sac a dos
    Par yabo84 dans le forum MATLAB
    Réponses: 1
    Dernier message: 30/11/2010, 15h56
  3. 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
  4. 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
  5. probleme du sac a dos (knapsack)
    Par malalll dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 24/05/2006, 16h52

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