2009 英特爾 執行緒挑戰賽 第五題 揹包問題

2021-04-30 02:40:46 字數 4069 閱讀 6256

2009

英特爾®

執行緒挑戰賽—揹包問題

鄧輝

[email protected]

在你為旅行準備行李時,重要的是你要注意不要在行李箱裡放過多的東西,否則你可能會為因行李過重而付出額外的代價。這可能是來自航空公司的額外行李費用,或由於攜帶揹包引起的肌肉痠痛。而且,當你裝包時,控制總重量並不是你的唯一標準,你需要為你的旅行放入更有價值的物品。比如當你到澳大利亞度假時,如果你在包裡塞滿了羽毛,這不會有任何意義。揹包問題的目的是要找到物品的最優選擇,從而使這些物品的總價值最大,同時使總重量控制在限制範圍內。

問題:寫乙個執行緒**來找到能夠形成最大總價值的物品清單,同時這些物品的總重量能夠滿足乙個揹包(容器)的限定容量。每個物品將有乙個相關屬性,包括容量(用重量表示)和價值(**)。揹包容量和要使用的物品清單會包含在命令列指定的輸入檔案內。裝入的物品清單,裝入的物品數量,總重量以及最終總價值將列印到乙個輸出檔案:packinglist.out。

輸入格式:第一行的文字檔案將包含三個數:乙個實數和兩個整數。實數表示揹包的容量,第乙個整數表示每個可用物品的最大數目,這就是說,即使每個物品會在檔案中列出一次,可能會有多個相同物品用來裝包。第二個整數表示檔案中物品的數目。隨後的每一行由三項資料組成:表示物品名的唯一的13個字元長的字串;表示物品重量的乙個實數;以及表示物品價值的乙個實數。在輸入中不存在重量和價值相同的兩個物品。

輸出格式:使用易懂的一些格式。列出裝入包中的每個物品以及這些物品的數量。同時需要包括所有裝入包中物品的總重量和總價值。

第乙個輸入檔案樣例:

15.0 4 5

xxl blue ox 2.0 2.00

gray mouse 1.0 2.00

big green box 12.0 4.00

yellow daisy 4.0 10.00

salmon mousse 1.0 1.00

第乙個輸出檔案樣例:

the items to fit into the 15.0 knapsack are:

3 yellow daisy

3 gray mouse

total capacity used: 15.00

total value: 36.00

第二個輸入檔案樣例:

15.0 1 6

xxl blue ox 2.0 2.00

gray mouse 1.0 2.00

big green box 12.0 4.00

yellow daisy 4.0 10.00

salmon mousse 1.0 1.00

9780596521530 1.54 44.99

第二個輸出檔案樣例:

the items to fit into the 15.0 knapsack are:

1 gray mouse

1 9780596521530

1 yellow daisy

1 salmon mousse

1 xxl blue ox

total capacity used: 9.54

total value: 59.99

計時:總執行時間將用於計分。如果沒有找到最優方案,將會減分。

本題屬於多重揹包問題,多重揹包可以轉化為01揹包進行求解。將物品分組1, 2, 4, 8..... 2^(k - 1), ncount - 2^(k + 1) + 1。由這些組可以組合成[0-ncount]的任意值。將減少轉化後的物品數量。

01揹包問題可以用動態規劃和分支限界兩種演算法進行求解,當揹包較大時動態規劃並不適用,而且記憶體訪問過於頻繁,分支限界演算法利用分支可能組合的最大價值與當前已經找到的最大價值的比較結果進行剪枝,如果物品的價值和重量比值都差異很小的時候分支限界演算法可能會有較長的執行時間。

動態規劃是資料高度依賴的演算法,所以並行相當的困難,根據測試的結果看執行緒同步的開銷甚至讓並行演算法比序列演算法還要慢。

分支限界演算法的並行也存在類似的問題,最終採取了多個執行緒分別計算不同的分支從而達到並行加速的目的。

根據測試結果最終選定壓縮版本的

wm演算法提交,以下為

zwm演算法的優化結果。

hotspots

檢測

使用intel amplifier的hotspots檢測功能查詢熱點函式,結果如下:

檢測結果顯示主要的時間開銷為xknapsack_bb_bound價值上限估算函式,通過檢測結果優化了該函式,原採用同一物品以堆為單位進行估算,優化後按物品為單位進行估算,執行效率得到了一倍的提高。

concurrency

檢測

使用intel amplifier的concurrency檢測功能查詢可進行並行優化的**,結果如下:

檢測結果顯示

xknapsack_bb_bound

價值上限估算函式具有良好的並行度。

locks and waits檢測

使用intel amplifier的locks and waits檢測功能查詢鎖和同步等待消耗,結果如下:

檢測結果顯示演算法幾乎不存在同步和鎖消耗。 1.

使用記憶體對映載入資料。

2.使用二叉堆獲取價值上限最大的節點。

3.使用記憶體緩衝,減少記憶體分配占用的時間。

作業系統:

32bit

的測試在32位

xp下完成。

cpu:

intel(r) core(tm)2 cpu5270@ 1.40ghz

記憶體:1g時間單位:秒最短

dna序列長度:

32位元組

揹包容量

物品數量

物品種類

序列

並行

加速比

75.00 99

10028

0.017726

0.020503

0.86

1000000.00

100100000

0.31599

0.330507

0.96

windows

平台

:

使用vs2008和intel parallel studio

1. 用vs2008開啟本專案.

2. 選擇win32平台release編譯.

3. 進入bin目錄執行檔案為xknapsack.exe.

linux

平台

:

使用icc和tbb 1.

上傳壓縮包種的src和linux兩個目錄到伺服器上. 2.

進入xknapsack/linux目錄 執行make 3.

進入xknapsack/bin目錄 執行檔案為xknapsack.

其他:

主辦方請使用

win32

平台

release

版本測試,謝謝!

高資料依賴的演算法並行非常困難,如何在資料量很小的時候能夠平行計算,使平行計算減少的時間遠遠大於同步的開銷?我需要更多的時間去探索。 感謝

clay breshears

在論壇上所做的解答,感謝mu,

pryce

為本文章發表到

isn所做的工作,感謝

xia, jeffx p

為此解決方案進行的認真細緻的翻譯。

巨集碁助陣英特爾大師挑戰賽,燃爆廈門站!

9 月 16 日,英特爾大師挑戰賽迎來了華南賽區的第一站廈門站,在廈門集美大學盛大舉辦,acer巨集碁作為專業電競裝置製造商及英特爾的親密合作夥伴,傾情助力英特爾大師挑戰賽。在現場觀眾的歡呼助威中,4 支通過線上選拔的隊伍在 英雄聯盟 bo1 賽制中展開廝殺,經過三輪激烈的角逐,決出了廈門站城市冠軍...

掠奪者出擊!英特爾大師挑戰賽再掀電競狂潮

中秋假期怎麼安排,你想好了嗎?是去景區體驗人山人海,還是運動健身休養生息,亦或走親訪友到處蹭飯?如果你和小編一樣,覺得景區太擠,運動太熱,親戚太吵,或許接下來這個選項能夠讓你興奮起來,那就是守在電腦前,電競賽事啦!經過激烈的選拔賽,由predator掠奪者助力的 2019 屆英特爾大師挑戰賽西安站將...

英特爾 執行緒處理工具和 OpenMP

英特爾 執行緒處理工具和 openmp 顯式執行緒方法 如,windows 執行緒或 posix 執行緒 使用庫呼叫建立 管理並同步執行緒。使用顯式執行緒,需要對幾乎所有受影響的 進行重新構建。openmp 是編譯指示 pragma api 函式,及環境變數的集合,能夠以相對較高的級別將執行緒放入應...