自动堆俄罗斯方块

  晚上睡不着觉的时候玩mp3的俄罗斯方块。玩着玩着觉得挺有意思的,想看能不能写个程序,让机器也来玩一玩,和人比一下,看谁的得分尽可能的高。这里面有个关键的游戏规则:单次消掉一行得100分,消两行得300分,消三行得700分,消四行得1500分。一次消一行最简单,得分最低;一次消四行难度最高,并且潜在有最高的危险性,得分很高。最终的目的就是在游戏不死掉的情况下,让得分尽可能的高。显然,这是个最优化问题。

  游戏的积木形状是随机的,假设服从一定的概率分布。这样,在单位时间内,积木的总体积的数学期望容易得到。设为V。假设一次消掉一行的次数为x,一次消掉两行的次数为y,一次消掉三行的次数为z,一次消掉四行的次数为k,则最终的目标函数为:
   max(100x+300*y+700*z+1500*k)


约束条件是:
   1.屏幕上剩余行数不超过屏幕高度(若超过,则游戏结束)
   2.(x+2*y+3*z+4*k)*屏幕宽度 <= V 

    感觉,积木形状的随机性是否服从规律感觉会对最终的结果有影响。暂时不考虑这个问题。

    显然不可能穷举,或者类似穷举的策略,因为每次在屏幕上只会出现两个积木:当前积木与下一个积木。无法得到所有积木出现的序列,而且这个序列本身就是随机的,因此没办法穷举。只能考虑启发式策略。

 

     定义一个代价函数,通过代价函数来确定积木的最终的位置,确定了位置后才确定动作(移动与变形)来使得积木到达指定的位置。有几个要考虑的因素:
1.得分
    这个是最重要的
2.积木之间无法填充的空格(只能等上层积木消掉了才能继续填充)
    这个也很重要。尤其是当空格数较多,或者屏幕行数较多时,必须把这个指标调整到比得分更重要的位置。
3.当前屏幕上积木的行数
    行数的多少确定了策略的选择。如果行数较少,则以得分高为主,当行数较高时,必须降低屏幕上积木的行数,防止行数超过屏幕高度而游戏中止。
4.下一个积木
    当积木放到某个位置后,要使后面一个积木也有很好的选择。

    显然,这样的问题背景无法得到最优解,除非能在游戏之前获得积木的出现次序。

    上面的都是很普通的解决思路。我比较感兴趣的是,如何让机器通过不断的学习,获得越来越好的堆积木技能呢?也就是说,当一个积木来了以后,如何让选择越来越趋于合理?

    以前听机器学习的时候,好像也有个类似的问题,不过是下棋的。它的学习过程是让机器自己与自己对弈,通过对弈的过程调整各个参数,不断的学习进化以达到更好的棋艺。

     而这个自动堆积木的,该如何去学习进化呢? 也许可以考虑这样的笨方法:随机产生很多积木序列,一方面通过穷举搜索它的最优解,一方面机器通过自己的搜索策略获得一个序列,然后把最优解与机器的选择来进行对比学习,通过迭代反馈的方式来调整参数?
    也许不可行,因为最优解很难得出。这个可能性很大。不过可以通过一定方式来获得近似最优解。

     想想而已,和那个历史搜索系统一样;想想而已,让脑壳不至于锈了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值