Menemukan Jalur Semua Sisi pada Grafik

Saya mencoba mendapatkan jalur pada grafik yang mencakup semua sisi, dan hanya melintasinya sekali. Ini berarti hanya akan ada dua titik "akhir" - yang memiliki jumlah simpul terpasang ganjil. Titik akhir ini akan memiliki satu sisi penghubung, atau menjadi bagian dari satu lingkaran dan memiliki 3 koneksi.

Jadi dalam kasus sederhana di bawah ini saya perlu melintasi node dalam urutan ini 1-2-3-4-5 (atau 5-4-3-2-1):

sederhana

Dalam kasus yang lebih rumit, jalurnya adalah 1-2-3-4-2 (atau 1-2-4-3-2):

--grafik

Di bawah ini juga merupakan grafik yang valid, dengan 2 titik akhir: 1-2-4-3-2-5

kompleks

Saya telah mencoba mencari nama algoritme untuk menyelesaikan ini, dan mengira itu adalah "Masalah Tukang Pos Tiongkok", tetapi menerapkannya berdasarkan kode di https://github.com/rkistner/chinese-postman/blob/master/postman.py tidak memberikan hasil yang saya harapkan .

Jalur Euler terlihat hampir seperti yang dibutuhkan, tetapi implementasi networkx hanya akan berfungsi untuk jaringan tertutup (loop).

Saya juga melihat Jalur Hamilton - dan mencoba algoritme networkx - tetapi jenis grafiknya tidak didukung.

Idealnya saya ingin menggunakan Python dan networkx untuk mengimplementasikan ini, dan mungkin ada solusi sederhana yang sudah menjadi bagian dari perpustakaan, tapi sepertinya saya tidak dapat menemukannya.


person geographika    schedule 10.03.2017    source sumber
comment
Jalur Hamilton mencakup semua simpul, Anda mungkin ingin memeriksa Jalur Euler yang mencakup bagian tepinya. GeeksForGeeks tampaknya memiliki contoh implementasi untuk Python.   -  person niemmi    schedule 10.03.2017
comment
@niemmi - terima kasih! Sepertinya Euler trai (bukan sirkuit) adalah istilah yang saya cari. Saya akan melihat algoritmenya dan melihat apakah algoritme tersebut dapat disederhanakan menggunakan metode networkx yang ada.   -  person geographika    schedule 10.03.2017
comment
@niemmi Benar, Anda juga bisa menjadikannya jawaban dengan menambahkan tautan yang sesuai..   -  person Abhishek Jebaraj    schedule 10.03.2017
comment
Ini dikenal sebagai Jalur Euler dari sebuah grafik. Sekarang telah ditambahkan ke networkx sebagai eulerian_path()< /a>.   -  person iacob    schedule 08.04.2021


Jawaban (2)


Anda sedang mencari Jalur Euler yang mengunjungi setiap edge tepat satu kali. Anda dapat menggunakan Algoritme Fleury untuk menghasilkan jalur. Algoritme Fleury memiliki kompleksitas waktu O(E^2), jika Anda memerlukan algoritme yang lebih efisien, periksa Algoritma Hierholzer yang merupakan O(E) sebagai gantinya.

Ada juga permintaan penarikan yang tidak digabungkan untuk pustaka networkx yang mengimplementasikan ini. sumber mudah digunakan.

(Untuk jaringanx 1.11 .edge harus diganti dengan .edge_iter).

person niemmi    schedule 10.03.2017
comment
Setelah saya yakin dengan nama tipe jalur yang saya cari, saya dapat menemukan implementasi di networkx - person geographika; 10.03.2017
comment
Catatan: permintaan penarikan tersebut telah ditutup karena ada masalah mendasar dengan implementasi algoritma pencarian jalur di dalamnya. - person iacob; 21.04.2019

Ini dikenal sebagai Jalur Euler dari sebuah grafik. Sekarang telah ditambahkan ke NetworkX sebagai eulerian_path()< /a>.

person iacob    schedule 26.03.2021