Re: [問題] 一堆數字取組合最大值

看板C_and_CPP作者 (麥子)時間10年前 (2013/10/06 03:19), 編輯推噓0(002)
留言2則, 2人參與, 最新討論串4/4 (看更多)
基於暴搜提兩個 heuristic 的想法 1. 在 (Xn, Yn) 和 (Xm, Ym) 之間作選擇的時候, 如果 Xn >= Xm 且 Yn >= Ym ,則應該選擇 (Xn, Yn) , (Xm, Ym) 可不用考慮。 簡單的證明是,令現在已選擇的所有點之前項和為 a ,後項和為 b 。 則選擇 (Xn, Yn) 後的值為 (Xn + a) * (Yn + b) = XnYn + aYn + bXn + ab 而選擇 (Xm, Ym) 後的值為 (Xm + a) * (Ym + b) = XmYm + aYm + bXm + ab 因 Xn >= Xm 且 Yn >= Ym 故前者必 >= 後者。 反之,在 (Xn, Yn) 和 (Xm, Ym) 之間選擇要去除其一的時候, 如果 Xn >= Xm 且 Yn >= Ym ,則應該選擇 (Xm, Ym) , (Xn, Yn) 可不用考慮。 這個 heuristic 無法處理的 worst case 就是上述條件式在任兩點間皆不成立。 (也就是類似所有的點都分佈呈現 pareto optimality 的樣子) 2. 這個問題的圖象化思考就是這些點都是二維向量,然後想要從中選出 k 個, 使得從原點出發以後將這些向量頭尾相連串起來所抵達的點, 其發向兩座標軸的垂直線及座標軸所圍出的矩形面積最大。 因此可以把題目反過來處理,也就是從把所有的向量全部串起後抵達的點, 挑出不選擇的 (n - k) 個向量,依這些向量的反方向走,最後抵達的點, 依上述方式圍出來的矩形面積要最大。 因此在暴搜的時候可以先任意移除 (n - k) 個向量並取得一組解, 則該解可作為圍出矩形面積的 lower bound ,如果有某個 DFS 走法, 移去特定數量的向量以後所抵達的點所圍出的面積已小於 lower bound , 則可以不用繼續搜尋。透過 branch and bound 來去除不可能的解。 3. 我的直覺基本上也傾向這是一個 NP 問題,如果上述第一點的條件任兩點皆不成立, 亦即一開始 cismjmgoshr 推文所述的狀況,這種情況濾掉任何一個選擇, 似乎都無法避免落入 local optimal ,不過我沒力氣去想嚴謹的證明。 -- 我實實在在的告訴你們,一粒麥子不落在地裡死了, 仍舊是一粒,若是死了,就結出許多子粒來。 約翰福音 12:24 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.24.61

10/06 04:07, , 1F
囧> 希望討論串能往C/C++實作的方向來走
10/06 04:07, 1F

10/06 06:22, , 2F
這討論串原文一開始就是來問演算法的阿
10/06 06:22, 2F
文章代碼(AID): #1IK6PMsh (C_and_CPP)
文章代碼(AID): #1IK6PMsh (C_and_CPP)