Добавление элементов узла в Java Graph с помощью цикла for

Я пытаюсь добавить вновь созданные объекты в сетку и на график. В частности, как эффективно добавлять узлы в граф с помощью цикла for. Их сетка была настроена как двойной массив, чтобы обновить первоначальный вид. (Сетка объектов является моделью и обновляет вид с помощью push-уведомлений). Я также настроил HashMap, используя элементы i и j в циклах for, чтобы определить ключи объекта. Однако для того, чтобы настроить граф для последующего расчета кратчайшего пути от узла к узлу, мне нужно добавить эти узлы в граф. Я хотел бы использовать алгоритм Джикстры для вычисления кратчайшего пути. Я мог бы создать условный оператор, чтобы определить, что такое угловые узлы и краевые узлы в сетке, и определить, какие элементы будут иметь двунаправленные края, но это кажется «длинным разрезом». Есть ли способ добавить узлы в граф с заранее определенным размером матрицы, например, 20 X 20, как в двойном массиве?

Ниже приведен код конструктора того, как я создаю первые два элемента (создание двойного массива и HashMap):

// **Constructor
// Construct a new Grid object. Sets up a HashMap of square object in order efficiently to get 
// and add Square objects later.
public ObjectGrid(Integer width, Integer height) 
{
    // View
    gui = new GUI();        // Instantiate GUI
    boardView = new BoardView(width,height);        // Instantiate BoardView

    // Initialize Gui, set time and add simulation event listener to model (ObjectGrid)
    gui.initGUI(BoardView);
    gui.addSimulationEventListener(this);

    // Initialize turnInSteps variable count to 0
    turnInSteps = 0;

    // Initialize numberOfDays variable count to 0
    numberOfDays = 1;

    // Instantiate HashMap
    objectHashMap = new HashMap();

    // Declare new object grid using double array of type objects.
    // Size determined by parameter Integer values in constructor
    myObjectGrid = new ObjectType[width][height];

    // Instantiate Graph object
    Graph graph = new ListGraph();

    // For loop sets up the initial grid with ObejctType using a double array. After
    // the completion of this loop, the grid will have XXX objects in the grid
    // each with a reference to an object. Objects are also added 
    // to HashMap using coordinates as keys and square objects as values.
    for(int i = 0; i < width; i++) 
    {  
        // Iterate through rows
        for(int j = 0; j < height; j++) 
        {  
            // Iterate through columns
            myObjectGrid[i][j] = new ObjectType();  // Instantiate a new Square at each row/column using default constructor
            gridView.addObjectView(myObjectGrid[i][j].getObjectView(), i, j);  // Add object view to each row/column placement
            String hashMapKey = (i + ", " + j); // Use values from i and j as Key for objects HashMap
            myObjectGrid[i][j].setID(hashMapKey);  // Add ID's for each ObjectView to display in object using values from i and j
            objectHashMap.add(hashMapKey, myObjectGrid[i][j]);  // Add object to HashMap using string value of coordinates as key
            listGraph.add(myObjectGrid[i][j]);

            // Pseudo code
            if (i != (width-height) && (j != height) etc) 
            {
                listGraph.addBidirectionalEdge(mySquareGrid[i][j], (mySquareGrid[i][j+1]), 1);
                listGraph.addBidirectionalEdge(mySquareGrid[i][j], (mySquareGrid[i+1][j]), 1);
                listGraph.addBidirectionalEdge(mySquareGrid[i][j], (mySquareGrid[i+1][j+1]), 1);
            }
        }
    }
}

person gwerner    schedule 24.12.2012    source источник
comment
а какой у тебя вопрос?   -  person vishal_aim    schedule 24.12.2012
comment
извиняюсь за не конкретику. (первый пост на этом сайте). Вопрос в том, как добавить объекты в качестве узлов в граф, используя цикл for. Если цикл for не является правильным способом, вам может помочь руководство по другому методу. С помощью модульных тестов, которые я выполнил, вершины в графе возвращают значение null.   -  person gwerner    schedule 24.12.2012
comment
Лучше обновить свой пост с этим вопросом.   -  person tcb    schedule 24.12.2012
comment
Привет, отредактировал вопрос по предложению tcb.   -  person gwerner    schedule 24.12.2012


Ответы (1)


С помощью модульных тестов, которые я выполнил, вершины в графе возвращают значение null.

Причина в следующих строках:

listGraph.addBidirectionalEdge(mySquareGrid[i][j], (mySquareGrid[i][j+1]), 1);
listGraph.addBidirectionalEdge(mySquareGrid[i][j], (mySquareGrid[i+1][j]), 1);
listGraph.addBidirectionalEdge(mySquareGrid[i][j], (mySquareGrid[i+1][j+1]), 1);

Вы находитесь в середине инициализации mySquareGrid и создаете ребра с узлами из будущего. Эти узлы с j+1 и i+1 в данный момент являются нулевыми.

Попробуйте самое простое решение - после инициализации сетки проделайте тот же цикл по сетке и создайте ребра графа.

Кроме того, вы можете попробовать изменить его на следующее:

listGraph.addBidirectionalEdge(mySquareGrid[i][j-1], (mySquareGrid[i][j]), 1);
listGraph.addBidirectionalEdge(mySquareGrid[i-1][j], (mySquareGrid[i][j]), 1);
listGraph.addBidirectionalEdge(mySquareGrid[i-1][j-1], (mySquareGrid[i][j]), 1);
person tcb    schedule 24.12.2012
comment
Скажем, вершины равны 4,4 (x и y соответственно): [i][j-1] 4,3, смежные с 4,4 (север). [i-1][j] 3,4, примыкает к 4,4 (запад). [i-1][j-1] 3,3, примыкает к 4,4 (северо-запад). Однако от [i-1][j-1] до [i][j+1] от 3,3 до 4,5, которые не являются соседними. Разрешены ли ребра между несмежными узлами? - person gwerner; 24.12.2012
comment
Я добавил условные операторы, чтобы иметь возможность идентифицировать угловые объекты и граничные объекты, а затем определить, какие объекты являются смежными, используя операторы условного перехода: 'for (int i=0; i‹width; i++) { for (int j=0; j ‹высота; j++) { myHashMap.get(i+, j); если (i==0; j==0) { int myRandom = randomno.nextInt(3); { if (myRandom == 0) { // код для перемещения объектов в соседние квадраты. Хотя это выглядит как настоящий длинный разрез. Вы могли бы подумать, что есть более простой способ сделать это или API, который уже предоставляет эту функциональность. - person gwerner; 25.12.2012
comment
Это действительно зависит от выбранного вами алгоритма. Попробуйте взглянуть на myObjectGrid. Предоставляет ли он вам информацию о соседних узлах? Если да, то можно построить алгоритм поиска только по этой сетке, график строить не нужно. - person tcb; 25.12.2012