計(jì)算機(jī)算法設(shè)計(jì)與分析(第6版)-課件 ch0605 0-1背包問(wèn)題_第1頁(yè)
計(jì)算機(jī)算法設(shè)計(jì)與分析(第6版)-課件 ch0605 0-1背包問(wèn)題_第2頁(yè)
計(jì)算機(jī)算法設(shè)計(jì)與分析(第6版)-課件 ch0605 0-1背包問(wèn)題_第3頁(yè)
計(jì)算機(jī)算法設(shè)計(jì)與分析(第6版)-課件 ch0605 0-1背包問(wèn)題_第4頁(yè)
計(jì)算機(jī)算法設(shè)計(jì)與分析(第6版)-課件 ch0605 0-1背包問(wèn)題_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

0-1背包分支限界法01問(wèn)題與模型0-1背包問(wèn)題定義與分支限界框架010-1背包問(wèn)題涉及n件物品,每件物品有重量w和價(jià)值p,背包容量為c。目標(biāo)是選擇若干物品裝入背包,使總價(jià)值最大,同時(shí)總重量不超過(guò)c。每件物品只能選擇裝入或不裝入,決策變量為0或1。問(wèn)題定義02暴力解法通過(guò)枚舉所有可能的物品組合來(lái)尋找最優(yōu)解,時(shí)間復(fù)雜度為O(2^n)。隨著物品數(shù)量n的增加,計(jì)算量呈指數(shù)級(jí)增長(zhǎng),這種方法在實(shí)際應(yīng)用中效率極低,難以處理大規(guī)模問(wèn)題。暴力解法局限03分支限界法通過(guò)系統(tǒng)地搜索子集樹(shù),并利用界函數(shù)剪枝,避免了不必要的搜索,兼顧了搜索的完備性和效率。優(yōu)先隊(duì)列式分支限界法利用最大堆管理活結(jié)點(diǎn),結(jié)點(diǎn)優(yōu)先級(jí)由價(jià)值上界uprofit決定,進(jìn)一步優(yōu)化了搜索過(guò)程。分支限界法優(yōu)勢(shì)子集樹(shù)與結(jié)點(diǎn)結(jié)構(gòu)子集樹(shù)是0-1背包問(wèn)題的搜索空間表示。從根結(jié)點(diǎn)開(kāi)始,左分支代表裝入當(dāng)前物品,右分支代表不裝。逐層展開(kāi),每層結(jié)點(diǎn)對(duì)應(yīng)一種物品的決策狀態(tài)。三層子集樹(shù)可直觀展示搜索過(guò)程。01bbnode和HeapNode是兩種關(guān)鍵結(jié)點(diǎn)結(jié)構(gòu)。bbnode包含parent指針和LChild標(biāo)志,用于維護(hù)樹(shù)結(jié)構(gòu);HeapNode包含uprofit、profit、weight、level和ptr字段,用于最大堆管理和與bbnode的雙向綁定。

02結(jié)點(diǎn)結(jié)構(gòu)子集樹(shù)示意02核心算法上界函數(shù)Bound貪心估算機(jī)制剩余容量計(jì)算上界函數(shù)Bound首先計(jì)算剩余容量cleft=c-cw,其中cw是當(dāng)前已裝入背包的物品總重量。剩余容量用于后續(xù)的貪心估算。整塊裝入與比例填充從當(dāng)前物品開(kāi)始,按照單位重量?jī)r(jià)值遞減的順序,將后續(xù)物品整塊裝入背包,直到無(wú)法整塊裝入為止。對(duì)于無(wú)法整塊裝入的下一件物品,按比例填充剩余容量,計(jì)算價(jià)值上界b。上界意義計(jì)算得到的價(jià)值上界b滿足子樹(shù)中任何結(jié)點(diǎn)的價(jià)值不超過(guò)b。這為最大堆的剪枝提供了理論依據(jù),確保每次從堆中取出的結(jié)點(diǎn)具有全局最優(yōu)的潛能。010203AddLiveNode雙插入同步邏輯AddLiveNode函數(shù)首先創(chuàng)建一個(gè)新的bbnode,設(shè)置其parent指針指向當(dāng)前擴(kuò)展結(jié)點(diǎn),并標(biāo)記左孩子或右孩子標(biāo)志LChild。創(chuàng)建bbnode01接著組裝HeapNode,填寫其uprofit、profit、weight、level和ptr字段。其中ptr字段指向新創(chuàng)建的bbnode,實(shí)現(xiàn)堆與樹(shù)的雙向綁定。組裝HeapNode02調(diào)用H->Insert將HeapNode插入最大堆,確保堆中元素按價(jià)值上界uprofit排序。插入最大堆03右兒子結(jié)點(diǎn)必須滿足價(jià)值上界up≥當(dāng)前最優(yōu)解bestp才入隊(duì),體現(xiàn)了“可能包含最優(yōu)解”的剪枝原則,有效控制堆的規(guī)模和搜索深度。右兒子剪枝04MaxKnapsack主循環(huán)與擴(kuò)展策略主循環(huán)條件MaxKnapsack函數(shù)的主循環(huán)條件是當(dāng)前擴(kuò)展結(jié)點(diǎn)的層數(shù)i不等于n+1,確保在到達(dá)葉結(jié)點(diǎn)前持續(xù)擴(kuò)展。左兒子擴(kuò)展每次循環(huán)先檢查左兒子結(jié)點(diǎn)。若其重量不超過(guò)背包容量,則更新當(dāng)前最優(yōu)解bestp,并將左兒子結(jié)點(diǎn)加入最大堆。右兒子擴(kuò)展與剪枝計(jì)算右兒子結(jié)點(diǎn)的價(jià)值上界,若上界不低于當(dāng)前最優(yōu)解bestp,則將右兒子結(jié)點(diǎn)加入最大堆。隨后從堆中取出新的擴(kuò)展結(jié)點(diǎn),同步其權(quán)重、價(jià)值、上界和層數(shù)。03算法實(shí)現(xiàn)細(xì)節(jié)類Knap成員與構(gòu)造初始化01020304成員變量成員功能構(gòu)造初始化解向量長(zhǎng)度類Knap包含多個(gè)私有成員變量,如最大堆指針H、最優(yōu)解數(shù)組bestx、擴(kuò)展結(jié)點(diǎn)指針E、當(dāng)前重量cw、當(dāng)前價(jià)值cp、背包容量c、物品總數(shù)n、物品重量數(shù)組w和價(jià)值數(shù)組p。--01----02----03----04--這些成員變量分別承擔(dān)不同的功能,如H用于管理活結(jié)點(diǎn),bestx用于存儲(chǔ)最優(yōu)解,E用于記錄當(dāng)前擴(kuò)展結(jié)點(diǎn)狀態(tài),cw和cp用于記錄當(dāng)前背包的重量和價(jià)值。構(gòu)造函數(shù)中分配最大堆內(nèi)存,初始化E為空,將cw和cp置為零,確保類的初始狀態(tài)正確。最優(yōu)解數(shù)組bestx的長(zhǎng)度為n+1,采用1-based索引,為后續(xù)回溯填解預(yù)留空間,避免數(shù)組越界。最優(yōu)解回溯構(gòu)造流程從葉結(jié)點(diǎn)開(kāi)始,沿E->parent鏈反向遍歷,逐層讀取LChild標(biāo)志,填入最優(yōu)解數(shù)組bestx。左孩子標(biāo)志為1,右孩子標(biāo)志為0,與樹(shù)的分支語(yǔ)義一致?;厮葸^(guò)程回溯結(jié)束后,當(dāng)前價(jià)值cp即為最大價(jià)值。通過(guò)Knapsack函數(shù)的外層映射,將bestx數(shù)組按原始物品編號(hào)順序返回,完成最優(yōu)解的構(gòu)造。結(jié)果輸出04預(yù)處理與接口在Knapsack函數(shù)中,首先計(jì)算所有物品的總重量W和總價(jià)值P。若總重量W不超過(guò)背包容量c,直接返回總價(jià)值P,實(shí)現(xiàn)最簡(jiǎn)單的剪枝??傊嘏c總價(jià)值計(jì)算構(gòu)造Object數(shù)組Q,計(jì)算每件物品的單位重量?jī)r(jià)值d=p[i]/w[i],并按d降序排序。排序后的物品順序用于后續(xù)的上界函數(shù)計(jì)算,確保貪心估算的準(zhǔn)確性。單位重量?jī)r(jià)值排序?qū)⑴判蚝蟮奈锲穬r(jià)值和重量分別復(fù)制到K.p和K.w數(shù)組中,為MaxKnapsack函數(shù)的執(zhí)行提供按單位重量?jī)r(jià)值排序的數(shù)據(jù),奠定算法正確性和效率的基礎(chǔ)。數(shù)據(jù)復(fù)制結(jié)果映射與內(nèi)存清理01結(jié)果映射在MaxKnapsack函數(shù)返回最大價(jià)值bestp后,通過(guò)Q[j?1].ID將K.bestx[j]寫回用戶傳入的bestx數(shù)組,實(shí)現(xiàn)按原始輸入順序輸出最優(yōu)解向量。02內(nèi)存清理依次釋放Object數(shù)組Q、物品重量數(shù)組K.w、物品價(jià)值數(shù)組K.p和最優(yōu)解數(shù)組K.bestx的內(nèi)存,防止堆內(nèi)存泄漏,確保程序的健壯性。05復(fù)雜度與優(yōu)化時(shí)間空間復(fù)雜度時(shí)間復(fù)雜度最壞情況下,算法需生成O(2^n)個(gè)結(jié)點(diǎn),但上界剪枝和最優(yōu)解的早期更新可將平均復(fù)雜度降至多項(xiàng)式級(jí)別。單位重量?jī)r(jià)值預(yù)排序耗時(shí)O(nlogn),在n較小時(shí)可忽略不計(jì)。空間復(fù)雜度最大堆的規(guī)模與樹(shù)高成正比,最壞情況下為O(2^n),但實(shí)際受最優(yōu)解快速收斂的影響,常遠(yuǎn)低于理論值。剪枝效率與實(shí)踐建議在Bound函數(shù)中加入earlytermination機(jī)制,計(jì)算得到的價(jià)值上界b小于等于當(dāng)前最優(yōu)解bestp時(shí),即返回,減少不必要的浮點(diǎn)運(yùn)算。Earlytermination對(duì)于容量密集型實(shí)例,先執(zhí)行貪心法得到高質(zhì)量的初始最優(yōu)解bestp,進(jìn)一步削減搜索樹(shù)的規(guī)模,提高算法效率。貪心法預(yù)處理使用固定容量池分配HeapNode,避免頻繁的new和delete操作,提高內(nèi)存分配效率,減少內(nèi)存碎片。內(nèi)存池分配對(duì)于物品數(shù)量較多的情況,可改用深度優(yōu)先搜索結(jié)合內(nèi)存友好的分支限界法,防止最大堆規(guī)模過(guò)大導(dǎo)致內(nèi)存爆炸。深度優(yōu)先優(yōu)化06小結(jié)核心要點(diǎn)與拓展優(yōu)先隊(duì)列式分支限界法的三要素是:子集樹(shù)的系統(tǒng)搜索、最大堆管理活結(jié)點(diǎn)、Bound函數(shù)保證剪枝的安全性。核心要點(diǎn)0-1背包問(wèn)題是NP-hard問(wèn)題的經(jīng)典原型,相同框架可遷移到多重背包、二

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論