开发者

Dynamic programming ArrayIndexOutOfBoundException

I'm getting this weird exception, I don't really understand why.. I tried debugging and found out that it goes wrong when running:

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

and when i == 0 and j == 1, but this shouldn't happen since in this case opt is a 9x6 matrix.

This is my 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());

    }

}

And this is the input file I'm reading:

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

In this case:

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

the second row shows the prices per time slot. so 8 in total.

I appreciate any help thanks.


opt is getting intialized at construction time before timeSlot and maxcap are set.

So you create an array

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

You have to create the array in the readInput method after the user has entered the values.


You are creating your array with maxCap and timeSlot while they still have the default value of 0. readInput() has not been called yet so how could you know what size to make the array?

Create the array after you read in maxCap and timeSlot.


You init your opt array before you determine what maxCap equals.


When you create an object of the class Versie3, maxCap and timeSlot take their default value of 0 and the array opt is created with the size of 1 x 1.

After this you go and read the file which rewrites the values of maxCap and timeSlot but the array size remains unchanged.

To fix this, allocate memory for the array in function readFile after you've read the dimensions.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜