→ No278:可以斜轉有8個方向!! (? 07/14 00:34
如果把斜轉也考慮進去,每一步就有八個方向,複雜度會高很多,
同樣是 10 步,沒有斜轉是 4^10 ,有的話則是 8^10 。
※ 編輯: sitos (36.224.222.113), 07/14/2014 00:38:24
→ Mormory:目前看過類似的東西都是直接放棄斜轉...... 07/14 00:43
放棄斜轉基本上不是演算法難度的問題,因為允許斜轉更容易找到最佳解,
我想大部份相關的作品不考慮斜轉,主要是因為會需要用 sovler 的玩家,
通常都是轉珠能力比較不好的玩家,斜轉的不穩定性,手轉去執行時會產生問題。
※ 編輯: sitos (36.224.222.113), 07/14/2014 00:46:06
推 s93184s:快推 求翻譯 07/14 00:48
推 kashiwa27:嗯嗯 原來如此 看不懂 07/14 00:49
推 abab7974:麥子大竟然會降臨PAD版... 07/14 00:52
推 a062361316:原來是這樣喔 這篇是中文嗎 07/14 00:52
推 Tetralet:考慮到不可能往回走,所以其實只要計算 3 個方向 XD 07/14 00:52
→ Tetralet:若只考慮 30 步,大概只有 6000 兆種路徑... 吧 XDDD 07/14 00:54
一些細節是 (1) 往回走不用計算,所以能往下走的選擇是 3 個方向 (考慮斜轉是 7 個)
(2) 不往下走也是一個選擇,也要計算在裡面,不過影響很小,可以忽略。
(3) 產生重覆盤面的走法可以不去走,例如四個珠繞小圈圈繞三次...
另外雖然在計算時間複雜度的時候,主要是算產生盤面的量,不過算 combo 數,
其實也要不少時間。如果評分的時候不只考慮 combo 數,還考慮了餘珠位置等等,
時間會更久。為什麼這一點提出來講,是因為產生盤面是很好用 GPU 平行化的,
可以丟去 GPU 跑,速度應該會很快。但是計算特定盤面的 combo 數,
因為裡面的條件式太多,反而不利於用 GPU 來加速。我不知道別人的解法怎麼做,
不過我自己目前還沒有時間嘗試去用 GPU 加速,等有空再看看好了。
※ 編輯: sitos (36.224.222.113), 07/14/2014 01:04:44
推 sllwffd:推~~ 07/14 00:57
推 followwar:先建立某些常見解法成路徑TABLE 先LOOKUP TABLE 07/14 01:09
→ followwar:不知道行得通嗎?! 07/14 01:09
推 Tetralet:我是覺得暴力算不太可能。個人電腦的速度還不夠看 XD 07/14 01:10
→ Tetralet:@followwar: 查表法也不太可能。記憶體/硬碟還不夠大 XD 07/14 01:11
啟始盤面的總量是 6^30 ,每個都建一個解也要非常非常久。
※ 編輯: sitos (36.224.222.113), 07/14/2014 01:11:56
推 followwar:我的意思是某些常見解交錯的方法先內建 07/14 01:15
→ followwar:遇上時直接使用解這些交錯的路徑 07/14 01:16
因為啟始盤面太多了,剛好遇到一樣盤面的機率其實滿低的。
不過當然也有可能是因為我沒有想到好的找出「相似」盤面的方法。
推 b43681477:不考慮斜轉 應該只有三個方向走可以吧,因不會往回頭走 07/14 01:21
→ b43681477:除了起手步之外 07/14 01:21
→ paulpaul99:已知目標combo數的話 有沒有可能先產生轉完的盤面 在從 07/14 01:28
→ paulpaul99:結果反推回去? 07/14 01:29
這個想法我其實有寫一篇文章討論,不過不能網址不能貼到這個板上。
基本上簡略來說就是,如果要用一種很單純的回推方法,一定可以找到路徑,
只是會很長。因為從任一盤面走成另外任一盤面是一定可能的,這可以簡單證明。
但如果同時還希望步數不要太長,甚至要求最短路徑,那還是得要作搜尋。
※ 編輯: sitos (36.224.222.113), 07/14/2014 01:58:03
推 DarkPrincex:主要是目標combo數的盤面有複數個,所以沒辦法用反推 07/14 01:34
→ DarkPrincex:的方式來做雙頭BFS加速 07/14 01:34
其實你提的作法是可以作的,問題在於要怎麼選取一個「夠像」現在盤面的目標盤面。
當然一個最直覺的作法就是找出現在盤面和目標盤面珠子的一一對應,
例如同色的珠就找最近的,然後算 Hamming distance 之類的,
差越少的算作越相似,然後找差最少的當作目標盤面,去作雙向 BFS 。
不過目前我還無法確定 Hamming distance 或類似的求差方式算出來的數字,
和兩個盤面之間的最短路徑長度是緊密相關的。因為實際上一個 20~30 步的路徑,
就可以把盤面打得很亂,所以這種計算相似度的方式可能也不是很適當。
推 dennis2030:強者推一個! 07/14 01:35
→ qiaffvvf:是麥大0.0 07/14 01:36
→ paulpaul99:先產生一定量的目標盤面 再跟目前盤面作比對 取相似度 07/14 01:40
→ paulpaul99:最高(或前幾名)的來作 這樣可以嗎 07/14 01:41
回在上面那一段了。主要的問題是「相似度高」是否就代表「路徑短」,
如果能大略證明這兩者之間的關聯度足夠,應該是可以做的。
但即使做了可以用雙向的 BFS ,可能還是要花不少的時間作搜尋才找得到解。
不過既然這種作法得到的是最佳解,比上面一大堆 heuristic 久是應該的。
推 jiko5566:為什麼要讓我想起被當的演算法orz 07/14 01:44
推 heidi61818:推,好奇這類演算法很久了 07/14 01:47
推 Arashinoon:學習了 07/14 01:56
※ 編輯: sitos (36.224.222.113), 07/14/2014 02:03:01
→ howder5566:的演算法嗎? 07/14 02:00
我不太清楚這個作者有沒有討論「演算法」,在快一年前我開始想這方面的演算法時,
他的 blog 基本上沒幫上什麼忙,因為沒有討論演算法,也沒有 source code 可以看。
※ 編輯: sitos (36.224.222.113), 07/14/2014 02:08:35
推 paulpaul99:查到麥大的網站了 拜讀中 07/14 02:07
因為後來就開始忙了,所以其實算是寫到一半,目前只寫非常概念的部份,
之後可能會重新整理或重寫程式,然後 blog 再寫一些比較偏實作最佳化的。
不過,這些東西可能就不能在這邊講了。
※ 編輯: sitos (36.224.222.113), 07/14/2014 02:10:18
推 Murasaki0110:有趣 07/14 02:10
推 Jackalxx:為什麼會在PAD版看到這些眼熟的名詞XDDDD 07/14 02:17
推 NicoNeco:Sito大(拜 07/14 02:46
→ followwar:樓上的演算法超眼熟 跟這個好像阿 07/14 03:55
這些東西真的可以 po 嗎? XD
※ 編輯: sitos (36.224.222.113), 07/14/2014 03:57:04
→ followwar:明天被水桶就知道了?!XD 不過那是網頁 07/14 03:58
推 joy3252355:推麥子大 居然在PAD版降臨 原來能用這種文釣出來 XDD 07/14 04:00
推 zacharyptt:不知道的人還是不知道 知道的人早就知道了 07/14 04:01
推 woieyufan:邊緣的連珠權值要比較高因為比較不影響盤面運作 07/14 06:36
我沒有這樣想過,不過聽起來似乎是一個合理的作法,也許有機會我會來試試看。
推 usoko:竟然在pad板看到sitos大 XD 07/14 06:53
推 jimmycool:如果用GA/SA之類的randomized algorithm效果如何呢? 07/14 08:33
→ jimmycool:先找一個比較差的解,再慢慢mutate到比較短的路徑 07/14 08:33
GA 跟 SA 基本的預設是 encode 過的那個 string 值相近的時候,
得到的解 quality 會差不多。但在轉珠的搜尋裡面這個前提並不成立。
簡單舉個 GA 的例子,假設現在有兩條路徑都可以得到很棒的解,
第一條是「上左下左下右右右上上左左上右右下右左左左」,
另一條是「下右右上右右上左左左左下下左下右右右上左」,
把這兩條拿來作 crossover ,第一條的前半接上第二條的後半會是一組好的解嗎?
應該不會。親代的優勢無法遺傳給子代的話 GA 應該效果很差。
※ 編輯: sitos (36.224.222.113), 07/14/2014 09:02:32
推 shikiDS:竟然在PAD版看到演算法!! 07/14 09:43
推 v63718x4:Dijkstra可以保證找到最短路徑 可是計算量會爆炸... 07/14 09:58
→ v63718x4:不過感覺Dijkstra 應該不適合用在這種轉珠分析上 07/14 09:59
Dijkstra's algorithm 主要應該是用在要搜尋的點有遠有近的狀況,
用來找最短的路徑。但如果所有解的 distance 都一樣 (轉珠裡就是 1 步),
那其實 Dijkstra's algorithm 就是很普通的 BFS 而已,也是暴力解。
推 attacksoil:專業 07/14 10:25
推 a100900:專業給推 07/14 10:46
推 smilekerr:天吶 有沒有這麼專業 07/14 10:53
→ lpdpCossette:原來如此 !!!???!?!? 07/14 11:40
→ vup4jp6:以這CASE來說 交配跟適應函數都會跟傳統的例子有差 07/14 11:42
推 horseorange:看不懂只能推了 07/14 11:48
推 vup4jp6:直覺會想用最佳優先搜尋,修正評分函數就好 07/14 11:50
→ vup4jp6:特殊面板或者圖形可以給特定的評分函數 07/14 11:50
以最佳優先搜尋當作骨幹去變形是我目前覺得相對直覺簡單,效果又不錯的做法。
不過一切的重點都在評分函數到底要怎麼設定。為了要讓搜尋的效果更好,
在做評分函數的時候我試過一大堆不同的方法,越做越複雜。
基本上只考慮 combo 數,計算起來不會很有效率。即使是沒有形成 combo 的盤面,
那些餘珠的位置也是有意義的。評分函數甚至應該要考慮天降破壞疊珠的情況,
以及最後餘珠相連而增加天降 combo 的數量等等。不過這有點細節了。
→ vup4jp6:基因演算法的部分 交配要用你的例子 要記錄最後位置 07/14 11:52
→ vup4jp6:才能做....適應函數必須要把長度也納入考量 07/14 11:52
→ vup4jp6:至於怎調整到適應函數優化 我想要討論出來 發PAPER比較快 07/14 11:53
就算有紀錄最後位置我認為也沒什麼用,路徑裡面隨便調換某一步的方向,
對整體盤面可能就會造成很嚴重的影響。雖然有人會覺得,我只是換了一步,
頂多可能影響一部份的盤面,其它已經產生的連珠還是會產生 combo 。
但是在考慮了疊珠的情況以後,某一個原本的連珠被打斷,很有可能會造成,
後面一連串本來疊珠落下會消的 combo 全部都不見。
不過如果計算分數的時候只考慮直接消的部份,不考慮疊珠,也許可行?
推 luxaky:恩 跟我想得差不多 07/14 12:30
推 pdexter:快推 不然人家會以為看不懂 07/14 13:00
推 ZMTL:有app可以跑最大三斜轉 07/14 13:01
要跑幾個斜轉應該都可以,限制三個應該也是擔心人手轉不出來吧。
※ 編輯: sitos (36.224.222.113), 07/14/2014 13:32:56
※ 編輯: sitos (36.224.222.113), 07/14/2014 13:38:04
→ vup4jp6:基因演算法的部分你誤會我的意思了...我是說紀錄每次位置 07/14 13:40
→ vup4jp6:你在做交配的時候只會用相同位置做組合 可以省去聯不連貫 07/14 13:41
→ vup4jp6:的問題 並且還要交換最後的色珠 07/14 13:41
嗯,看來我真的沒聽懂,可能要請你多解釋一點才聽得懂了。
因為我認為即使路徑是連貫的,交配之後的路徑很可能會破壞彼此路徑得到的好盤面。
假設有 A 跟 B 兩條路徑要作交配,令 A 的前段是 A1 ,後段是 A2 ,
B 的前段是 B1 ,後段是 B2 ,且走完 A1 跟走完 B1 時,
可移動的珠的位置是相同的以確保路徑連續。
如果 A 跟 B 都可以得到很好的解,那麼 A1B2 或 B1A2 會得到很好的解嗎? 我不認為。
理由是這樣的,因為從啟始盤面走完 A1 時得到的盤面和走完 B1 時的盤面是不同的,
雖然從走完 B1 時的盤面再走 B2 會得到很棒的解,但這並不代表,
從走完 A1 時的盤面再走 B2 也會得到很棒的解。簡單地說,兩個不同的盤面,
沒道理認為對其中一個盤面好的路徑,也一定會對另外一個盤面有不錯的解。
→ vup4jp6:關於最佳優先搜尋的部分 我們可以一次考慮深度三層 07/14 13:43
→ vup4jp6:事實上多考慮幾層深度 還是要照盤面來看 但是考慮是不需要 07/14 13:43
→ vup4jp6:總之....要是考量最短路徑來看 BFS為最基本的走向 07/14 13:45
如果要用 BFS 當然可以,只是效率實在太差。暴力解可以得到最佳解,但不實用。
我基本上相信現在所有的 solver 應該沒有人用暴力解,因為應該跑不完。
所以重點在於到底要用什麼樣的 heuristic 才能平衡計算時間和解的 quality 。
※ 編輯: sitos (36.224.222.113), 07/14/2014 14:02:39
推 r5e97nk63:感謝麥大的說明,因為我一開始真的對網頁那種近似瞬間 07/14 13:54
→ r5e97nk63:的運算感到不可思議,才會想求解答。看來結論是”漂亮 07/14 13:54
→ r5e97nk63:”的演算法與伺服器的暴力破解,這樣理解沒錯吧? 07/14 13:54
我不知道網頁解的作法是怎麼做的。但如果要我猜,我認為應該還是用很漂亮的演算法,
去作近似最佳解。但不太可能是用暴力法去求最佳解,因為 solution space 太大了,
不太可能把所有能走的路徑通通都計算進去。但演算法怎麼設計對效率影響很大,
當然我是滿希望可以和其它人討論應該要怎麼設計,不過可能不太適合在這個板討論。
※ 編輯: sitos (36.224.222.113), 07/14/2014 14:05:24
→ vup4jp6:基因演算法的部分你是從交配開始討論,我則是把結果交負 07/14 14:05
→ vup4jp6:適應函數...簡單來說是應函數做的跟評分函數不會差太多 07/14 14:05
越聽越不懂了。 :)
我對基因演算法的質疑是,兩個在適應函數上表現良好的親代,
在轉珠裡面,大多數的時候都不能產生在適應函數上表現良好的子代,
因此不符合基因演算法對於遺傳良好性狀這個部份的預設。
不過我對基因演算法其實不那麼熟,我只是單純覺得不太可行。
→ vup4jp6:BFS的意思是說演算法對於樹的走向....不是完整的跑BFS 07/14 14:06
→ vup4jp6:因為對於路徑來說 樹的高度等於路徑的長度... 07/14 14:06
演算法對於樹的走向? 這個也沒有聽懂。 BFS 指的是搜尋節點的順序,
就是最淺的開始搜,不完整跑完那應該要怎麼跑?
※ 編輯: sitos (36.224.222.113), 07/14/2014 14:10:35
→ vup4jp6:DFS的走向是不必要的....我想我們可以討論到更細點的部分 07/14 14:07
你可能得要用回文才能解釋你要講的東西了,推文寫起來應該滿辛苦的。謝謝啦。 :)
※ 編輯: sitos (36.224.222.113), 07/14/2014 14:17:36
→ vup4jp6:那你等我晚點有空 基因演算法的部分先回答 07/14 14:21
你慢慢來沒關係,因為其實這兩天會滿忙的,可能也沒有空討論。
如果 GA 真的適用的話,我之後可能會實作出來看看效果怎麼樣。
→ vup4jp6:看完你回應的點 我想你是陷入交配必定產生最好的下一代 07/14 14:21
→ vup4jp6:基因演算法的順序為 交配 突變 適應函數 天擇的順序 07/14 14:22
→ vup4jp6:如果交配必定保留最好的下一代....那後面步驟都可以省略了 07/14 14:22
→ vup4jp6:結論就是.....產生的下一代不一定會最好.. 07/14 14:23
我並沒有認為交配必定會產下最好的下一代,但下一代是好的下一代的機率如果很低,
那倒不如直接隨機產生路徑,反正效率也差不多。同樣突變也是,
如果每一次突變都很容易讓解變得很差,那還不如直接隨機產生解來隨便試一試。
基因演算法要套用在轉珠問題上面當然可以用,只是效率好不好的問題。
→ vup4jp6:至於如何證明近似最佳....請看黑盒子理論.... 07/14 14:24
你講的這些我知道,我只是認為基因演算法在轉珠問題裡面效率不好,
因為有相似基因的解通過適應函數算出來的值可能會差異非常大。
不斷通過天擇往最佳解貼近的速度可能會很慢,所以我目前還是選用類似 A* 的作法。
因為 A* 的作法在我眼裡看起來比 GA 更適用在轉珠問題。
推 beicoles:我以為我走到計算數學版... 07/14 14:26
※ 編輯: sitos (36.224.222.113), 07/14/2014 14:33:56
※ 編輯: sitos (36.224.222.113), 07/14/2014 14:41:15
推 vup4jp6:基因演算法就是....不用花啥腦袋....省去證明....的方法.. 07/14 14:46
→ vup4jp6:ORZ....XDDD 你明白就好了.....不然不會這麼多論文....XD 07/14 14:47
→ vup4jp6:至於你講的A* 我忽然明白我們講的差異在哪 07/14 14:48
嗯,在我的領域看到用 GA 跟 SA 的論文,大概就是去看論文怎麼把要解的問題,
model 成 GA 跟 SA 能夠解的形式,然後看看這個 model 有沒有什麼創新性。
如果單純只是硬把問題丟進 GA 跟 SA 解,那是沒什麼貢獻的。
※ 編輯: sitos (36.224.222.113), 07/14/2014 14:50:54
→ vup4jp6:我印象中A*都有明確目標....但是在轉珠途中我並沒有 07/14 14:48
A* 的關鍵一樣在於那個評價公式的設計好壞,而且也不一定要有明確目標,
主要是要能夠引導 search 要往哪個方向去走。當然 A* 也不用作全套,可以有變形,
即使找不到最佳解,能夠很有效率地找到次佳解也是不錯的演算法。
※ 編輯: sitos (36.224.222.113), 07/14/2014 14:53:49
→ vup4jp6:如果換成A*的方式 我所講的走向BFS 每次3曾判斷 07/14 14:51
→ vup4jp6:事實上就是A* 每次走一個3*3區域以後 在找最好的H 07/14 14:52
→ vup4jp6:GA強大的地方在於跳脫local optimal... 07/14 14:53
→ vup4jp6:其他部分我不覺得特別突出 07/14 14:53
→ vup4jp6:那就變成最佳搜尋法+登山法...A*在特定條件下 07/14 14:55
→ vup4jp6:就是BFS.....只是名稱不同 07/14 14:55
也是啦,只是它正式的名字就叫 A* ,所以我就寫 A* ,這樣別人比較知道在說啥。
不然我自己講,我會把我用的演算法稱為分段式 DFS ,然後為了跳出 local optimal ,
搭配回溯路徑與次佳解搜尋 blabla ,只是這樣也沒人知道我在講啥。
這些作法我有寫在我的 blog ,後來就有人留言說他用 A* ,
然後我看了看。嗯,其實也可以把我的作法視為 A* 的一種變型。
當然要說它是 DFS 的變型也可以,反正就是這裡混一點那裡混一點。
重點是能在夠短的時間裡面搜出夠好的解法,就是適合的演算法。
※ 編輯: sitos (36.224.222.113), 07/14/2014 15:02:58
→ vup4jp6:我會考量深度為3的情況 是假想切珠問題.... 07/14 15:04
→ vup4jp6:可以想像 要以COMBO數為考量 3科一組 是必然的 07/14 15:05
→ vup4jp6:超過3科部分切掉的情況 3步內都可以完成 深度3是合理的 07/14 15:06
→ vup4jp6:不過我可沒空證明..... 07/14 15:06
我之前實際的經驗,三步太短,不容易找到好的解...
※ 編輯: sitos (36.224.222.113), 07/14/2014 15:07:28
→ vup4jp6:3步不夠有點難以想像...27張找最佳 你的H怎麼計算的? 07/14 15:11
→ vup4jp6:完整模擬完消珠疊珠結果??? 07/14 15:11
不只是完整模擬完消疊珠的結果,還會避免疊珠的 combo 連消被天降打散,
以及盡可能讓同色餘珠集中在一起增加天降增加 combo 的可能性。
推 vup4jp6:如果是我做的話 3步內沒有提升我會找相同的做就是了 07/14 15:19
期待你的作品。 :)
※ 編輯: sitos (36.224.222.113), 07/14/2014 15:56:42
推 ledia:記得有個 single player monte-carlo tree search 07/15 12:50
→ ledia:也許可以試試看 (?) XD 07/15 12:50
學長現在在哪裡高就阿... 好久不見了
既然是 ledia 的建議,等我之後有空就來看看 :)
※ 編輯: sitos (36.224.222.113), 07/15/2014 15:10:38
→ shockben: tabu哩? 07/15 22:46
推 ledia:monte-carlo tree search 在電腦棋類掀起了不小的波瀾 07/17 17:37
→ ledia:不過一直都是用在互奕的棋局, 我沒有花時間去研究轉植到單人 07/17 17:38
→ ledia:game search 的差異, 不過他的好處是不用精準的 evaluation 07/17 17:38
→ ledia:看到有人在討論就拋磚引玉一下 ... XD 07/17 17:39