Saya menerapkan algoritma Bron-Kerbosch di Clojure untuk proyek kelas dan mengalami beberapa masalah. Masalahnya terletak pada baris terakhir algoritma
BronKerbosch1(R, P, X):
if P and X are both empty:
report R as a maximal clique
for each vertex v in P:
BronKerbosch1(R ⋃ {v}, P ⋂ N(v), X ⋂ N(v))
P := P \ {v} ;This line
X := X ⋃ {v} ;This line
Saya tahu di Clojure tidak ada arti "set x = sesuatu". Tapi tahukah Anda ada fungsi assoc
yang menurut saya serupa. Saya ingin tahu apakah assoc
sesuai untuk menyelesaikan implementasi saya.
Dalam implementasi saya, grafik direpresentasikan seperti itu
[#{1 3 2} #{0 3 2} #{0 1 3} #{0 1 2}]
Dimana node ke-0 direpresentasikan sebagai himpunan pertama dalam vektor, dan nilai dalam himpunan tersebut mewakili tepi ke node lainnya. Sehingga di atas mewakili grafik dengan 4 node yang lengkap (semua node terhubung ke semua node lainnya).
Sejauh ini implementasi algoritma saya adalah
(defn neighV [graph, v]
(let [ret-list (for [i (range (count graph)) :when (contains? (graph i) v)] i)]
ret-list))
(defn Bron-Kerbosch [r, p, x, graph, cliques]
(cond (and (empty? p) (empty? x)) (conj cliques r)
:else
(for [i (range (count p))]
(conj cliques (Bron-Kerbosch (conj r i) (disj p (neighV graph i) (disj x (neighV graph i)) graph cliques)))
)))
Jadi saat ini saya terjebak dalam mengubah p
dan x
sesuai algoritma. Saya rasa saya dapat menggunakan assoc
untuk melakukan ini tetapi menurut saya ini hanya berlaku untuk peta. Apakah mungkin untuk digunakan, bisakah seseorang merekomendasikan fungsi lain?
assoc
sebenarnya bukanmap a = something
, ia mengembalikan peta baru dengan menyertakan pasangan K/V yang diubah atau ditambahkan. Jadi jika memang adaassoc
untuk set, melakukan(assoc someSet 2)
tidak akan mengubah someSet, Anda hanya akan memiliki set baru. - person t_scho   schedule 28.03.2015for
perlu diubah menjadireduce
atauloop
sehingga setiap langkah melihat nilai yang diperbarui. - person noisesmith   schedule 28.03.2015