Anda dapat menggunakan set
(dalam arti kata matematika, yaitu koleksi yang tidak dapat berisi duplikat) untuk menyimpan status yang sudah Anda lihat. Operasi yang harus Anda lakukan untuk ini adalah:
- memasukkan elemen
- menguji apakah elemen sudah ada di sana
Hampir setiap bahasa pemrograman harus sudah memiliki dukungan untuk struktur data yang dapat melakukan kedua operasi ini dalam waktu konstan ( ). Sebagai contoh:O ( 1 )
set
dalam Python
HashSet
di Jawa
Pada pandangan pertama, sepertinya menambahkan semua status yang pernah Anda lihat ke perangkat seperti ini akan memakan banyak memori, tapi itu tidak terlalu buruk dibandingkan dengan memori yang sudah Anda butuhkan untuk perbatasan Anda; jika faktor percabangan Anda adalah , batas Anda akan tumbuh sebesar b - 1 elemen per simpul yang Anda kunjungi (hapus 1 simpul dari perbatasan untuk "mengunjungi" itu, tambahkan b penerus / anak baru), sedangkan set Anda hanya akan bertambah 1 tambahan simpul per simpul yang dikunjungi.bb - 11b1
Dalam pseudocode, himpunan seperti itu (sebut saja closed_set
, agar konsisten dengan pseudocode pada wikipedia dapat digunakan dalam Pencarian Pertama-Luas sebagai berikut:
frontier = First-In-First-Out Queue
frontier.add(initial_state)
closed_set = set()
while frontier not empty:
current = frontier.remove_next()
if current == goal_state:
return something
for each child in current.generate_children()
if child not in closed_set: // This operation should be supported in O(1) time regardless of closed_set's current size
frontier.add(child)
closed_set.add(current) // this should also run in O(1) time
(beberapa variasi pseudocode ini mungkin bekerja juga, dan menjadi lebih atau kurang efisien tergantung pada situasinya; misalnya, Anda juga dapat mengambil closed_set
untuk memuat semua node yang telah Anda tambahkan anak-anak ke perbatasan, dan kemudian sepenuhnya menghindari generate_children()
panggilan jika current
sudah ada di closed_set
.)
Apa yang saya jelaskan di atas akan menjadi cara standar untuk menangani masalah ini. Secara intuitif, saya menduga "solusi" yang berbeda bisa dengan selalu mengacak urutan daftar negara penggantinya baru sebelum menambahkannya ke perbatasan. Dengan cara ini, Anda tidak terhindar dari masalah sesekali menambahkan status yang sebelumnya sudah Anda kembangkan ke perbatasan, tapi saya pikir itu seharusnya secara signifikan mengurangi risiko terjebak dalam siklus tak terbatas.
Hati-hati : Saya tidak tahu ada analisis formal dari solusi ini yang membuktikan bahwa ia selalu menghindari siklus tak terbatas. Jika saya mencoba "menjalankan" ini di kepala saya, secara intuisi, saya curiga ini seharusnya bekerja, dan tidak memerlukan memori tambahan. Mungkin ada kasus tepi yang saya tidak pikirkan sekarang, jadi itu juga mungkin tidak berfungsi, solusi standar yang dijelaskan di atas akan menjadi taruhan yang lebih aman (dengan biaya lebih banyak memori).