Buat grafik terarah secara acak di kotak

11

Saya mencoba membuat grafik yang diarahkan secara acak untuk tujuan membuat game puzzle yang mirip dengan teka-teki luncur es dari Pokemon.
Ini pada dasarnya adalah apa yang ingin saya hasilkan secara acak: http://bulbanews.bulbagarden.net/wiki/Crunching_the_numbers:_Graph_theory .

Saya harus dapat membatasi ukuran grafik dalam dimensi x dan y. Dalam contoh yang diberikan dalam tautan, itu akan dibatasi ke kisi 8x4.
Masalah yang saya hadapi bukanlah menghasilkan grafik secara acak, tetapi menghasilkan grafik secara acak, yang dapat saya petakan dengan benar dalam ruang 2d, karena saya membutuhkan sesuatu (seperti batu) di sisi yang berlawanan dari sebuah simpul, untuk membuatnya secara visual masuk akal ketika Anda berhenti meluncur. Masalah dengan ini adalah bahwa kadang-kadang batu berakhir di jalur antara dua node lain atau mungkin pada node lain itu sendiri, yang menyebabkan seluruh grafik menjadi rusak.

Setelah membahas masalah tersebut dengan beberapa orang yang saya kenal, kami sampai pada beberapa kesimpulan yang mungkin mengarah pada solusi.

  • Termasuk hambatan di grid sebagai bagian dari grafik saat membangunnya.
  • Mulailah dengan kisi yang terisi penuh dan gambarkan jalur acak dan hapus blok yang akan membuat jalur itu berfungsi.

Masalahnya kemudian menjadi mencari tahu yang mana yang akan dihapus untuk menghindari memperkenalkan jalur tambahan yang lebih pendek. Kami juga berpikir algoritma pemrograman dinamis mungkin bermanfaat, meskipun tidak ada di antara kita yang terlalu terampil membuat algoritma pemrograman dinamis dari nol. Setiap ide atau referensi tentang apa masalah ini secara resmi disebut (jika ini merupakan masalah grafik resmi) akan sangat membantu.

Berikut adalah beberapa contoh dari apa yang telah saya capai sejauh ini dengan hanya menempatkan blok secara acak dan menghasilkan grafik navigasi dari awal / akhir yang dipilih. Idenya (seperti yang dijelaskan dalam tautan sebelumnya) adalah Anda mulai dari S hijau dan ingin sampai ke F. hijau. Anda melakukan ini dengan bergerak ke atas / bawah / kiri / kanan dan Anda terus bergerak ke arah yang dipilih sampai Anda menekan dinding. Dalam gambar-gambar ini, abu-abu adalah dinding, putih adalah lantai, dan garis ungu adalah panjang minimum dari awal hingga akhir, dan garis-garis hitam dan titik-titik abu-abu mewakili jalur yang mungkin.

Berikut adalah beberapa contoh grafik yang dihasilkan secara acak:

masukkan deskripsi gambar di sini

Berikut adalah beberapa contoh grafik yang dihasilkan secara acak (atau tweak tangan):

masukkan deskripsi gambar di sini

Saya juga sepertinya memperhatikan yang lebih menantang ketika benar-benar memainkan ini sebagai puzzle adalah puzzle yang memiliki banyak node tingkat tinggi di sepanjang jalur minimum.

Talon876
sumber
1
Anda dapat menghasilkan set batuan yang benar-benar acak, lalu periksa apakah grafik yang sesuai memiliki solusi, dan jika tidak, maka buang dan mulai lagi dari awal. Dengan kisi 8x4 ini tidak bisa selama itu. Saya yakin ada solusi yang lebih bersih.
Ayub
Ini adalah pendekatan pertama saya, tetapi saya perlu melakukannya dalam skala yang sedikit lebih besar dan dengan kasar memaksa itu tampaknya perlu waktu dan mencoba untuk menemukan pendekatan yang lebih baik.
Talon876

Jawaban:

2
  • itu es, Anda akan bergerak kecuali jika Anda menabrak batu.
  • satu-satunya cara untuk mengubah arah adalah dengan memukul batu.
  • jika Anda menabrak batu, Anda harus mengubah arah.
  • siklus itu baik, untuk alasan yang jelas.
  • mungkin ada beberapa awal, dan beberapa ujung.

properti yang lebih maju:

  • sel-sel tanpa batu yang berdekatan tidak dapat dijangkau (beberapa dapat dilintasi)
  • dinding adalah batu juga, jika Anda menghapusnya, Anda dapat memutuskan untuk membungkus.
  • Anda dapat menggunakan sub-grid sebagai pola ("ubin" 3x3, 3x4, 5x5, ... dll)
  • Anda dapat melapisi ubin MxN puzzle di atas area MxN yang tidak dapat dilalui dan menambahkan batu untuk mengarahkan ulang masuk / keluarnya.
  • rotasi atau simetri ubin bisa menarik
  • Anda dapat memperluas ubin dengan menyisipkan baris / kolom es

contoh:

S=start, E=end, o=rock, .=ice

3 . 2 o        3 . . 2 o         . . . . . o o
4 . . E   ~=   4 . . . E   ~=    . . . . . 2 E
o . . .        o . . . .         . . . . . . .
S . 1 o        S . . 1 o         S . . . . 1 o

contoh menggabungkan ubin:

3 . . 2 o       o 2 . . 3      3 . . 2 o 7 . . 6
4 . . . E   +   E . . . 4  =   4 . . . . . . . 5
o . . . .       . . . . o      o . . . . . . . o
S . . 1 o       o 1 . . S      S . . 1 o 8 . . E

Anda mungkin menyukai game Tsuro , ia menggunakan ubin untuk menghasilkan papan acak.

tidak tahu
sumber
0

Mungkin reverse engineering bisa membantu Anda jika Anda siap untuk itu.

Jika ada satu dan hanya satu solusi untuk setiap masalah, Anda mungkin dapat membuat grafik berdasarkan jawaban unik. Ini tidak mengharuskan Anda untuk melakukan pemrograman dinamis atau bahkan melewatkan brute force dan memilih generasi yang metodis.

Anda dapat melakukannya dengan:

  1. Menyiapkan grafik MxN
  2. membuat satu / beberapa solusi
  3. membuat pertanyaan di sekitarnya jika itu adalah masalah solusi tunggal
  4. jika ada beberapa solusi untuk masalah ini, maka Anda dapat mengulangi prosedur di atas dengan cara sehingga iterasi saat ini tidak menghambat solusi lain.

Meskipun Anda perlu perangkat cara sesuai dengan kompleksitas masalah dan ukuran masalah yang akan menghasilkan pertanyaan ini untuk Anda. Jangan hanya melakukan kekerasan. Cobalah beberapa algoritma acak sebagai gantinya. Ini bisa membantu Anda.

c0da
sumber
Saya tahu saya akan menyesal menjual kembali buku itu tahun lalu, saya pikir salah satu teman saya memilikinya di suatu tempat. Adakah algoritma khusus di sana yang harus saya cari? Atau lihat semua grafik dengan grafik dan lihat apakah saya dapat menemukan grafik yang terlihat bermanfaat? Oh dan ada satu solusi optimal (saya kira mungkin ada ikatan untuk itu) dan solusi lain yang tak terbatas karena Anda bisa bolak-balik antara dua node beberapa kali dan kemudian menyelesaikannya.
Talon876
0

Bagaimana dengan pendekatan lain? Mulai dengan labirin kosong dan tambahkan blok seperti ini:

  1. Secara acak memulai blok dan mengakhiri blok.
  2. Buat 1-3 langkah "geser" dalam arah acak (tetapi tidak kembali) dan dengan panjang acak (*). Tempatkan blok setelah setiap langkah (untuk menghentikan slide).
  3. Temukan jalur terpendek ke pintu keluar. Jika ada terlalu sedikit segmen (kesulitan tingkat rendah), ambil segmen acak dari jalur tersebut dan bagi dengan blok. Jika tidak, letakkan blok seperti pada langkah 1 dan keluar.
  4. Ulangi 1 dengan hati-hati (*): ketika Anda memilih panjang langkah geser, buat sehingga blok yang Anda letakkan tidak akan menutup jalur sebelumnya.

Sentuhan akhir: temukan rute terpendek dengan algoritma yang Anda berikan. Catat semua sel yang digunakan dan mulai mengisi sisanya secara acak, setiap kali memastikan rute terpendek tidak menjadi lebih pendek.

Ada peringatan di langkah kedua, ketika Anda tidak dapat menempatkan blok terakhir sehingga tidak melewati jalur yang digunakan, tapi saya melihat dua solusi untuk ini: pindahkan blok akhir sebelumnya atau membatalkan beberapa langkah dan coba sekali lagi.

Dan pemikiran lain untuk panjang acak langkah geser - Anda mungkin ingin memilihnya sehingga blok yang ditempatkan sebelumnya digunakan kembali, selama jalurnya tidak tumpang tindih.

Tidur
sumber
@ Talon876 Ini adalah jenis algoritma acak yang saya bicarakan.
c0da