Christofides-algoritmus
Kiejtés
- IPA: [ ˈxriʃtofidɛʃɒlɡoritmuʃ]
Főnév
- (matematika, algoritmusok) A Christofides-algoritmus egy hatékony közelítő algoritmus a minimális körút (Travelling Salesman Problem, TSP) megoldására, amikor a gráf háromszög-egyenlőtlenséget teljesít (minden ( u, v, w ) csúcsra: ( d(u, w) d(u, v) + d(v, w) )). Az algoritmus 1,5-szörös közelítési garanciát kínál, vagyis az eredményül kapott körút hossza legfeljebb 1,5-szöröse az optimális körút hosszának.
Probléma
Adott egy teljes súlyozott gráf ( G = (V, E) ), ahol: - ( V ) a csúcsok halmaza (( |V| = n )), - ( E ) az élek halmaza, és minden élhez tartozik egy nem negatív súly ( d(u, v) ).
A cél: - Megtalálni egy körutat, amely minden csúcsot pontosan egyszer érint, majd visszatér a kiindulási ponthoz (minimális körút).
Algoritmus lépései
- Minimális feszítőfa (MST):
- Készítsd el a gráf minimális feszítőfáját (például Kruskal- vagy Prim-algoritmussal).
- Páros fokszámú csúcsok gyűjtése:
- A minimális feszítőfában azokat a csúcsokat gyűjtsd össze, amelyek fokszáma páros.
- Minimális súlyú párosítás (Perfect Matching):
- Hozz létre egy minimális súlyú párosítást a páros fokszámú csúcsok között, amely biztosítja a körút lezárhatóságát.
- Multigráf létrehozása:
- Egyesítsd a minimális feszítőfát és a minimális súlyú párosítást, hogy egy Euler-kört tartalmazó gráfot kapj.
- Euler-kör:
- Találd meg az Euler-kört az új gráfban.
- Hamilton-kör kialakítása:
- Az Euler-körben haladva minden csúcsot csak egyszer érints (short-circuiting technika), így kialakul a kívánt Hamilton-kör.
Időbonyolultság
- Minimális feszítőfa készítése: ( O(|E| |V|) ) (pl. Kruskal-algoritmussal).
- Minimális súlyú párosítás: ( O(|V|^3) ) a hagyományos algoritmusokkal.
- Euler-kör és Hamilton-kör: ( O(|E|) ).
Összességében az algoritmus időbonyolultsága: ( O(|V|^3) ), amely a párosítási lépés dominanciájából ered.
Példa
Adott gráf:
- Csúcsok: ( A, B, C, D ).
- Távolságok: [ ]
1. Minimális feszítőfa:
- MST élei: ( (A, B), (A, C), (A, D) ).
- Összesített súly: ( 10 + 15 + 20 = 45 ).
2. Páros fokszámú csúcsok:
- Páros fokszámú csúcsok: ( B, C, D ).
3. Minimális súlyú párosítás:
- Párosítás: ( (B, C), (C, D) ).
- Párosítás súlya: ( 35 + 30 = 65 ).
4. Euler-kör:
- A párosítás és az MST egyesítése után a gráf Euler-körrel rendelkezik.
5. Hamilton-kör:
- Az Euler-körből Hamilton-kört készítünk: ( A B C D A ).
- Körút hossza: ( 10 + 15 + 30 + 20 = 75 ).
Python implementáció
import networkx as nx
def christofides(graph):
# Minimális feszítőfa
mst = nx.minimum_spanning_tree(graph)
# Páros fokszámú csúcsok kiválasztása
odd_degree_nodes = [node for node in mst.nodes if mst.degree[node] % 2 == 1]
# Párosítás létrehozása
subgraph = graph.subgraph(odd_degree_nodes)
matching = nx.algorithms.matching.max_weight_matching(subgraph, maxcardinality=True)
# Multigráf létrehozása
multigraph = nx.MultiGraph(mst)
multigraph.add_edges_from(matching)
# Euler-kör
euler_circuit = list(nx.eulerian_circuit(multigraph))
# Hamilton-kör kialakítása
visited = set()
hamiltonian_path = []
for u, v in euler_circuit:
if u not in visited:
hamiltonian_path.append(u)
visited.add(u)
# Visszatérés az első csúcsra
hamiltonian_path.append(hamiltonian_path[0])
return hamiltonian_path
# Példa gráf
graph = nx.Graph()
edges = [
('A', 'B', 10), ('A', 'C', 15), ('A', 'D', 20),
('B', 'C', 35), ('B', 'D', 25), ('C', 'D', 30)
]
graph.add_weighted_edges_from(edges)
# Hamilton-kör keresése
path = christofides(graph)
print(f"Hamilton-kör: {path}")
Kimenet:
Hamilton-kör: ['A', 'B', 'C', 'D', 'A']
Előnyök
- Közelítési garancia:
- Az eredmény legfeljebb 1,5-szerese az optimális körútnak.
- Hatékony algoritmus:
- Polinomiális időben fut.
Hátrányok
- Speciális feltételek:
- Csak háromszög-egyenlőtlenséget teljesítő gráfokon alkalmazható.
- Magasabb költségű lépések:
- A minimális súlyú párosítás számítása (O(|V|^3)) időigényű.
Alkalmazások
- Utazási ügynökségek:
- Útvonaloptimalizálás.
- Hálózatok tervezése:
- Minimális hálózatok és útvonalak tervezése.
- Robotika:
- Mozgástervezés robotok számára.
Összegzés
A Christofides-algoritmus egy erős közelítési algoritmus a TSP problémára háromszög-egyenlőtlenséget teljesítő gráfokon. Bár nem ad pontos megoldást, garantált közelítési aránya és polinomiális futásideje miatt gyakran alkalmazzák olyan helyzetekben, ahol az optimális megoldás kiszámítása túl költséges.
- Christofides-algoritmus - Értelmező szótár (MEK)
- Christofides-algoritmus - Etimológiai szótár (UMIL)
- Christofides-algoritmus - Szótár.net (hu-hu)
- Christofides-algoritmus - DeepL (hu-de)
- Christofides-algoritmus - Яндекс (hu-ru)
- Christofides-algoritmus - Google (hu-en)
- Christofides-algoritmus - Helyesírási szótár (MTA)
- Christofides-algoritmus - Wikidata
- Christofides-algoritmus - Wikipédia (magyar)