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

相关文章

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

MySQL8.2.0安装教程分享

《MySQL8.2.0安装教程分享》这篇文章详细介绍了如何在Windows系统上安装MySQL数据库软件,包括下载、安装、配置和设置环境变量的步骤... 目录mysql的安装图文1.python访问网址2javascript.点击3.进入Downloads向下滑动4.选择Community Server5.

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

10个Python自动化办公的脚本分享

《10个Python自动化办公的脚本分享》在日常办公中,我们常常会被繁琐、重复的任务占据大量时间,本文为大家分享了10个实用的Python自动化办公案例及源码,希望对大家有所帮助... 目录1. 批量处理 Excel 文件2. 自动发送邮件3. 批量重命名文件4. 数据清洗5. 生成 PPT6. 自动化测试

10个Python Excel自动化脚本分享

《10个PythonExcel自动化脚本分享》在数据处理和分析的过程中,Excel文件是我们日常工作中常见的格式,本文将分享10个实用的Excel自动化脚本,希望可以帮助大家更轻松地掌握这些技能... 目录1. Excel单元格批量填充2. 设置行高与列宽3. 根据条件删除行4. 创建新的Excel工作表5

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

将Python应用部署到生产环境的小技巧分享

《将Python应用部署到生产环境的小技巧分享》文章主要讲述了在将Python应用程序部署到生产环境之前,需要进行的准备工作和最佳实践,包括心态调整、代码审查、测试覆盖率提升、配置文件优化、日志记录完... 目录部署前夜:从开发到生产的心理准备与检查清单环境搭建:打造稳固的应用运行平台自动化流水线:让部署像

C#读取本地网络配置信息全攻略分享

《C#读取本地网络配置信息全攻略分享》在当今数字化时代,网络已深度融入我们生活与工作的方方面面,对于软件开发而言,掌握本地计算机的网络配置信息显得尤为关键,而在C#编程的世界里,我们又该如何巧妙地读取... 目录一、引言二、C# 读取本地网络配置信息的基础准备2.1 引入关键命名空间2.2 理解核心类与方法

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作