Saya menerapkan algoritme pembatalan siklus untuk menemukan solusi optimal untuk masalah aliran biaya minimum. Dengan menemukan dan menghilangkan siklus biaya negatif dalam jaringan residual, total biaya diturunkan di setiap putaran. Untuk menemukan siklus negatif saya menggunakan algoritma bellman-ford.
Masalah saya adalah: Bellman-ford hanya menemukan siklus yang dapat dijangkau dari sumbernya, tetapi saya juga perlu menemukan siklus yang tidak dapat dijangkau.
Contoh: Di jaringan berikut, kami sudah menerapkan aliran maksimum. Tepi membuatnya sangat mahal. Dalam jaringan residual, kami memiliki siklus biaya negatif dengan kapasitas . Menghapus itu, akan memberi kita solusi yang lebih murah menggunakan tepi dan , tapi kita tidak dapat mencapai itu dari sumber .
Label: Aliran / Kapasitas, Biaya
Tentu saja, saya bisa menjalankan Bellman-ford berulang kali dengan setiap node sebagai sumber, tetapi itu tidak terdengar seperti solusi yang baik. Saya agak bingung karena semua kertas yang saya baca sepertinya melewati langkah ini.
Dapatkah Anda memberi tahu saya, bagaimana cara menggunakan bellman-ford untuk menemukan setiap siklus negatif (dapat dicapai atau tidak)? Dan jika tidak memungkinkan, algoritma lain apa yang Anda usulkan?
sumber
Jawaban:
Untuk memperluas komentar saya, ingatlah, algoritma ini untuk menemukan Min-Cost-Flow bergantung pada fakta ituf maksimal. Dengan pertama menjalankan Ford-Fulkerson untuk menemukanf dan jaringan residual yang dihasilkan Gf , biaya f kemudian dikurangi dengan menemukan siklus negatif di Gf . Yaitu, dengan menemukan siklus negatif diGf kami tidak mengubah jumlah aliran, f , tetapi hanya biaya.
Sekarang dengan menjalankan Bellman-Ford darit di Gf kita dapat melacak mundur pada tepi yang memiliki aliran non-negatif (menurut definisi Gf ). Jika siklus berbatasan dengan setiap tepi di jalur ini, maka kita dapat "mentransfer" sejumlah aliran ke tepi lain dalam siklus. Dengan kata lain, kami menjaga aliran-net untuk beberapa siklus yang sama, tetapi dapat mengubah biaya.
Perhatikan siklus yang tidak dapat dijangkau darit harus memiliki aliran nol. Kalau tidak, kita akan memiliki kontradiksi dif menjadi maksimal.
Saya minta maaf atas "tangan bergelombang" penjelasan ini. Saya akan mencoba menjadi lebih formal ketika saya punya waktu malam ini.
sumber
Saran saya: Anda harus memulai algoritme dari T, untuk menemukan siklus negatif di jaringan residu Anda. Hasilnya harus sama, tetapi kemudian Anda dapat mencapai lingkaran
sumber
Saya pikir itu tidak cukup untuk menjalankan Bellman-Ford dari T atau S. Pertimbangkan satu contoh di mana ada satu sisi dari S ke T dan satu siklus biaya negatif tidak dapat dicapai dari S atau T.
Salah satu solusinya adalah menambahkan auxiliary S 'dan menambahkan edge dari S' ke vertex lain dengan biaya 0. Kemudian jalankan Bellman-Ford dari S '. Dengan cara ini, semua siklus negatif dapat dicapai dari S '.
Selain itu, Anda tidak benar-benar perlu menambahkan titik bantu S dalam implementasi Anda. Inisialisasi saja d (v) = 0 untuk sembarang simpul v.
Lihat bagaimana Boost Graph Library menerapkannya.
sumber