实战项目:通过自我学习让AI学习五子棋 - 1 - 项目定义

项目介绍

五子棋是一种博弈游戏。在棋盘上黑子和白子交替落子,先于在任何方向上将至少五个棋子连在一起的一方获胜。在我们这个项目中我们尝试使用自学习的方法训练出一套走五子棋的算法。

这个项目本身并无特别大的实用价值。我们的目的在于:

  • 尝试自我学习的方法,从实践中了解实际应用该想法的挑战和可能性
  • 出于娱乐的目的,后期我们可以为该算法开发出一个UI,从而发布一个属于我们自己的五子棋游戏
  • 相同的算法未来可以被应用以解决多个不同的问题

项目需求

我们对本项目有以下的需求:

  • 分别针对先手和后手,产生出一套具有一定智能的五子棋算法
  • 棋盘的大小为15行和15列
  • 该算法可以被用来和某个UI即成以形成一个真正可以使用的电脑棋类小游戏
  • 因为仅仅是学习的目的,这里的五子棋即是一般业余规则的五子棋,也就是没有任何限制的五子棋规则
  • UI是可选的。我们先关注在后端任务,也是必要的任务的完成。根据具体的情况决定是否制作一个UI以更好的理解算法

算法描述

对于五子棋(或者任何一种棋类游戏),我们可以把它看成是一种状态转移的游戏。也就是说我们可以把当前的棋盘看成是当先状态。当我们在某个位置落子之后,棋盘就转移到下一个状态。因为棋盘上可能会有多个可供选择的落子店,也就是说有多个可供选择的未来状态,我们算法的任务就是从其中选择最优的(或者是较优的)状态进行转移。

假如是基于规则的算法,我们会预先根据各种情况定义很多规则来决定应该转移到哪一个未来状态。比如,如果我们下在一个位置就可以直接赢下比赛,我们就应该直接下载那个位置;否则如果对手下在一个位置就直接赢下比赛,我们应该考虑先占有那个位置,等等。在这里我们想尝试使用另一种算法,让机器通过自我对弈最终产生一个较优的算法。

在描述算法思路前,我们先定义几个术语:

  • 状态:棋盘上黑白双方全部落子的位置的集合
  • 当前状态:在当前的最新状态
  • 下一状态:在当前棋盘上任何一空白处落子后所形成的状态
  • 状态转移策略:决定从当前状态转移到哪一个下一状态的决定

我们的算法思路如下:

  1. 获取当前棋盘所对应的状态信息;
  2. 在当前状态所对应的所有下一状态集合中,随机选择最优状态中的一个,并将当前状态转移到下一状态;
  3. 如果棋局已经结束,对于赢的一方所有被选择的策略权重加一,对于输的一方所有被选择的策略权重减一;否则重新进入步骤1。

在这个算法中,我们看到如果某一个状态转移策略失误,最终导致棋局落败,那个该策略的权重就会被降低;相反,如果一个策略是较优的策略,也就是最后导致赢下了棋局,该策略的权重就会提升。当然,更多的情况我们会看到好的策略和不好的策略共同出现在一个棋局中。我们希望通过足够多的对弈最终让好的转移策略和不好的转移策略可以区分开,这也就是学习的过程。

项目架构

我们的程序是一个单机程序。大体上我们可以认为我们的程序可以分为三个层次,如下图所示:

  • UI Controller:获取并在UI上显示当前的状态
  • Policy Engine:更具当前的状态和历史的策略权重,决定转移到哪一个下一状态
  • DAO:即data-access-object,负责从文件读取历史状态和转移策略的信息和将新的状态和转移策略写入到文件中

技术选择

  • 后端编程语言:python
  • 前端编程语言:[pygame](https://www.pygame.org/news)
  • 状态和转移策略的存储:文件


相关资源

  • codes repository
  • project track

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/60311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从0开始搭建一个生产级SpringBoot2.0.X项目(十二)SpringBoot接口SpringSecurity JWT鉴权

前言 最近有个想法想整理一个内容比较完整springboot项目初始化Demo。 SpringBoot接口权限控制 SpringSecurity 接口使用 Bearer token类型 JWT 鉴权 一、pom文件新增依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>s…

JavaEE初阶---properties类+反射+注解

文章目录 1.配置文件properities2.快速上手3.常见方法3.1读取配置文件3.2获取k-v值3.3修改k-v值3.4unicode的说明 4.反射的引入4.1传统写法4.2反射的写法&#xff08;初识&#xff09;4.3反射的介绍4.4获得class类的方法4.5所有类型的class对象4.6类加载过程4.7类初始化的过程4…

【React】深入理解 JSX语法

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 深入理解 JSX语法1. JSX 简介2. JSX 的基本语法2.1 基本结构2.2 与普通 JavaScr…

Spark中给读取到的数据 的列 重命名的几种方式!

目录 一、第一种 (withColumnRenamed) 二、第二种&#xff08;toDF&#xff09; 三、第三种&#xff08; toDF(*tuple1) &#xff09; 四、 第四种(schema) 五、假如文件里自带有列名的情况&#xff08;option&#xff09; 一、第一种 (withColumnRenamed) 假设要把如下…

M1M2 MAC安装windows11 虚拟机的全过程

M1/M2 MAC安装windows11 虚拟机的全过程 这两天折腾了一下windows11 arm架构的虚拟机&#xff0c;将途中遇到的坑总结一下。 1、虚拟机软件&#xff1a;vmware fusion 13.6 或者 parallel 19 &#xff1f; 结论是&#xff1a;用parellel 19。 这两个软件都安装过&#xff0…

IEEE JSSC更新|Tiny Tapeout:让每个人都能设计定制芯片

简介 由于成本高昂且需要专业技术&#xff0c;设计和制造定制集成电路的传统上仅限于大型公司和机构。然而&#xff0c;名为Tiny Tapeout的创新项目正在改变这一现状&#xff0c;让业余爱好者、学生和小型团队也能设计定制芯片。本文将探讨Tiny Tapeout的工作原理&#xff0c;以…

Java:一段代码,无限可能

Java&#xff0c;诞生于1995年&#xff0c;如今已走过近三十载春秋。它历经互联网泡沫的兴衰、移动互联网的浪潮&#xff0c;以及云计算和大数据的洗礼&#xff0c;依然屹立在编程语言的舞台中央&#xff0c;散发着耀眼的光芒。这篇文章将带你回顾Java的辉煌历史&#xff0c;探…

《XGBoost算法的原理推导》12-14决策树复杂度的正则化项 公式解析

本文是将文章《XGBoost算法的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 我们定义一颗树的复杂度 Ω Ω Ω&#xff0c;它由两部分组成&#xff1a; 叶子结点的数量&#xff1b;叶子结点权重向量的 L 2 L2 L2范数&#xff1b; 公式(…

Linux【基础篇】

-- 原生罪 linux的入门安装学习 什么是操作系统&#xff1f; 用户通过操作系统和计算机硬件联系使用。桥梁~ 什么是Linux&#xff1f; 他是一套开放源代码&#xff08;在互联网上找到Linux系统的源代码&#xff0c;C语言写出的软件&#xff09;&#xff0c;可以自由 传播&…

大数据技术在智慧医疗中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 大数据技术在智慧医疗中的应用 大数据技术在智慧医疗中的应用 大数据技术在智慧医疗中的应用 引言 大数据技术概述 定义与原理 发…

Linux(CentOS)安装 MySQL

CentOS版本&#xff1a;CentOS 7 三种安装方式&#xff1a; 一、通过 yum 安装&#xff0c;最简单&#xff0c;一键安装&#xff0c;全程无忧。 二、通过 rpm 包安装&#xff0c;需具备基础概念及常规操作。 三、通过 gz 包安装&#xff0c;需具备配置相关操作。 --------…

CSS如何改变滚动条的颜色样式粗细?

默认滚动条很丑怎么办&#xff1f;如何改版滚动条的粗细&#xff0c;颜色&#xff0c;让它更美观&#xff1f;CSS如何改变滚动条的粗细&#xff1f; 干货来了 /* Webkit内核浏览器的滚动条样式 */ ::-webkit-scrollbar {width: 4px; /* 设置滚动条的宽度 */ }::-webkit-scroll…

YOLOv11(Ultralytics)可视化界面ui设计,基于pyqt5,单文件即插即用,支持文件夹检测及云摄像头检测并保存

本文的可视化界面对于YOLOv11/Ultralytics/YOLOv8的检测、分割、分类、姿势估算&#xff08;detection, segmentation, obb, classification, and pose estimation&#xff09;等均可正常显示。本次新增了图片及视频的保存&#xff0c;可以选择传入文件夹进行检测并显示&#x…

用python开发坦克大战重制版

Python 开发坦克大战重制版&#xff1a;全面教程 引言 坦克大战是一款经典的街机游戏&#xff0c;自1985年首次推出以来&#xff0c;便吸引了无数玩家。随着时间的推移&#xff0c;许多游戏开发者开始尝试重制这款经典游戏。本文将指导你如何使用 Python 和 Pygame 库开发一个…

链式结构二叉树

数据结构 结点申请 树&#x1f332;行结构 前中后序遍历 二叉树结点个数 二叉树叶子节点个数 第k层结点个数 二叉树深度 二叉树查找值为x的结点 二叉树销毁

【2024软考架构案例题】你知道什么是 RESTful 风格吗?

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

#渗透测试#SRC漏洞挖掘#深入挖掘CSRF漏洞02

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

自动驾驶革命:从特斯拉到百度,谁将主宰未来交通?

内容概要 自动驾驶技术正在经历一个前所未有的革命性变化&#xff0c;各大企业纷纷抢占这一充满潜力的新市场。以特斯拉和百度为代表的行业巨头&#xff0c;正利用各自的优势在这一技术的赛道上展开激烈竞争。特斯拉凭借其在电动汽车和自动驾驶领域的前瞻性设计与不断革新的技…

反向代理开发

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

简记Vue3(五)—— Pinia

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…