Динамическое программирование ArrayIndexOutOfBoundException - PullRequest
3 голосов
/ 11 марта 2011

Я получаю это странное исключение, я не совсем понимаю, почему .. Я попробовал отладку и обнаружил, что во время работы происходит ошибка:

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

и когда i == 0 и j == 1, но этого не должно происходить, так как в этом случае opt - это матрица 9x6.

Это мой код:

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());

    }

}

И это входной файл, который я читаю:

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

В этом случае:

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

во второй строке показаны цены за интервал времени. итого 8.

Я ценю любую помощь, спасибо.

Ответы [ 4 ]

3 голосов
/ 11 марта 2011

opt инициализируется во время строительства до установки timeSlot и maxcap.

Итак, вы создаете массив

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

Вы должны создать массив в методе readInput после того, как пользователь введет значения.

2 голосов
/ 11 марта 2011

Вы создаете свой массив с maxCap и timeSlot, в то время как они все еще имеют значение по умолчанию 0.readInput() еще не был вызван, так как вы можете узнать, какой размер сделать массив?

Создать массив после того, как вы прочитали в maxCap и timeSlot.

1 голос
/ 11 марта 2011

Когда вы создаете объект класса Versie3, maxCap и timeSlot принимают значения по умолчанию 0, а массив opt создается с размером 1 x 1.

После этого вы идете и читаете файл, который переписывает значения maxCap и timeSlot, но размер массива остается неизменным .

Чтобы исправить это, выделите память для массивав функции readFile после того, как вы прочитали размеры.

1 голос
/ 11 марта 2011

Вы инициализируете свой массив opt, прежде чем определите, что равно maxCap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...