题目来自于kaggle。用AI模拟锤子,剪刀,布的游戏。下面是我的一些解法和尝试。

1. 随机数

最直观的解法。用随机数产生。代码如下:

import numpy as npdef random_agent (observation, configuration):return np.random.randint(1, 10000) % 3

这个解法得到了742.2分。

2. 基于对手会使用平均的策略

这个想法基于对手会比较平均的出锤子,剪刀,布,那样我就永远猜测对手下一次会出已经出过的里面的最少的那个。代码如下:

import numpy as npcounts = {}def random_agent (observation, configuration):if observation.step > 0:counts[observation.lastOpponentAction] = counts.get(observation.lastOpponentAction, 0) + 1count_of_zero = counts.get(0, 0)count_of_one = counts.get(1, 0)count_of_two = counts.get(2, 0)if count_of_zero == count_of_one and count_of_one == count_of_two:answer = np.random.randint(1, 10000) % 3elif count_of_zero <= count_of_one and count_of_zero <= count_of_two:answer = 1elif count_of_one <= count_of_two:answer = 2else:answer = 0return answer

这个结果并不好,只得了400分。看了一下结果,很明显被针对了,因为对手一直在出剪刀和布,我就一直猜对手下一次会出锤子,就一直出布,这样我不是平就是输。

3. 使用过去一段时间内取得分数最多的动作

这个想法是统计在过去的几个动作内取得得分最多的动作,然后继续使用该动作。比如赢了的动作记一分,输了记负一分,平了不计分。

import numpy as npcounts = {}
my_last_action = 0
cover_range = 7scores = {0:[], 1:[], 2:[]}def get_score(action):score_list = scores[action]if len(score_list) < cover_range:return sum(score_list)else:return sum(score_list[-1 * cover_range:])def random_agent (observation, configuration):global my_last_actionif observation.step > 0:if (observation.lastOpponentAction == 0 and my_last_action == 1) or (observation.lastOpponentAction == 1 and my_last_action == 2) or (observation.lastOpponentAction == 2 and my_last_action == 0):for i in range(0, 3):if i != my_last_action:scores[i].append(0)else:scores[i].append(1)elif (observation.lastOpponentAction == 1 and my_last_action == 0) or (observation.lastOpponentAction == 2 and my_last_action == 1) or (observation.lastOpponentAction == 0 and my_last_action == 2):for i in range(0, 3):if i != my_last_action:scores[i].append(0)else:scores[i].append(-1)else:for i in range(0, 3):scores[i].append(0)count_of_zero = get_score(0)count_of_one = get_score(1)count_of_two = get_score(2)if count_of_zero == count_of_one and count_of_one == count_of_two:my_last_action = np.random.randint(1, 10000) % 3elif count_of_zero >= count_of_one and count_of_zero >= count_of_two:my_last_action = 0elif count_of_one >= count_of_two:my_last_action = 1else:my_last_action = 2return my_last_action

但是这个结果也不好,最后得分一直在500分之下徘徊。目前得分最高的随机数算法。我决定自己写个小程序比较一下各个实现方案,调整一下参数。

这个问题一直没有什么好的进展,一直是随即策略的结果最好。后来看到一个人写的帖子,大概意思是这个问题如果是真的随机数,那么随机策略就是最好的策略。因为所有的其他策略对随机策略都是在赌运气。这个说法我觉得是正确的。即便考虑到我们使用的随机数是伪随机数,除非hack掉对方的随机策略,否则还是没有办法用ML等算法探测出对方的策略。

锤子,剪刀,布游戏的研究相关推荐

  1. 剪刀游戏c语言代码,C++编程锤子剪刀布游戏源代码

    这个游戏的源代码很基础..一般学过程序的基本都看得懂...网上找的,自己稍作修改了 用的软件仍是Visual C++ 6.0 下面是源代码: #include #include #include vo ...

  2. Java锤子剪刀布大家应该都会玩“锤子剪刀布”的游戏: 现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

    题目描述: 大家应该都会玩"锤子剪刀布"的游戏:现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入描述: 输入第1行给出正整数N(< ...

  3. Basic Level 1018. 锤子剪刀布 (20)

    大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势, 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入第1行给出正整数N ...

  4. 锤子剪刀布 (20)

    链接:https://www.nowcoder.com/questionTerminal/79db907555c24b15a9c73f7f7d0e2471?toCommentId=3225314 来源 ...

  5. 1018 锤子剪刀布 (20 分)

    大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入 ...

  6. 牛客网_PAT乙级1008_锤子剪刀布 (20)

    题目 题目描述 大家应该都会玩"锤子剪刀布"的游戏: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入描述: 输入第1行给出正整数N( ...

  7. C语言满分代码:1018 锤子剪刀布 (20分)(解题报告)

    立志用更少的代码做更高效的表达 Pat乙级最优化代码+题解+分析汇总-->传送门 大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记 ...

  8. [PAT乙级]1018 锤子剪刀布

    大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入 ...

  9. PAT——1018. 锤子剪刀布

    大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入 ...

  10. 锤子剪刀布pat-1018

    题目描述 大家应该都会玩"锤子剪刀布"的游戏: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入描述: 输入第1行给出正整数N(< ...

最新文章

  1. 什么是 JVM方法区
  2. openstack用rdo方式安装时遇到的问题
  3. 蓝桥杯_算法训练_ALGO10_集合运算
  4. University of Edinburgh
  5. git删除远程服务的文件夹
  6. java 根据经纬度计算多边形的面积_强基初中数学amp;学Python——第二十九课 根据海伦秦九韶公式编程计算三角形面积...
  7. html5 indexeddb 排序,html5 – 在IndexedDB中,有没有办法进行排序复合查询?
  8. gwas snp 和_eQTL和GWAS还可以这样玩
  9. Redis入门到精通-姜海强-专题视频课程
  10. 华为云HCIE认证有多难?考试内容是什么?
  11. CNN之Xception Keras实现模型训练
  12. 2022《福布斯》富豪榜发布,FTX联合创始人Gary Wang上榜
  13. led大屏按实际尺寸设计画面_led显示屏尺寸大小要怎么算
  14. tao.opengl + C#
  15. 如何用eclipse读取.txt文件
  16. 如何把带图片html转为doc,教您一招:如何将图片里面的文字转成word格式并能编辑...
  17. 多种多样的Photoshop 的撤消命令
  18. 科三考试邢台市交安考试路线
  19. 中国下一个十年的大趋势
  20. mysql 全文检索_MySQL全文检索

热门文章

  1. 高中数学40分怎么办_高中数学成绩一直在40分左右,怎样提升?高中数学补习怎么补?...
  2. JS instanceof用法
  3. win 和linux
  4. 嵌入式音频架构 - AudioWeaver模块库 Filter 滤波器
  5. 传说她是北京工业大学校花
  6. nor flash之写保护
  7. OneDrive 大文件如何同步上传,利用mklink创建软连接
  8. 利用windowManager在所有窗口之上填出一个界面,类似来电界面。
  9. Linux驱动之usb鼠标
  10. html 公告栏 上下滚动,vue实现公告栏文字上下滚动效果