Pembuatan cache jalur cepat untuk grafik node yang terhubung

Saya mencoba menerapkan mekanisme pencarian jalur yang lebih cepat dalam game yang sedang saya kerjakan untuk grafik simpul yang terhubung. Node dikelompokkan menjadi dua jenis, "Jaringan" dan "Router".


Dalam gambar ini, lingkaran biru mewakili router dan jaringan persegi panjang abu-abu.

Setiap jaringan menyimpan daftar router mana yang terhubung dengannya, dan sebaliknya. Router tidak dapat terhubung langsung ke router lain, dan jaringan tidak dapat terhubung langsung ke jaringan lain.


Jaringan mencantumkan router mana yang terhubung



Router melakukan hal yang sama

Saya perlu mendapatkan algoritma yang akan memetakan jalur, diukur dalam jumlah jaringan yang dilintasi, untuk setiap kemungkinan jaringan sumber dan tujuan tidak termasuk jalur di mana sumber dan tujuan adalah jaringan yang sama. Saya punya satu saat ini, namun sangat lambat, membutuhkan waktu sekitar dua detik untuk memetakan jalur, yang menjadi sangat terlihat oleh semua pemain yang terhubung.

Algoritme saat ini adalah pencarian brute-force yang mendalam (dilakukan bersama-sama dalam waktu sekitar satu jam agar caching jalur berfungsi) yang mengembalikan array jaringan sesuai urutan yang dilaluinya, yang menjelaskan mengapa ini sangat lambat. Apakah ada algoritma yang lebih efisien?

Sebagai catatan tambahan, meskipun contoh grafik ini memiliki empat jaringan, grafik dalam praktiknya memiliki 55 jaringan dan sekitar 20 router yang digunakan. Jalur yang tidak memungkinkan juga dapat terjadi, dan juga sewaktu-waktu topografi grafik jaringan/router dapat berubah, sehingga memerlukan cache jalur untuk dibangun kembali.

Pendekatan/algoritma apa yang mungkin memberikan hasil terbaik untuk jenis grafik ini?


person Sukasa    schedule 01.06.2010    source sumber
comment
Jika diperlukan saya dapat memberikan kode yang digunakan untuk membangun cache pada saat pertanyaan diajukan   -  person Sukasa    schedule 01.06.2010


Jawaban (2)


Algoritme jalur terpendek Dijkstra adalah yang klasik, tetapi hanya dirancang untuk grafik statis.

Anda dapat mencoba mencari di web untuk algoritma dinamis terpendek.

Berikut ini satu makalah yang tampaknya relevan: http://www.utdallas.edu/~edsha/papers/bin/Globecom04_SPT.pdf (dan mungkin memberi Anda petunjuk lain).

Makalah ini menjelaskan jaringan router, di mana setiap router memelihara Tabel Jalur Terpendeknya sendiri. Mungkin Anda bisa melakukan hal serupa.

Saya sarankan Anda juga melihat algoritma perutean secara umum karena mengambil jalur terpendek selalu dapat menyebabkan kemacetan dll (saya memikirkan 16 tim Halo!). Anda mungkin juga ingin memasukkan penyeimbangan beban, dll.

Semoga ini bisa membantu.

person Community    schedule 02.06.2010
comment
Dalam konteks jaringan, tingkat lalu lintas/dll tidak relevan, karena ini hanya simulasi tingkat tinggi yang sederhana. Game ini dikodekan dalam bahasa yang dikompilasi menjadi bytecode dan kemudian diinterpretasikan, sehingga fungsinya harus relatif ringan (Dan kode yang memindahkan jalur dari satu jaringan ke jaringan lain seefisien mungkin tanpa menghilangkan fungsionalitas). Selama saya dapat dengan cepat membangun setiap jalur yang valid atau dengan cepat menentukan tidak ada jalur seperti itu (Atau kompromi keduanya), saya senang. - person Sukasa; 03.06.2010
comment
@Sukasa: Anda mungkin menemukan bahwa membagi grafik Anda menjadi komponen-komponen yang terhubung dua kali berguna. - person ; 03.06.2010
comment
@Moron, bisakah Anda memberikan lebih banyak info? Artikel wikipedia tentang mereka membuat saya sedikit tidak yakin - person Sukasa; 03.06.2010
comment
@Sukasa: Komponen bi-connected (atau 2-connected) adalah graf yang paling sedikit terdapat dua jalur yang saling lepas antara setiap pasangan simpul. Jadi, jika Anda membagi grafik menjadi 2 komponen yang terhubung, dan kemudian menemukan jaringan/router 'tepi', hal ini mungkin akan sedikit mempercepat. Misalnya untuk berpindah dari komponen A ke C, Anda mungkin harus melalui komponen B, jika Anda mengetahui konektor tepinya, maka Anda mungkin dapat dengan cepat menemukan jalurnya. Diperlukan setidaknya 2 penghapusan tepi sebelum Anda (mungkin) perlu melakukan pemetaan ulang. Itu hanya sebuah ide yang menurut saya mungkin berguna bagi Anda. - person ; 03.06.2010
comment
@Sukasa: Selain itu, Anda mungkin menemukan bagian Algoritma Lainnya di en.wikipedia.org/wiki/Biconnected_component berguna, yang membahas tentang algoritma komponen bi-connected dinamis (oleh Westbrook dan Tarjan). - person ; 03.06.2010

Anda mungkin ingin melihat domain jaringan klasik. Ini bukan jawaban yang tepat, tetapi akan memberi Anda titik awal untuk algoritma "lebih baik daripada brute force".

http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

person jcsf    schedule 01.06.2010