※ 引述《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 的转珠盘面而言,大概要在五十步以内找出一个不错的解,都满有机会的。