Mathematical Analysis of 2048, The Game论文分享

2023-11-11 06:38

本文主要是介绍Mathematical Analysis of 2048, The Game论文分享,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

0 摘要

游戏 2048 席卷了互联网,产生了无数的盗版。 世界各地的人们倾注了数百万小时试图创造 2048 棋子。 除了令人上瘾的游戏外,该游戏还提供了探索数学的有趣机会。 本文试图通过数学归纳法、数论、模糊论和拓扑学对博弈进行数学分析,在此过程中也试图找到确保胜利的最优策略。
关键词:数学分析,2048,帕斯卡三角 (Pascals Triangle),优化

1 引言

2048 是由Gabriele Cirulli 开发的滑块益智游戏。 这是一个在 4x4 网格上玩的游戏,棋子编号为 2 n 2^n 2n,其中“n”代表自然数。 游戏的目标是将相同编号的棋子组合在一起,最终形成数字 2048。用户可以在四个基本方向上移动,每次移动后,网格中随机生成一个新的棋子,编号为 2 或 4 概率约为 0.10。 如果至少一个棋子可以滑入一个空白点,或者如果棋子可以在所选方向上组合,则移动是合法的。 当用户没有任何合法移动时,游戏结束。 不禁要问一个问题,既然游戏是基于数学的,是否可以通过应用不同的数学概念来优化移动以提高我们的分数。

2 数学归纳法

在游戏开始时,我们会在随机位置获得两块棋子。 棋子可以用前面讨论的概率编号为 2 或 4。 通过观察,可以看出网格只能包含 2 n 2^n 2n 形式的数字。 我们也可以通过使用数学归纳法在数学上证明这一点。
第一步:一开始给出的棋子都是2,2和4,或者都是4。 总共有 2!2! -1 = 3 例。 这里的数字可以用 2 n 2^n 2n 的形式表示。
第二步:假设经过k步后,网格中的数字可以用 2 n 2^n 2n 的形式表示。
第三步:在第(k+1)步,出现以下情况
I. 我们把棋子滑到一个空的地方,没有棋子相互结合
II. 我们将两个或多个现有的棋子相互组合
III. 案例 1 和 2 的组合
在所有这三种情况下,都会随机生成一个新棋子,编号为 2 或 4,默认情况下可以表示为 2 的幂。

在第一种情况下,除了第 k 步的数字之外,我们只有一个新数字,它都可以用 2 的幂表示。在另一种情况下,由于编号为 2 r 2^r 2r 的棋子将组合成编号为 2 r + 1 2^{r+1} 2r+1 的棋子, 所有的棋子仍然可以用 2 的幂来表示。

所以我们可以说,在任何时候,网格都只有可以用 2 n 2^n 2n 表示的数字。

3 最大棋子

从前面的讨论中,我们知道所有的棋子都是 2 n 2^n 2n 的形式,所以最大的棋子也将是相同的形式。
让我们假设 2 r 2^r 2r r ∈ N r \in N rN 的最大棋子。
要创建此棋子,需要 2 个 2 r − 1 2^{r-1} 2r1 的棋子,要创建 2 r − 1 2^{r-1} 2r1 的图块,需要 2 个 2 r − 2 2^{r-2} 2r2 的图块,依此类推。
棋子的数量受网格上的空间限制,即 16 个空间,这意味着 r = 16 r = 16 r=16
因此,如果我们最后得到 2,则 2 16 = 65536 2^{16}=65536 216=65536 是最大的棋子。
假设我们很幸运,最后得到编号为 4 的棋子; 2 r + 1 2^{r+1} 2r+1 将是最大的棋子。
所以 2 17 = 131072 2^{17}=131072 217=131072 将是最大的棋子。

4 最大可能总和 (Sn)

所有的棋子都是 2 n 2^n 2n 的形式。 假设最好的情况是没有两个相同编号的棋子,并且我们在网格中拥有最高编号的棋子,可以很容易地看到它们将形成一个几何级数(GP)。 此外,由于我们正在考虑最佳情况,我们可以将最小的数字设为 4 而不是 2。总和 Sn 将由下式给出:
S n = 2 2 + 2 3 + 2 4 + … … … + 2 17 = 2 ( 2 17 − 1 ) / ( 2 − 1 ) − 2 1 = 262142 − 2 = 262140 \begin{aligned} \mathrm{S}_{\mathrm{n}} &=2^{2}+2^{3}+2^{4}+\ldots \ldots \ldots+2^{17} \\ &=2\left(2^{17}-1\right) /(2-1)-2^{1} \\ &=262142-2 \\ &=262140 \end{aligned} Sn=22+23+24++217=2(2171)/(21)21=2621422=262140
如果 最后一块是 2 而不是 4,那么总和将是:
S n ′ = 2 1 + 2 3 + 2 4 + … … … + 2 17 = 2 ( 2 17 − 1 ) / ( 2 − 1 ) − 2 2 = 262142 − 4 = 262138 \begin{aligned} \mathrm{S}_{\mathrm{n'}}{ } &=2^{1}+2^{3}+2^{4}+\ldots \ldots \ldots+2^{17} \\ &=2\left(2^{17}-1\right) /(2-1)-2^{2} \\ &=262142-4 \\ &=262138 \end{aligned} Sn=21+23+24++217=2(2171)/(21)22=2621424=262138
或者我们可以做:
S n ′ = 262140 − 2 = 262138 \begin{aligned} \mathrm{S}_{\mathrm{n'}} &=262140-2 \\ &=262138 \end{aligned} Sn=2621402=262138

5 最少获胜回合数 ( T m i n T_{min} Tmin)

通过创建 2048 棋子来赢得游戏(尽管可以选择继续玩,直到没有更多的合法移动)。由于棋子是随机生成的; 2 的概率为 0.9 ( P 2 = 0.9 P_2 = 0.9 P2=0.9) 和 4 的概率为 0.1 ( P 4 = 0.1 P_4 = 0.1 P4=0.1); 我们无法给出 T m i n T_{min} Tmin 的确切数字,但我们可以给出一个范围。

  1. 假设最好的情况是我们得到的所有棋子都是 4 号,并且我们所做的每一步都会导致 2 个棋子合并为 1 个棋子。
    现在,要制作 2048,我们至少需要 512 个棋子( 512 × 4 = 2048 512 \times 4=2048 512×4=2048)。 但是我们从 2 个棋子开始,这意味着我们需要 512-2=510 圈才能获得所有需要的棋子。 我们得到的最后一个棋子必须组合成 8,然后将 8s 组合成 16,将 16s 组合成 32,依此类推,直到我们将 1024s 组合成 2048。
    所以我们得到,
    T min ⁡ = 512 − 2 + 9 = 519 turns  \begin{aligned} \mathrm{T}_{\min } &=512-2+9 \\ &=519 \text { turns } \end{aligned} Tmin=5122+9=519 turns 
    得到所有编号为4的棋子的概率是 0. 1 519 = 1 0 − 519 0.1^{519}=10^{-519} 0.1519=10519

  2. 考虑一个例子,我们得到所有编号为 2 而不是 4 的棋子。如上所述,我们需要 1024 个棋子来生成 2048,然后将我们得到的最后一个棋子与另一个编号为 2 的棋子组合起来,最终得到 2048。
    同理:
    T min ⁡ = 1024 − 2 + 10 = 1032 turns  \begin{aligned} \mathrm{T}_{\min } &=1024-2+10 \\ &=1032 \text { turns } \end{aligned} Tmin=10242+10=1032 turns 
    得到所有 2 个编号的棋子的概率是: 0. 9 1032 ∼ 6.0 × 1 0 − 48 0.9^{1032} \sim 6.0 \times 10^{-48} 0.910326.0×1048
    因此,假设我们玩一场完美的游戏,赢得游戏所需的最少回合数在 [519, 1032]。

这篇关于Mathematical Analysis of 2048, The Game论文分享的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/388202

相关文章

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

Python虚拟环境与Conda使用指南分享

《Python虚拟环境与Conda使用指南分享》:本文主要介绍Python虚拟环境与Conda使用指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python 虚拟环境概述1.1 什么是虚拟环境1.2 为什么需要虚拟环境二、Python 内置的虚拟环境工具

Python处理大量Excel文件的十个技巧分享

《Python处理大量Excel文件的十个技巧分享》每天被大量Excel文件折磨的你看过来!这是一份Python程序员整理的实用技巧,不说废话,直接上干货,文章通过代码示例讲解的非常详细,需要的朋友可... 目录一、批量读取多个Excel文件二、选择性读取工作表和列三、自动调整格式和样式四、智能数据清洗五、

JDK9到JDK21中值得掌握的29个实用特性分享

《JDK9到JDK21中值得掌握的29个实用特性分享》Java的演进节奏从JDK9开始显著加快,每半年一个新版本的发布节奏为Java带来了大量的新特性,本文整理了29个JDK9到JDK21中值得掌握的... 目录JDK 9 模块化与API增强1. 集合工厂方法:一行代码创建不可变集合2. 私有接口方法:接口

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

Python解析器安装指南分享(Mac/Windows/Linux)

《Python解析器安装指南分享(Mac/Windows/Linux)》:本文主要介绍Python解析器安装指南(Mac/Windows/Linux),具有很好的参考价值,希望对大家有所帮助,如有... 目NMNkN录1js. 安装包下载1.1 python 下载官网2.核心安装方式3. MACOS 系统安

Java嵌套for循环优化方案分享

《Java嵌套for循环优化方案分享》介绍了Java中嵌套for循环的优化方法,包括减少循环次数、合并循环、使用更高效的数据结构、并行处理、预处理和缓存、算法优化、尽量减少对象创建以及本地变量优化,通... 目录Java 嵌套 for 循环优化方案1. 减少循环次数2. 合并循环3. 使用更高效的数据结构4