廢人廢語

點一下上面的發言可能有驚喜?

Friday, July 22, 2011

0-1 knapsack 改版

0-1 knapsack
讀書時學過用DP解
這問題是NP-Complete

先說一說這個問題
有一堆物件,每個有自己的重量價值
你也有一個負重上限

Input: Goods, each with weight and value AND Weight limit
Output: The set of goods having highest value and under the weight limit

DP solution:
OPT(i) = max value subset of items 1 to i

Case 1: OPT(i) = OPT(i - 1)
This means does not choose item i.

Case 2: OPT(i) = Vi + OPT(i-1)
Add item i to the subset.

Final formula : OPT(i) = MAX ( OPT(i-1) , Vi + OPT(i-1) )
OPT(0) = 0

做法
(像是非必要,但排好的話OPT[]會比較容易理解?)把物品用重量排好(輕至重)

準備一個Array, OPT[道具件數][負重上限]
OPT[n][0] = 0 // 無重量 (n指全部)
OPT[0][n] = 0 // 無物品

開始填滿OPT[][]
OPT[1][n] = V1 (重量許可的話)
V1 = 物品1的價值
解釋: 上限再多物件也只有(最輕的)一件,整行除了上限不足的格數都會是 = V1

OPT[2][n] 就要做加數
比較 OPT[1][n] (上一格) 及 OPT[2][LIMIT - W2] (減去物品重量後左方的格子)
取較高的值,之後記下做 Backtracing

例子在此
物品1 重2 價值3
物品2 重3 價值8

物品\重量上限 0 1 2 3 4 5
0 (沒物品) 0 0 0 0 0 0
{1} 0 0 3 3 3 3
{1,2} 0 0 3 8 8 11

解釋
綠色的2格是太重,所以是無物品,價值0
之後的物品{1}都是有價值3

粉紅的8是比較 正上面的3 和 左邊的 0 + 物品2的價值(8) , 發現左邊的比上面的高所以用8, 記住BT要用這個

淺藍的11是比較正上面的3 和 左邊的 3(淺黃格) + 物品2的價值(8),  所以得出 11

左邊格子的選法當然時 重量 - 物品n重量,小於0當0


另一例子

例子在此
物品1 重2 價值3
物品2 重3 價值1


物品\重量上限 0 1 2 3 4 5
0 (沒物品) 0 0 0 0 0 0
{1} 0 0 3 3 3 3
{1,2} 0 0 3 3 3 4

這次物品2 價值下降至1
紅色的兩格的選法都是左邊的 0 + 1 和 上面的 3 比,結果還是上面的3比較好

基本上不停的做到最後一格(右下一格)後做 Back-tracing就能找到 OPT(n)

舊問題到此為止
現在的就是改版

靈感是來自大帝國的艦隊編成
大帝國的戰艦有5種價值 及 成本
代表速度的 索敵
4種攻擊的 航空,鐳射,飛彈,魚雷
成本 就是 指揮

輸入 戰艦資料, 指揮上限 及 各價值的希望數值
輸出 是否有滿足的組合(大於或等於希望數值),有的話顯示該組合
忘了一點,大帝國只能選4部戰艦

基本上 0-1 knapsack 可以視為這個大帝國問題的簡單版
因為 0-1 knapsack 只有1種價值
但大帝國的則有5種...

個人想到的注意地方

  1. 如何在 0-1 knapsack問題上限制只能選4個物品
  2. 先不想5種價值,先想2種價值(如索敵及鐳射)的做法...相信最後可以推到n種價值也沒問題
  3. Brute force complexity = O(n!) , n為輸入戰艦數... n! 的原因為 brute force要試 nC4
  4. 如果用0-1 knapsack的話會有幾個地方出錯 其中一個為如何定義2種價值的OPT,某價值較高某價值較低時如何取捨,用希望數目的百分比也會出錯
  5. 想過先計出分別2種價值的OPT, OPT[MAX][n]會算出在 COST n 時某單一屬性的最高值及其組合,之後補上雙價值皆非0的戰艦...但如果全部戰艦都是雙價值皆非0就不會做 Orz

Sunday, July 10, 2011

神採りアルケミーマイスター小筆記

做一做個小筆記

言霊の樹跡 - 漆黒の決戦地

COMPLETE條件4 味方占有率50%丁度
簡易初回達成法


  1. 到2個EVENT格打開中間大門 (先定義一下:以這門分開門前及門後地區)
  2. 門前地區上方有一個門,佔領門內區域,裏面的魔物渦也要封鎖 (定義: 佔領地區是指整個範圍內只有自軍角色,系統自動把整個區域給你)
  3. 關上這個門
  4. 佔領門後地區
  5. 不要開啟(和占領)出擊門及隱藏的魔法陣格子,當看不到它們
  6. 佔領這地區的左方地區


這樣就能剛好50%, 這時END TURN就能達成條件
多一格也不可以
所以銀色門的寶箱不能先拿,該出擊門及魔法陣也不能進入
要在50%後END TURN才能如常探險

附圖


ミサンシェル - 夢幻の断崖

COMPLETE條件4 占有率60%丁度

這次的比較簡單
就這樣子看圖也應該可以明白


嘗試說明一下
  1. 一開始就普通地前進,途中的旗子請全部封印掉,會經過的地方要全部佔領掉
  2. 據點正上方的區域(有1支旗)也佔領掉,旗子也要封印
  3. 這區域上方的區域這時應該沒敵人,所以能用1個飛行部隊佔領
  4. 繼續往左推,要佔領這區域但不要攻入上方有2支旗的地方 (如上圖)
  5. 再繼續往左推,佔領整個區域(內有一個出擊門)
  6. 棄守第4步的地區,讓天使軍佔領掉
  7. 如圖所示,搶回4格就剛好60%
60%時 END TURN就能完成條件4
保留那2支旗就能讓敵軍奪回該地區,之後我方拿回其中4格就剛好60%

ユイドラ鉱脈 - 脅威の侵食地 (EX)

COMPLETE條件4 占有率80%丁度
比上一個更簡單

看圖就能馬上明白


最下方以外的都佔領掉
這樣子就剛剛好夠了
記得要按END TURN

多餘的補充: 不要打太快,一旦達成了100%的條件地圖就會變大...變大後的80%是很麻煩的

武器,裝飾訓練
某些武器和裝飾品要打死敵人才會成長
我打セラヴィ線時找到了一個應該是比較方便的練法

必要的是セラヴィ的全弾砲撃M(火精霊の戦衣)
地點是ユマ湖 - 霊妙な地底湖

讓セラヴィ在據點上方一格出擊,一出場就對著正上方的蝙蝠群開火
這樣就能打到7隻蝙蝠
想殺得更方便的話可以附上対空迎撃及精神統一

射完後撤退,再進入再開砲
實際時間不會超過2分鐘

ユマ湖 - 忘却の地底空洞 也可以,不過這樣就是打7條魚