Sobes.tech
Junior

Kas yra godus algoritmas ir kokiais atvejais jis taikomas?

sobes.tech AI

Atsakymas iš AI

Žadinis algoritmas — tai požiūris į optimizavimo užduočių sprendimą, kuris kiekvienu žingsniu pasirenka geriausią vietinį sprendimą (pelningiausią pagal dabartinį momentą variantą) tikėdamasis, kad ši optimalių vietinių sprendimų seka veda prie globaliai optimalaus sprendimo. Jis neatsižvelgia į galimus dabartinio pasirinkimo padarinius būsimuose žingsniuose.

Savybės:

  • Paprastumas: Paprastai įgyvendinamas lengviau nei dinaminis programavimas ar kitos optimizavimo metodikos.
  • Greitis: Dažnai turi mažesnę skaičiavimo sudėtingumą.
  • Optimumo garantija: Ne visada garantuoja, kad rasite globaliai optimalų sprendimą. Garantija taikoma tik tam tikroms užduočių klasėms.

Naudojamas užduotyse, kur įrodyta, kad kiekvieno žingsnio vietinis optimalus pasirinkimas veda prie globaliai optimalios sprendimo. Pavyzdžiai:

  • Veiklos pasirinkimo užduotis (Activity Selection Problem): Maksimalus veiklų skaičius, kurios nesikerta laike.
  • ** Kuprinė (kai galima dalyti daiktus):** Kai daiktus galima dalyti. Jei ne, tai dinaminio programavimo užduotis.
  • Prim ir Kruskal algoritmai: Minimalių apibrėžtinių medžių paieškai grafe.
  • Dijkstro algoritmas: Kelio paieškai grafe su ne neigiamais svoriais.
  • Huffmano kodavimas: Optimalios prefiksinės kodavimo schemos kūrimui.

Pavyzdinis pseudokodo pavyzdys veiklos pasirinkimo algoritmui:

Function SelectActivities(activities):
  Sort activities by finish time
  selected_activities = empty list
  last_finish_time = 0

  For each activity in activities:
    If activity.start_time >= last_finish_time:
      Add activity to selected_activities
      last_finish_time = activity.finish_time

  Return selected_activities

Svarbu patikrinti, ar žadinis algoritmas tinkamas konkrečiai užduočiai, nes priešingu atveju jis gali duoti suboptimalius sprendimus.

# Paprastas pavyzdys užduoties, kur žadinis algoritmas nėra optimalus
# Monetų išdavimo užduotis: išduoti mažiausią monetų skaičių
# Prieinamos monetos: [1, 5, 10, 25] USD
# Išduoti: pavyzdžiui, 30 centų

# Žadinis algoritmas:
# Imame didžiausią monetą <= 30 (25) -> likutis 5
# Imame didžiausią monetą <= 5 (5) -> likutis 0
# Rezultatas: 2 monetos (25 + 5). Čia tai optimalu.

# Prieinamos monetos: [1, 6, 10]
# Išduoti: 12 centų

# Žadinis algoritmas:
# Imame didžiausią monetą <= 12 (10) -> likutis 2
# Imame didžiausią monetą <= 2 (1) -> likutis 1
# Imame didžiausią monetą <= 1 (1) -> likutis 0
# Rezultatas: 3 monetos (10 + 1 + 1).
# Optimumas: 2 monetos (6 + 6).

# Šis pavyzdys rodo, kad žadinis algoritmas ne visada pasiekia globalų optimalų,
# jei užduoties savybės neatitinka jo taikymo galimybių (pavyzdžiui,
# standartiniai nominalai dažnai leidžia žadiniam algoritmui,
# bet atsitiktiniai nominalai — ne).