Re: [闲聊]最短路径转珠

楼主: sitos (麥子)   2014-07-14 00:33:36
※ 引述《r5e97nk63 (yapin)》之铭言:
: 如题相信很多手速不够快,狠,准的人视此为目标。然而相关教导文又太少,大多只能从
: 网站获得。
: 可是之前太阳教主又认为光看解答着实困难,因此我在这想问一下,有人知道网页最短路
: 径的剖析顺序吗,具体一点便是它是如何被运算出来的,如果它真是模拟”所有路径结果
: “那小弟就真的认了。(虽然我是认为这不可能啦)
: 哪怕只知道一点点,我相信这对”非常理”叠珠的分析都会有蛮大的突破。
如果以找到特定 combo 数作为目标,找最短路径的解法,最适合的作法是 BFS 。
不过即使是 20 步左右的路径,对于电脑而言要计算,搜寻完所有可能的解,
时间还是太长了。在不考虑斜转的情况底下,一步最多可以有四个方向可以走,
以这个数字作粗略的计算, 20 步所产生的可能盘面有 4^20 ,也就是 2^40 ,
要作这样的计算需要的时间其实满长的,以此来产生最短路径并不太实用。
另外一种作法是用 A* 算法作搜寻,每走一步给与所产生的四个盘面一个分数,
挑分数最高的盘面再走下一步。但直接这样做不太行得通,因为从启始盘面只走一步,
可能产生的 combo 数很少,可能产生出来的四个盘面都没有消任何珠,
根本没办法用计算分数的方式分出往哪一个方向走比较好。
因此比较实际的作法是,每走 n 步给予所有产生的盘面一个分数,
例如一个计算阶段走 8 步,那么就会产生 4^8 (2^16) 个盘面,
然后去评估这 64K 个盘面哪一个盘面最好,然后再从这个盘面继续往下找。
这样做的好处是每一阶段的计算时间都不长,可以重复好几次。
上述这两种作法 (一次走一步的 A* 跟一次走 n 步的 A* ) 都不能保证找到最佳解。
而这个作法还有另外一个缺点,就是可能会卡在区域最佳解。
因为一个前几步就产生不错的解的路径,不能保证后面可以产生好解。
所以还是需要某种回溯的机制,在找不到好解的时候放弃已经找到的解。
不过这样做缺点就是马上会增加总计算量。
另外一个可以试着改进的部份是 A* 的评分机制,最原始的作法可能是 combo 数,
但产生一个 combo 可不是乱走就可以走出来。因此为了要分辨解的好坏,
除了 combo 数以外可能还要其它的条件加进来。例如在消完以后,可能还有某些同色珠,
则可以设定同色余珠的位置越接近的解,分数越高。因为这种盘面,
可能再走几步就可以多产生一个 combo ,应该要比那些同色余珠离很远的来得高分。
至于路径的起手位置,除了所有三十个位置都一起尝试以外,因为整个盘面移动上,
最自由的珠就是直接被移动的珠,因此可能挑选某一个很分散的珠会是比较好的选择,
例如有两个水珠在最左边,一个在最右边,这时候如果选择最右边的水珠,
可能就可以把三个水珠拉在一起,相对地如果选择其它的珠,要把最右边的水珠运来,
可能要花的步数就会多上很多。
至于 branch and bound 或 divide and conquer 当然都可以做,
不过前者如果想要做到保证最佳解,那步数可能得要压得很短才能够算得完。
后者的话除了不能保证得到最佳解以外,其实得到的解可能会满差的,
除非刚好足够形成 combo 的珠都在同一边,否则如何 divide 会是一个问题。
当然不同的人可能会有一些不同的 optimization 技巧,不过讲下去可能太多话了,
总之 search algorithm 如果要解的问题本身没有某些非常良好的特性,
那么顶多就是在暴力解上面加上一些 heuristic 去缩短时间来得到次佳解,
因此一定是在某些盘面表现得不错,在另外一些盘面表现的普普通通,
然后在某些刚好克到的盘面,就找不太到好的解。
不过以 6*5 的转珠盘面而言,大概要在五十步以内找出一个不错的解,都满有机会的。
作者: No278 (278)   2014-07-14 00:34:00
可以斜转有8个方向!! (?
作者: Mormory (晨憶、魔法飛彈)   2014-07-14 00:43:00
目前看过类似的东西都是直接放弃斜转......
作者: s93184s (松尾坊)   2014-07-14 00:48:00
快推 求翻译
作者: kashiwa27 (UDON)   2014-07-14 00:49:00
嗯嗯 原来如此 看不懂
作者: abab7974 (幻灭)   2014-07-14 00:52:00
麦子大竟然会降临PAD版...
作者: a062361316 (小熊维尼)   2014-07-14 00:52:00
原来是这样喔 这篇是中文吗
作者: Tetralet (Tetralet)   2014-07-14 00:52:00
考虑到不可能往回走,所以其实只要计算 3 个方向 XD若只考虑 30 步,大概只有 6000 兆种路径... 吧 XDDD
作者: sllwffd (马克)   2014-07-14 00:57:00
推~~
作者: followwar (嫌疑犯X的献身)   2014-07-14 01:09:00
先建立某些常见解法成路径TABLE 先LOOKUP TABLE不知道行得通吗?!
作者: Tetralet (Tetralet)   2014-07-14 01:10:00
我是觉得暴力算不太可能。个人电脑的速度还不够看 XD@followwar: 查表法也不太可能。内存/硬盘还不够大 XD
作者: followwar (嫌疑犯X的献身)   2014-07-14 01:15:00
我的意思是某些常见解交错的方法先内建遇上时直接使用解这些交错的路径
作者: b43681477 (ColaTing)   2014-07-14 01:21:00
不考虑斜转 应该只有三个方向走可以吧,因不会往回头走除了起手步之外
作者: paulpaul99 (paul)   2014-07-14 01:28:00
已知目标combo数的话 有没有可能先产生转完的盘面 在从结果反推回去?
作者: DarkPrincex (DP)   2014-07-14 01:34:00
主要是目标combo数的盘面有复数个,所以没办法用反推的方式来做双头BFS加速
作者: dennis2030 (绿豆)   2014-07-14 01:35:00
强者推一个!
作者: qiaffvvf (鸑鷟)   2014-07-14 01:36:00
是麦大0.0
作者: paulpaul99 (paul)   2014-07-14 01:40:00
先产生一定量的目标盘面 再跟目前盘面作比对 取相似度最高(或前几名)的来作 这样可以吗
作者: jiko5566 (云落炩)   2014-07-14 01:44:00
为什么要让我想起被当的算法orz
作者: heidi61818 (萝卜)   2014-07-14 01:47:00
推,好奇这类算法很久了
作者: Arashinoon (阿辣洗)   2014-07-14 01:56:00
学习了
作者: howder5566 (好der5566)   2014-07-14 02:00:00
http://shouryan.blogspot.tw/ 是在讨论类似这种东西的算法吗?
作者: paulpaul99 (paul)   2014-07-14 02:07:00
查到麦大的网站了 拜读中
作者: Murasaki0110 (麦当劳欢乐送)   2014-07-14 02:10:00
有趣
作者: Jackalxx (次等豺狼)   2014-07-14 02:17:00
为什么会在PAD版看到这些眼熟的名词XDDDD
作者: NicoNeco ((゚д゚≡゚д゚))   2014-07-14 02:46:00
Sito大(拜
作者: zacharyptt (七重奏)   2014-07-14 03:48:00
作者: followwar (嫌疑犯X的献身)   2014-07-14 03:55:00
楼上的算法超眼熟 跟这个好像阿https://github.com/kennytm/pndopt明天被水桶就知道了?!XD 不过那是网页
作者: joy3252355 (九月 ~*)   2014-07-14 04:00:00
推麦子大 居然在PAD版降临 原来能用这种文钓出来 XDD
作者: zacharyptt (七重奏)   2014-07-14 04:01:00
不知道的人还是不知道 知道的人早就知道了
作者: woieyufan (微淋管)   2014-07-14 06:36:00
边缘的连珠权值要比较高因为比较不影响盘面运作
作者: usoko (time to face reality)   2014-07-14 06:53:00
竟然在pad板看到sitos大 XD
作者: jimmycool (北七)   2014-07-14 08:33:00
如果用GA/SA之类的randomized algorithm效果如何呢?先找一个比较差的解,再慢慢mutate到比较短的路径
作者: shikiDS (阿鲁口鲁der欸斯)   2014-07-14 09:43:00
竟然在PAD版看到算法!!
作者: v63718x4   2014-07-14 09:58:00
Dijkstra可以保证找到最短路径 可是计算量会爆炸...不过感觉Dijkstra 应该不适合用在这种转珠分析上
作者: attacksoil (击壤)   2014-07-14 10:25:00
专业
作者: a100900   2014-07-14 10:46:00
专业给推
作者: smilekerr   2014-07-14 10:53:00
天呐 有没有这么专业
作者: lpdpCossette (科赛特)   2014-07-14 11:40:00
原来如此 !!!???!?!?
作者: vup4jp6 (精锐猫奴)   2014-07-14 11:42:00
以这CASE来说 交配跟适应函数都会跟传统的例子有差
作者: horseorange (橘小马)   2014-07-14 11:48:00
看不懂只能推了
作者: vup4jp6 (精锐猫奴)   2014-07-14 11:50:00
直觉会想用最佳优先搜寻,修正评分函数就好特殊面板或者图形可以给特定的评分函数基因算法的部分 交配要用你的例子 要记录最后位置才能做....适应函数必须要把长度也纳入考量至于怎调整到适应函数优化 我想要讨论出来 发PAPER比较快
作者: luxaky (南翰小酒馆)   2014-07-14 12:30:00
恩 跟我想得差不多
作者: pdexter (Pdexter)   2014-07-14 13:00:00
快推 不然人家会以为看不懂
作者: ZMTL (夜风/潇湘 VR板已经开板!)   2014-07-14 13:01:00
有app可以跑最大三斜转
作者: vup4jp6 (精锐猫奴)   2014-07-14 13:40:00
基因算法的部分你误会我的意思了...我是说纪录每次位置你在做交配的时候只会用相同位置做组合 可以省去联不连贯的问题 并且还要交换最后的色珠关于最佳优先搜寻的部分 我们可以一次考虑深度三层事实上多考虑几层深度 还是要照盘面来看 但是考虑是不需要总之....要是考量最短路径来看 BFS为最基本的走向
作者: r5e97nk63 (DoUNo)   2014-07-14 13:54:00
感谢麦大的说明,因为我一开始真的对网页那种近似瞬间的运算感到不可思议,才会想求解答。看来结论是”漂亮”的算法与服务器的暴力破解,这样理解没错吧?
作者: vup4jp6 (精锐猫奴)   2014-07-14 14:05:00
基因算法的部分你是从交配开始讨论,我则是把结果交负适应函数...简单来说是应函数做的跟评分函数不会差太多BFS的意思是说算法对于树的走向....不是完整的跑BFS因为对于路径来说 树的高度等于路径的长度...DFS的走向是不必要的....我想我们可以讨论到更细点的部分那你等我晚点有空 基因算法的部分先回答看完你回应的点 我想你是陷入交配必定产生最好的下一代基因算法的顺序为 交配 突变 适应函数 天择的顺序如果交配必定保留最好的下一代....那后面步骤都可以省略了结论就是.....产生的下一代不一定会最好..至于如何证明近似最佳....请看黑盒子理论....
作者: beicoles (科科~)   2014-07-14 14:26:00
我以为我走到计算数学版...
作者: vup4jp6 (精锐猫奴)   2014-07-14 14:46:00
基因算法就是....不用花啥脑袋....省去证明....的方法..ORZ....XDDD 你明白就好了.....不然不会这么多论文....XD至于你讲的A* 我忽然明白我们讲的差异在哪我印象中A*都有明确目标....但是在转珠途中我并没有如果换成A*的方式 我所讲的走向BFS 每次3曾判断事实上就是A* 每次走一个3*3区域以后 在找最好的HGA强大的地方在于跳脱local optimal...其他部分我不觉得特别突出那就变成最佳搜寻法+登山法...A*在特定条件下就是BFS.....只是名称不同我会考量深度为3的情况 是假想切珠问题....
作者: ledia (付出不需要理由)   2014-07-15 12:50:00
记得有个 single player monte-carlo tree search也许可以试试看 (?) XD
作者: shockben (fighting!!!)   2014-07-15 22:46:00
tabu哩?

Links booklink

Contact Us: admin [ a t ] ucptt.com