2011-03-11 6 views
3

Je reçois cette exception bizarre, je ne comprends pas vraiment pourquoi .. J'ai essayé le débogage et découvert qu'il va mal lors de l'exécution:programmation dynamique ArrayIndexOutOfBoundException

opt[i][j] = Double.POSITIVE_INFINITY; 

et quand i == 0 et j == 1, mais cela ne devrait pas arriver puisque dans ce cas opt est une matrice 9x6.

Ceci est mon code:

public class Versie3 { 

    private int desCap; 
    private int currentCap; 
    private int maxCap; 
    private int timeSlot; 
    private static ArrayList<Double> prices; 
    private double[][] opt = new double[timeSlot + 1][maxCap + 1]; 

    public Versie3() throws FileNotFoundException { 

    } 

    public void readInput(String s) throws FileNotFoundException 
    { 
     FileReader fr = new FileReader(s); 
     Scanner sc = new Scanner(fr); 

     timeSlot = sc.nextInt(); 
     maxCap = sc.nextInt(); 
     currentCap = sc.nextInt(); 
     desCap = sc.nextInt(); 
     prices = new ArrayList<Double>(timeSlot); 

     while (sc.hasNextDouble()) { 
      prices.add(sc.nextDouble()); 

     } 
    } 

    public double calculateOptimal() 
    { 
     for (int i = 0; i <= timeSlot; i++) 
     { 
      for (int j = 0; j <= maxCap; j++) 
      { 
       if (i == 0) 
       { 
        if (j != desCap) 
        { 

         opt[i][j] = Double.POSITIVE_INFINITY; // <--here it goes Wrong! 
        } 
        else 
        { 
         opt[i][j] = 0; 
        } 
       } 
       else if (j == 0) 
       { 
        opt[i][j] = Math.min(opt[i - 1][j], 
          opt[i - 1][j + 1] 
            - prices.get(i-1)); 
       } 
       else if (j == maxCap) 
       { 
        opt[i][j] = Math.min(opt[i - 1][j], 
          opt[i - 1][j - 1] 
            + prices.get(i-1)); 
       } 
       else 
       { 
        opt[i][j] = Math.min(Math.min(opt[i - 1][j], 
        opt[i - 1][j - 1] 
        + prices.get(i - 1)),opt[i - 1][j + 1]- prices.get(i-1)); 
       } 
      } 
     } 
     return opt[timeSlot][currentCap]; 
    } 

    public static void main(String[] args) throws FileNotFoundException { 
     Versie3 v3 = new Versie3(); 
     v3.readInput("input.txt"); 
     System.out.println("prices: " + prices.toString()); 
     System.out.println("timeSlot: " + v3.timeSlot); 
     System.out.println("maxCap: " + v3.maxCap); 
     System.out.println("currentCap: " + v3.currentCap); 
     System.out.println("desCap: " + v3.desCap); 
     //System.out.println("minimum cost: "+v3.calculateOptimal()); 
     System.out.println(v3.prices.size()); 

    } 

} 

Et ceci est le fichier d'entrée je lis:

8 5 2 5 
2.2 3 5 6.5 5 5 3 1.8 

Dans ce cas:

timeSlot = 8 
maxCap = 5 
currentCap = 2 
desCap = 5 

la deuxième ligne montre la prix par tranche de temps. donc 8 au total.

J'apprécie toute aide merci.

+1

+1 question bien structurée avec toutes les informations nécessaires. –

Répondre

2

Vous créez votre tableau avec maxCap et timeSlot alors qu'ils ont toujours la valeur par défaut 0. readInput() n'a pas encore été appelé alors comment pourriez-vous savoir quelle taille pour faire le tableau? Créez le tableau après avoir lu maxCap et timeSlot.

1

Vous devez init votre tableau d'opt avant de déterminer ce que maxCap est égal à.

3

opt devient intialized au moment de la construction avanttimeSlot et maxcap sont définies.

Vous créez un tableau

private double[][] opt = new double[0 + 1][0 + 1]; 

Vous devez créer le tableau dans la méthode readInput après que l'utilisateur a entré les valeurs.

1

Lorsque vous créez un objet de la classe Versie3, maxCap et timeSlot prennent leur valeur par défaut de 0 et le tableau opt est créé avec la taille de 1 x 1.

Après cela, vous allez lire le fichier qui réécrit les valeurs de maxCap et timeSlot, mais la taille du tableau reste inchangé .

Pour résoudre ce problème, allouez de la mémoire pour le tableau dans la fonction readFile après avoir lu les dimensions.