|
hakkas siis selline probleem huvitama nagu seda on "knapsack problem", uurisin siis netist, kuidagi sain aru miskit aga nagu miskit jäi puudu kah..
küsimus siis selles, et dünaamiliselt töötav algorithm ei suuda leida õiget vastust 24, samas, kuulsin, et see oli NP-complete probleem seega ta ei annagi alati õiget vastust(parandage kui eksin).. samas saan aru kah miks ta ei leidnud, rekursiivse lahenduse juures ta teeb koti väiksemaks item.weight'i poolest aga dünaamilises me lihtsalt proovime kõik $cap variandid läbi(1-17).. igaks juhuks tahtsin üle küsida, kui keegi kogenum viitsiks koodi vaadata :), äkki lihtsalt ma olen teinud dünaamilise lahenduse valesti? ps, kuidas siia foorumisse koodi kopeerida ilma, et peaks enne htmlentitiesit kasutama :P? |
|
Seljakoti ülesande DP algoritm töötab eeldusel, et kaalud on viisakas suuruses täisarvud. NP-täielik (raske) on ülesanne suvaliste kaalude korral. Mõlemad algoritmid nii DP kui variantide läbivaatus annavad (korrektselt realiseerituna) täpselt sama vastuse. Küsimus on lihtsalt kuluvas ajas. Dünaamlise lahenduse ajaline keerukus on O(n * W), kus n on esemete arv ja W on maksimaalne kaal st. ideeks on igale võimalikule kogukaalule püüda liita kõiki esemeid, säilitades iga kaalu jaoks maksimaalse summa. Oluline on tähele panna, et seljakotti pandavate asjade tüübi järgi jaguneb ülesanne omakorda kaheks: igat asja on piiramatus koguses (tehniliselt lihtsam juht) või täpselt üks (täiendavad komplikatsioonid ja mälukulu, kuid ajaline keerukus sama) http://en.wikipedia.org/wiki/Knapsack_problem#Dynamic_programming_solution Koodi osas võib öelda, et kindlasti on vigane, kuna töötab valesti :-) |
|
Kuna pole aru saada, kas sigamozarti vastus oli piisav, panen igaks juhuks välja ka töötava DP lahenduse:
|
|
Selgituseks niipalju, et iga NP((N)ondeterministic (P)olynomial time) lahendatavat probleemi ei saa lahendada P-s(deterministic (P)olynomial time). Ehk siis deterministlikult ja polünomiaalse ajaga. Probleem kuhu iga NP probleemi annab polünomiaalse ajaga algoritmiga taandada on NP-raske. Kui algoritm lahendab NP-raske probleemi, siis saab sellega ka NP probleemi lahendada. NP-raske probleem võib kuuluda ka NP klassi aga ei pea ilmtingimata. Koolikoti ja rändkaupmehe probleemid on NP-rasked ja samas ka NP klassi kuuluvad. Selle tõttu saab mõlemat neist redutseerida polünomiaalse ajaga algoritmiga teiseks. Probleem, mis on NP-raske ja samas ka NP on NP-täielik. Kui sa leiad polünomiaalse ajaga algoritmi NP-täieliku probleemi jaoks tähendab see automaatselt, et P ja NP klassid on võrdsed. Põhimõtteliselt kui sa teed koolikoti probleemi jaoks algoritmi mitte-deterministlikult ja determineerid selle siis saad eksponentsiaalselt suureneva lahenduse, mida ei aita ka minimiseerimise algoritm, mis ikka jookseb polünomiaalse ajaga. Ka on olemas optimiseerimise meetodid, mis suudavad maksimaalset vastuvõetavat N väärtust, mille korral lahenduse otsimine ei ole liiga kulukas, edasi nihutada. Need meetodid kärbivad lahenduseruumis otsimise suundade arvu. (Näiteks Branch and Bound(B&B)). See ei tähenda, et puudub algoritm leidmaks ligilähedane lahendus. Väga huvitav probleem igaljuhul. Lisaks selle selgituse juurde omakorda täpsustuse, et NP-täielik on seljakotiülesande üldine, suvaliste kaaludega variant. Mitte liiga suurte täisarvuliste kaalude korral on tegemist erijuhuga, mille lahendamiseks on teada ka efektiivsemaid algoritme kui kõigi variantide läbivaatus (näiteks dünaamiline planeerimine, kusjuures korrektselt programmeeritud DP lahendus annab täpse vastuse, mitte ligikaudse lähendi).
(Jan 01 '10 at 14:26)
Ahto Truu ♦♦
|
|
Kas keegi viitsiks üle vaadata selle? enam-vähem töötab:
Võiks oma lahendust ikka ise vähemalt korra proovida enne teistele testida andmist...
(Jan 28 '11 at 23:18)
Ahto Truu ♦♦
Et kriitika oleks vähe konstruktiivsem, võtame näiteks sellise minimaalse näite: koti kandevõime 3, esemeid 1, esimese kaal 3 ja väärtus ka 3. Väljund tuleb: "Kaal 3; Maksumus 3, esemeid 1, kaaluga 0". Aga eset kaaluga 0 sisendis ei ole ju.
(Jan 29 '11 at 11:04)
Ahto Truu ♦♦
|

Viimase küsimuse kohta: kasuta