mohó algoritmus
Kiejtés
- IPA: [ ˈmoɦoːɒlɡoritmuʃ]
Főnév
Mohó algoritmus
A mohó algoritmus egy optimalizálási megközelítés, amely mindig azt a lépést választja, amely az adott pillanatban a legjobb helyi megoldást nyújtja, abban a reményben, hogy ez a választás a teljes problémára is optimális megoldást eredményez.
Jellemzők
- Helyi optimalizáció:
- A döntéseket lépésről lépésre, helyi információ alapján hozza meg.
- Globális optimalizációra való törekvés:
- A mohó választások sorozatából állítja össze a végső megoldást.
- Egyszerűség:
- Az algoritmus könnyen implementálható és gyors.
Előnyök:
- Gyors végrehajtás: gyakran (O(n n)) vagy (O(n)) bonyolultság.
- Könnyű implementáció.
Hátrányok:
- Nem minden probléma esetén működik optimálisan.
- Bizonyos problémák esetén a helyi optimum nem vezet a globális optimumhoz.
Általános működés
- Kezdj egy üres megoldással.
- Iteratívan válaszd ki a legjobb lehetséges elemet, amely kielégíti a feltételeket.
- Ismételd a folyamatot, amíg nem található további lépés.
Példák
1. Hátizsák probléma (töredékes verzió)
Probléma:
Adott (n) tárgy, mindegyiknek van egy súlya és értéke. A cél, hogy maximalizáljuk az értéket egy (W) kapacitású hátizsákban. Az egyes tárgyak töredékekben is elhelyezhetők.
Mohó stratégia:
- Mindig azt a tárgyat válaszd ki, amelynek a legnagyobb az (érték / súly) aránya.
Pszeudokód:
function FractionalKnapsack(weights, values, capacity): Rendezés csökkenő (value / weight) arány szerint. total_value = 0 minden tárgy w, v: ha w <= capacity: total_value += v capacity -= w különben: total_value += v * (capacity / w) térj vissza total_value
Python implementáció:
def fractional_knapsack(weights, values, capacity):
items = sorted(zip(weights, values), key=lambda x: x[1]/x[0], reverse=True)
total_value = 0
for weight, value in items:
if capacity >= weight:
total_value += value
capacity -= weight
else:
total_value += value * (capacity / weight)
break
return total_value
# Példa használat
weights = [10, 20, 30]
values = [60, 100, 120]
capacity = 50
print(f"Maximális érték: {fractional_knapsack(weights, values, capacity)}")
Kimenet:
Maximális érték: 240.0
2. Érmecsere probléma
Probléma:
Adj vissza egy adott összegű pénzt a lehető legkevesebb érme használatával, adott érmecímletekkel.
Mohó stratégia:
- Mindig a legnagyobb címletű érmét válaszd ki, amely kisebb vagy egyenlő az adott összeggel.
Pszeudokód:
function CoinChange(coins, amount): coins.sort(descending) result = 0 minden érme c in coins: ha amount == 0: térj vissza result result += amount // c amount %= c ha amount > 0: térj vissza "Nincs megoldás"
Python implementáció:
def coin_change(coins, amount):
coins = sorted(coins, reverse=True)
result = 0
for coin in coins:
if amount == 0:
break
result += amount // coin
amount %= coin
if amount > 0:
return -1 # Nincs pontos megoldás
return result
# Példa használat
coins = [1, 5, 10, 25]
amount = 63
print(f"Minimális érmék száma: {coin_change(coins, amount)}")
Kimenet:
Minimális érmék száma: 6
3. Intervallum ütemezés
Probléma:
Adott (n) intervallum (kezdési és befejezési időpontokkal). A cél a maximális számú, egymást nem átfedő intervallum kiválasztása.
Mohó stratégia:
- Mindig azt az intervallumot válaszd ki, amely a legkorábban ér véget, de nem ütközik az eddig kiválasztott intervallumokkal.
Pszeudokód:
function IntervalScheduling(intervals): Rendezés növekvő befejezési idő szerint. selected = [] last_end = -∞ minden intervallum i in intervals: ha i kezdési idő > last_end: add i-t a selected listához last_end = i befejezési idő térj vissza selected
Python implementáció:
def interval_scheduling(intervals):
intervals = sorted(intervals, key=lambda x: x[1]) # Befejezési idő szerint rendezve
selected = []
last_end = float('-inf')
for start, end in intervals:
if start >= last_end:
selected.append((start, end))
last_end = end
return selected
# Példa használat
intervals = [(1, 3), (2, 5), (4, 7), (6, 9), (8, 10)]
print(f"Kiválasztott intervallumok: {interval_scheduling(intervals)}")
Kimenet:
Kiválasztott intervallumok: [(1, 3), (4, 7), (8, 10)]
Összegzés
A mohó algoritmusok hatékony megoldást nyújtanak sok optimalizálási problémára, ha: - A probléma rendelkezik az optimális almotívum tulajdonságával (az optimális megoldás részmegoldásokból épül fel). - A probléma mohó tulajdonsága biztosítja, hogy a helyi döntések összeállnak egy globálisan optimális megoldássá.
Előnyök: - Gyors, egyszerű algoritmusok. - Jó közelítő megoldásokat adhat még akkor is, ha a globális optimumot nem garantálja.
Hátrányok: - Nem minden probléma oldható meg optimálisan mohó módszerekkel. - Bizonyos esetekben a helyi optimum nem vezet globális optimumhoz.
Fordítások
- angol: greedy algorithm (en)
- orosz: жадный алгоритм (ru) (žadnyj algoritm)
- mohó algoritmus - Értelmező szótár (MEK)
- mohó algoritmus - Etimológiai szótár (UMIL)
- mohó algoritmus - Szótár.net (hu-hu)
- mohó algoritmus - DeepL (hu-de)
- mohó algoritmus - Яндекс (hu-ru)
- mohó algoritmus - Google (hu-en)
- mohó algoritmus - Helyesírási szótár (MTA)
- mohó algoritmus - Wikidata
- mohó algoritmus - Wikipédia (magyar)