2015年2月12日 星期四

演算法 Algorithm ─ Dynamic Programming 2

動態演算法  Dynamic Programming

解 0-1背包問題

範例:有個背包可承受10kg的重量,請依下列項目選出最有價值的組合放入背包中

















 i = 物品1、物品2、物品3、物品4
w = 重量
 p = 價值
_________________________________________________________________________________





○ 動態演算法的解法:

   1. 先將問題分成4個部分 (物品1、物品2、物品3、物品4)
   2. 依序決定是否要將物品收在背包中且不超過負重量
   3. 圓圈內的1、0分別代表有、無放進背包中的記號
      ※ 0、1  表示第一項物品取值情況
      ※ 00、01  表示第二項物品取值情況,00→ 第1個0為第1項物品沒有拿,第2個0為第2項物品沒有拿
                                                            01→ 第1個0為第1項物品沒有拿,第2個1為第2項物品有拿

      ※ 000、001  表示第二項物品取值情況,000→ 第1個0為第1項物品沒有拿,第2個0為第2項物品沒有拿
                                                                         第3個0為第3項物品沒有拿
                                                                001→ 第1個0為第1項物品沒有拿,第2個0為第2項物品沒有拿
                                                                         第3個1為第3項物品有拿
       以此類推......


      Tips: x1= 1,x1用來表示 物品1;後面的1則為有拿物品


                x1= 0,x1用來表示 物品1;後面的0則為沒拿物品

                線上數值代表物品價值

以最佳解法為例:   
  
                  先決定是否要將 物品1放進背包,要放的話往圓圈1的方向走,不放的話往圓圈0的方向走
                  
                  起點為圓圈S

                  ● 1. 決定不放物品1,往圓圈0的方向走

                  ● 2. 放入物品2,價值 $30,背包重4kg,走到圓圈01的位置

                  ● 3. 再放入物品3,總價值 $50,背包總重9kg,走到圓圈011的位置

                  ● 4. 背包總重9kg且已經沒有低於1kg的東西可以裝,於是走到圓圈0110的位置

                  ● 5. 已無任何選擇所以走到圓圈T,結束。

                  所求得的最佳解為:
                                                  S→01→011→0110→T
                                      
                                                  背包總重:9KG
                                                  價值:       $50

沒有留言:

張貼留言