Apa metode yang baik untuk secara acak menghasilkan tepi antara node grafik?

10

Saya sedang melakukan generator peta acak untuk game ruang 4X.

Setiap node dalam game ditempatkan pada koordinat acak (x, y) pada kisi 2d. Sebuah node dapat memiliki satu atau lebih tepi dua arah ke node lain (mewakili lubang cacing). Semua node harus memiliki setidaknya satu wormhole, dan semua node harus memiliki grafik yang sama.

Idealnya, lubang cacing tidak boleh melebihi panjang maksimum dan jika memungkinkan, lubang cacing tidak boleh saling bersilangan.

Implementasi naif saya adalah untuk beralih melalui semua node dan memiliki link node ke 3 node terdekat. Namun, saya berakhir dengan banyak sub grafik. Apa metode yang baik untuk menghasilkan tepi untuk node?

Extrakun
sumber
bagaimana node tersebar di galaksi? Maksud saya, bolehkah saya berasumsi bahwa untuk setiap titik (X, Y) di galaksi ada simpul? atau setidaknya untuk sebagian besar atau tidak?
Ali1S232
Tidak semua koordinat memiliki simpul. Tentang 40% saya akan mengatakan.
Extrakun

Jawaban:

9

Ini jawaban yang bagus untuk pertanyaan serupa.

Pertama buat grafik terhubung, mungkin menggunakan pohon spanning minimum seperti pada tautan di atas. Dia menyarankan menggunakan bobot tepi acak untuk membuat pohon "minimum" acak. Kemudian Anda dapat secara acak menambahkan lebih banyak tepi sehingga bukan hanya pohon minimum. Bagaimana tepatnya Anda menambahkan tepi acak tergantung pada jenis grafik yang Anda inginkan.


Faktanya, jika masalahnya hanya memastikan bahwa semua node termasuk dalam grafik yang sama, Anda dapat menggunakan metode generasi acak saat ini (atau yang lainnya), dan menerapkan algoritma Prim di atasnya. Jika Anda ingin membuat perubahan minimal pada grafik hanya untuk memastikan semua subgraf tersambung, Anda dapat mengatur biaya edge ke 0 untuk edge yang sudah ada.

Philip
sumber
Memberi +1 karena ini adalah jawaban yang sangat bagus tetapi saya tidak suka generasi ini sehingga saya akan memikirkan algoritma yang lebih baik dalam beberapa hari mendatang!
Ali1S232
Ya tidak ada jawaban 'benar' untuk ini, saya tertarik untuk melihat apa yang orang lain pikirkan.
Philip
Offtopic, tapi aku juga akan menautkan ke jawabanku! : p
r2d2rigo
Dengan cara ini saya mendapatkan poin untuk itu, ha!
Philip
7

Kendala utama masalah Anda ada dua: membuat grafik 1-terhubung; dan membuatnya dengan koneksi proksimal. Jawaban Philip, meski agak berharga, tidak mengatasi semua kendala masalah Anda

Idealnya, lubang cacing tidak boleh melebihi panjang maksimum dan jika memungkinkan, lubang cacing tidak boleh saling bersilangan.

Ketika Anda secara naif menghubungkan titik-titik dalam cloud, Anda menghadapi risiko (dan yang tinggi, pada saat itu) dari kondisi-kondisi ini yang tidak terpenuhi.

Jadi, Anda lihat, masalahnya bukan konektivitas yang terlalu dekat dengan koneksi itu. Itu sepele untuk menghubungkan setiap node dalam grafik ke setiap node lain, tetapi menghubungkan hanya untuk mereka yang terdekat sambil mempertahankan 1-keterhubungan dari keseluruhan grafik sedikit lebih rumit.

Inilah yang menciptakan triangulasi Delaunay , dalam n dimensi. Alasan pertama untuk menggunakan triangulasi Delaunay adalah karena memenuhi kedua hal ini secara implisit. Alasan kedua adalah bahwa jauh lebih mudah untuk bekerja mundur dari grafik seperti itu (mengurangi tepi dan simpul yang tidak Anda inginkan), daripada mencoba membuatnya dengan cara lain.

  1. Buat cloud titik penuh Anda secara acak.
  2. Delaunay-triangulasi itu.
  3. Bangun grafik (koneksi titik). Dalam hal ini, Anda dapat menghasilkan seluruh grafik (setiap bintang) terlebih dahulu, dan kemudian memperoleh grafik sebagai anak di bawah umur yang mewakili daerah yang terhubung dengan wormhole, saat melakukan langkah 4. Atau Anda dapat bekerja sebaliknya, menghasilkan hanya wilayah yang terhubung dengan wormhole pertama sebagai node supergraph, dan kemudian dalam fase kedua, menghasilkan bintang-bintang individu dalam volume yang mengikat daerah tersebut (untuk ini saya akan menurunkan grafik triangulasi Delaunay ganda - diagram Voronoi dalam 3 dimensi) sebagai subgraph. Sekarang Anda memiliki kluster bintang yang terhubung secara proksimal, dan semua kluster terhubung oleh lubang cacing yang lebih jarang: topologi dan topografi Anda masuk akal bagi pemain.
  4. Terapkan metode cerdas untuk membentuk super dan subgraf, tergantung pada bagaimana Anda memilih untuk memperlakukannya di langkah 3.

Sangat penting untuk melihat bahwa ini adalah proses hierarkis. Penawaran tingkat pertama dengan konektivitas wormhole; penawaran kedua dengan jarak mungkin dapat dilalui menggunakan pengandar kapal standar. Anda dapat menerapkan Delaunay di satu atau kedua level untuk memenuhi kendala Anda.

Melakukan hal ini secara topologis murni akan meninggalkan Anda dengan lubang cacing yang tidak masuk akal, karena mereka mungkin menghubungkan satu sisi galaksi ke yang lain, terlepas dari kepadatan bintang yang tinggi di antara beween (dan mungkin bahkan jatuh pada rute langsung lubang cacing). Topologi bukan topografi; yang terakhir adalah pertimbangan atas dan di atas yang pertama. Anda prihatin dengan kedekatan dan dengan demikian topografi.

Insinyur
sumber
Delaunay triangulasi adalah ide yang bagus, tetapi tidak menciptakan tepi acak. Anda dapat menghapus tepian secara acak dari tepian yang dibuat oleh triangulasi Delaunay, tetapi Anda akan berisiko mengambil grafik terpisah lagi ...
bummzack
@Bummzack "Itu tidak membuat tepi acak". Pernah mendengar grafik di bawah umur? Setelah Anda memiliki kendala yang lebih sulit diselesaikan menggunakan Delaunay, itu sepele untuk melakukan penambahan atau penghapusan pada grafik yang Anda inginkan.
Insinyur
@Bummzack, saya baru saja memperbaruinya lagi - terima kasih atas umpan baliknya.
Insinyur