Menambahkan item simpul ke Java Graph dengan for loop

Saya mencoba menambahkan objek yang baru dibuat ke kisi dan grafik. Khususnya, cara menambahkan node ke grafik secara efisien dengan perulangan for. Kisi-kisinya telah diatur sebagai larik ganda, untuk memperbarui tampilan awal. (Kisi objek adalah model dan memperbarui tampilan melalui push). Saya juga menyiapkan HashMap menggunakan item di i dan j dalam loop for untuk menentukan kunci objek. Namun, untuk membuat grafik agar nantinya dapat menghitung jalur terpendek dari node ke node, saya perlu menambahkan node ini ke Grafik. Saya ingin menggunakan algoritma Djikstra untuk menghitung jalur terpendek. Saya dapat membuat pernyataan kondisional untuk mendefinisikan apa itu simpul sudut dan simpul tepi dalam kisi dan menentukan item apa yang memiliki tepi dua arah tetapi ini tampaknya merupakan 'jalan pintas'. Apakah ada cara untuk menambahkan node ke grafik dengan ukuran matriks yang telah ditentukan, seperti misalnya 20 X 20, mirip dengan array ganda?

Di bawah ini adalah kode konstruktor tentang cara saya membuat dua item pertama (membuat array ganda dan 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 sumber
comment
dan apa pertanyaanmu?   -  person vishal_aim    schedule 24.12.2012
comment
maaf karena tidak spesifik. (posting pertama di situs ini). Pertanyaannya adalah bagaimana menambahkan objek sebagai node ke grafik, menggunakan for loop. Jika perulangan for bukan cara yang tepat, panduan ke metode lain akan membantu. Dengan pengujian unit yang saya lakukan, simpul pada grafik menghasilkan nol.   -  person gwerner    schedule 24.12.2012
comment
Lebih baik perbarui postingan Anda dengan pertanyaan ini.   -  person tcb    schedule 24.12.2012
comment
Hai, telah mengedit pertanyaan sesuai saran tcb.   -  person gwerner    schedule 24.12.2012


Jawaban (1)


Dengan pengujian unit yang saya lakukan, simpul pada grafik menghasilkan nol.

Alasannya adalah baris berikut:

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

Anda sedang melakukan inisialisasi mySquareGrid dan membuat tepian dengan node dari masa depan. Node dengan j+1 dan i+1 ini adalah null saat ini.

Coba solusi paling sederhana - setelah inisialisasi grid, lakukan siklus yang sama melalui grid dan buat tepi grafik.

Selain itu, Anda dapat mencoba mengubahnya menjadi yang berikut:

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
Katakanlah simpulnya adalah 4,4 (x dan y, masing-masing): [i][j-1] 4,3, berdekatan dengan 4,4 (utara). [i-1][j] 3,4, bersebelahan dengan 4,4 (barat). [i-1][j-1] 3,3, berdekatan dengan 4,4 (barat laut). Namun, [i-1][j-1] hingga [i][j+1] adalah 3,3 hingga 4,5, yang tidak berdekatan. Apakah edge diperbolehkan di antara node yang tidak berdekatan? - person gwerner; 24.12.2012
comment
Saya menambahkan pernyataan kondisional untuk dapat mengidentifikasi objek sudut dan objek perbatasan dan kemudian menentukan objek mana yang berdekatan dengan menggunakan pernyataan cabang kondisional: 'for (int i=0; i‹width; i++) { for (int j=0; j ‹tinggi; j++) { myHashMap.get(i+, j); if (i==0; j==0) { int myRandom = randomno.nextInt(3); { if (myRandom == 0) { // kode untuk memindahkan objek ke kotak yang berdekatan. Ini sepertinya potongan yang sangat panjang. Anda mungkin berpikir akan ada cara yang lebih sederhana untuk melakukan ini atau API yang sudah menyediakan fungsi ini. - person gwerner; 25.12.2012
comment
Itu sangat tergantung pada algoritma yang Anda pilih. Coba lihat myObjectGrid. Apakah ini memberi Anda informasi tentang node yang berdekatan? Jika ya, maka Anda dapat membuat algoritma pencarian hanya menggunakan grid ini, Anda tidak perlu membuat grafik. - person tcb; 25.12.2012