启发式算法解魔方——python

news2024/9/24 17:19:17

未完待续,填坑ing……

魔方操作的表示——辛马斯特标记

辛马斯特标记(Singmaster Notation)是一种用于描述魔方和类似拼图的转动操作的标记系统。它以大卫·辛马斯特(David Singmaster)的名字命名,辛马斯特标记系统使用单个字符来代表特定的转动动作。
在这里插入图片描述

魔方状态数

不考虑复原的组合数

首先,如果有魔方拆装并尝试复原经验,可以知道并不是每次把魔方拆了再装回去都可以复原的。先不考虑是否可以复原,单纯用排列组合计算三阶魔方的状态数:

  1. 8个角块,有8! 个位置的排列组合;在每个位置上,角块有3种方向,共3^8种方向
  2. 12个棱块,有12! 个位置的排列组合;在每个位置上,棱块有2种方向,共2^12种方向

所以不考虑复原时,共有这么多种状态:
8 ! × 3 8 × 12 ! × 2 12 = 519 , 024 , 039 , 293 , 878 , 272 , 000 8!\times3^8\times12!\times2^{12}=519,024,039,293,878,272,000 8!×38×12!×212=519,024,039,293,878,272,000

考虑复原的组合数

为什么随便拼装的魔方不一定可以复原呢,因为魔方从一个复原的状态,经过合法的转动后,到达不了这些无法复原的状态,这是最朴素的想法。

实际上,魔方是一个群,而且是一个置换群。

群的定义

在抽象代数中,群是一种代数结构,它由一个集合以及在这个集合上定义的一个二元运算组成。一个群需要满足以下四个条件,这些条件通常被称为群的公理:

  1. 封闭性:对于群G中的任意两个元素a和b,它们的组合ab也必须属于G。
  2. 结合律:对于群G中的任意三个元素a、b和c,组合(ab)c和a(bc)得到的结果必须相等。
  3. 存在单位元:群G中存在一个元素e,对于任意元素a,都有ae = ea = a。
  4. 存在逆元:对于群G中的任意元素a,存在一个元素b,使得ab = ba = e,其中e是群G的单位元。

当我们将群的定义应用于自然数集合(包括0)和加法运算时,我们得到了一个典型的例子。

  1. 封闭性:对于任意两个自然数a和b,它们的和a + b也是一个自然数,因此加法在自然数集合上是封闭的。
  2. 结合律:对于任意三个自然数a、b和c,有(a + b) + c = a + (b + c),因此加法满足结合律。
  3. 存在单位元:自然数集合中的单位元是0,对于任意自然数a,有a + 0 = 0 + a = a。
  4. 存在逆元:对于任意自然数a,存在一个逆元-b,使得a + (-a) = (-a) + a = 0。

因此,自然数集合和加法运算构成了一个满足群的所有条件的代数结构。

置换群的定义

简而言之,如果有一个群S,对群中元素作不同的映射得到不同的新群,且这些新群之间又满足群的定义,那么群S就是置换群。


例:
假如有一个三角形,构成一个群S:
在这里插入图片描述

对其进行旋转(0°、120°、240°),翻转(沿12、沿13、沿23)操作,得到:

在这里插入图片描述
这些操作本身也符合群的定义:操作之间符合封闭性、结合律、有幺元和逆元
在这里插入图片描述
那么群S就称之为置换群

奇置换和偶置换

  1. 偶置换是指包含偶数个置换的置换,而奇置换则是指包含奇数个置换的置换。
  2. 在一个置换群中,奇置换和偶置换构成了两个不相交的子集。
  • 置换的复合
    两个偶置换的复合是偶的
    两个奇置换的复合是偶的
    一个奇置换与偶置换的复合是奇的

一个奇置换的例子:
在这里插入图片描述
来自:https://blog.csdn.net/weixin_46645613/article/details/117479516

上图中讲述两个排列怎么发生的置换操作,应该很清楚明了了,这在数学中记为 ( 1 2 3 4 4 1 2 3 ) = ( 12 ) ( 13 ) ( 14 ) \begin{pmatrix}1&2&3&4\\4&1&2&3\end{pmatrix}=(12)(13)(14) (14213243)=(12)(13)(14),表示这个置换可以分解成 3 次对换,所以是一个奇置换。也可以这么看,只经过一次对换操作是奇置换,上述置换由 3 个奇置换复合,所以合起来也为奇置换。

魔方与置换群

  • 对魔方进行一次90度的旋转, ( 012 345 789 ) − > ( 730 841 952 ) \left(\begin{array}{c}012\\345\\789\end{array}\right)->\left(\begin{array}{c}730\\841\\952\end{array}\right) 012345789 > 730841952 ,也就是四个角块顺时针旋转(3次置换),四个棱块顺时针旋转(3次置换),共6次置换,是偶置换

也就是说,从魔方复原的状态进行合法的旋转,都是进行偶置换,而在一个置换群中,奇置换和偶置换构成了两个不相交的子集,所以魔方随意组装的时候只有1/2的概率可以通过合法旋转复原。

同时易知,魔方无法通过合法旋转交换单独一对棱块或者角块而不影响其他棱块和角块的位置,因为单独交换是一种奇置换,而魔方旋转是偶置换。

考虑复原的组合数

不能复原的情况有

  1. 单棱翻转(1/2)——单独翻转这个棱块是一个奇置换
  2. 单角块翻转(2/3)——单独翻转这个角块是一个奇置换
  3. 单棱块位置翻转(1/2)——单独交换这两个棱块的位置是一个奇置换

问:为什么只有棱块会出现只交换一对棱块的情况,角块不会出现只交换一对角块的情况吗?

https://www.zhihu.com/tardis/bd/art/57444167
A:这个问题很好,角块一样也会出现只交换一对角块的情况,但是学过PLL公式的同学都知道,角块和棱块交换情况是可以互相转换的(例如PLL邻角对棱换)。所以角块错误的情况可以转化为棱块的错误情况

所以考虑复原的状态数要在不考虑复原的组合数基础上,乘以能复原的情况概率
( 1 − 1 / 2 ) × ( 1 − 2 / 3 ) × ( 1 − 1 / 2 ) = 1 / 12 (1-1/2)\times(1-2/3)\times(1-1/2)=1/12 (11/2)×(12/3)×(11/2)=1/12

为:
3 8 × 8 ! × 2 12 × 12 ! 12 = 43 , 252 , 003 , 274 , 489 , 856 , 000 \frac{3^8\times8!\times2^{12}\times12!}{12}=43,252,003,274,489,856,000 1238×8!×212×12!=43,252,003,274,489,856,000

魔方棱块角块方向的定义

这里使用 kociemba 二阶段算法来进行方向的的定义


首先规定:
U黄
D白
F红
B橙
L蓝
R绿

  • UD颜色为高级色、LR颜色为次高级色

棱块

参照色的选择

  • 如果一个棱块含黄色或者白色的两种高级色(意味着其为U或者D的棱块),那么使用其含有的高级色作为其参照色
  • 如果不含高级色只含次高级色,那么使用次高级色作为参照色

根据参照色及位置进行方向的确定

  • 当棱块位于顶层或者底层,那么如果参照色也位于顶层或者底层,则该棱块规定方向为0,否则为1
  • 当棱块位于中间层,那么当参照色位于次高级面,则规定该棱块方向为1,否则为0

在这里插入图片描述
对于上面这张图来说,上面的棱块参照色为高级色白色,且参照色在高级色面U上,所以方向为0;而下面的棱块参照色为次高级色绿色,且参照色在次高级色面R上,所以方向也为0。

在这里插入图片描述
而对这张图来说,进行了一次旋转。此时上面的棱块参照色是绿色次高级色,其位于顶层但是参照色不位于顶层,所以方向为1;而下面的棱块的参照色是白色高级色,其位于中间层但是参照色不位于次高级面L或者R,所以方向也为1。

角块

也规定顶层底层为高级层,颜色为高级色


由于角块一定含有顶层或者底层颜色,故将其顶层或者底层颜色规定为参照色,根据参照色与高级层的相对位置对方向进行规定:

  • 只要参照色在高级层上,角块方向为0
  • 参照色相对高级层顺时针扭转,角块方向为1
  • 参照色相对高级层逆时针扭转,角块方向为2

在这里插入图片描述
如上图,白色为参照色,其位于顶层,高级面为黄色。

  • 最左边魔方角块参照色在高级面上,这个角块方向为0
  • 中间魔方角块参照色相对高级面顺时针旋转,这个角块方向为1
  • 最右边魔方角块参照色相对高级面逆时针旋转,这个角块方向为2

kociemba二阶段算法

kociemba二阶段算法是一种降群法。

  • 一阶段:将魔方角块方向、棱块方向都归0,且中层的棱块只位于中层
  • 二阶段:将角块、顶底层棱块、中间棱块归位

一阶段方向归零

可用的操作有:U,R,F,D,L,B

如何保证二阶段求解时角块棱块方向不变

对于使用了kociemba定义方向的魔方来说:

  • 角块方向:只有U、D层的旋转不改变角块方向
  • 棱块方向:规定了次高级面后,次高级面的旋转会改变棱块方向,如(L、R),但是如果旋转两次(L2、R2)改变两次棱块方向,相当于棱块方向没改变;而非次高级面(F、B)的旋转并不改变棱块方向

次高级面可以规定为(L、R)或者(F、B)


所以,二阶段如果要在一阶段方向都归零的情况下对棱块和角块进行归位,可用的操作只有U,D,L2,R2,F2,B2。

搜索算法

kociemba 使用 IDA* 算法进行搜索。

A*算法

A* 算法,就是一种考虑了实际代价和估计代价的BFS。其在每一种状态下计算所有可能的操作的代价,代价小的优先搜索。

常被用于解决八数码问题,详情看我这篇文章:八数码问题——A*算法的应用(A-Star)

IDA*算法

IDA*算法,是一种有限制搜索深度的DFS。其设定好一个限制,在一种状态下计算其一种可能的操作代价,然后进入下一个状态并继续计算再下一个状态,直到深度到达设定的限制。在到达限制之前,如果找到目标,直接返回;如果到达限制了还没找到目标,则返回上一个节点,进行其他分支的深度搜索。

IDA算法适用于状态空间特别大的问题。因为这类问题的状态空间过大,使用BFS需要一次性扩展所有当前层的节点,这可能会导致搜索空间过大,耗费大量时间和计算资源;而IDA算法可以通过迭代加深搜索的方式逐渐扩大搜索范围,减少搜索时间和占用内存。

  • IDA*算法框架
# 定义一个全局变量,用于表示无穷大的值
INFINITY = 999999999

# IDA*算法的入口函数
function IDA_Star(root):
    # 初始化阈值为启发式函数计算的代价
    bound = heuristic_cost(root)
    while True:
        # 调用search函数进行搜索
        t = search(root, 0, bound)
        # 如果找到目标状态,返回结果
        if t == FOUND:
            return FOUND
        # 如果搜索范围超出限制,返回未找到
        if t == INFINITY:
            return NOT_FOUND
        # 更新阈值
        bound = t

# IDA*算法的搜索函数
function search(node, g, bound):
    # 计算当前节点的f值(g + 启发式函数值)
    f = g + heuristic_cost(node)
    # 如果f值超过阈值,返回f值
    if f > bound:
        return f
    # 如果当前节点是目标状态,返回找到目标
    if node is goal:
        return FOUND
    # 初始化一个最小代价为无穷大的值
    min = INFINITY
    # 遍历当前节点的后继节点
    for each successor in generate_successors(node):
        # 递归搜索后继节点
        t = search(successor, g + cost(node, successor), bound)
        # 如果找到目标状态,返回找到目标
        if t == FOUND:
            return FOUND
        # 更新最小代价
        if t < min:
            min = t
    # 返回最小代价
    return min

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

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

相关文章

商城数据库88张表结构完整示意图81~88及总览图(十六)

八十一&#xff1a; 八十二&#xff1a; 八十三&#xff1a; 八十四&#xff1a; 八十五&#xff1a; 八十六&#xff1a; 八十七&#xff1a; 八十八&#xff1a; 总览图&#xff1a;

JVM调优--理论篇

在对Java应用进行性能优化时&#xff0c;JVM的调优是一个绕不开的话题。本文重点介绍下如何对JVM进行调优&#xff0c;以期提高Java应用的性能、稳定性、响应时间等性能目标。JVM的调优过程符合Java应用的调优过程&#xff0c;主要分为三步&#xff1a;性能监控、性能分析、性能…

MES系统:优化生产执行,实现高效、灵活的制造管理

MES系统作为操作执行层可以缩短排产周期&#xff0c;解决紧急插单问题&#xff1b;通过计划、采集、管控等功能来改进生产执行&#xff1b;与实际生产即时接轨车间时间驱动上层的商务活动。 MES系统包含基础数据、物料和工艺管理、生产过程管理、APS排产、人员管理、设备与工具…

CPU炼丹——YOLOv5s

1.Anaconda安装与配置 1.1安装与配置 Anaconda3的安装看下面的教程&#xff1a; 最新Anaconda3的安装配置及使用教程&#xff08;详细过程&#xff09;http://t.csdnimg.cn/yygXD&#xff0c;接上面文章下载后&#xff0c;配置环境变量的时候记得在原来你装的Python更下面添…

详解LLMOps,将DevOps用于大语言模型开发

大家好&#xff0c;在机器学习领域&#xff0c;随着技术的不断发展&#xff0c;将大型语言模型&#xff08;LLMs&#xff09;集成到商业产品中已成为一种趋势&#xff0c;同时也带来了许多挑战。为了有效应对这些挑战&#xff0c;数据科学家们转向了一种新型的DevOps实践LLM-OP…

质因数分解(cpp实现)--一种快速求得一个数有多少个因子的黑魔法

前言 最近机试没少吃不会质因数分解的亏&#xff0c;用传统的求得因子个数只能过一点点…(ex, 20%) 质因数分解后&#xff0c;可以将因子问题转化为 集合的组合问题&#xff0c;因此会很快&#xff0c;目测是 l o g n log n logn (n是该整数的值)。 传统解法 假设输入整数的…

【JavaEE网络】从数据链路层到应用层的DNS

目录 数据链路层以太网 DNS 数据链路层 越往下与程序员越远 代表协议&#xff1a;以太网。平常用的网线也叫“以太网线”&#xff0c;平常用的交换机也叫“以太网交换机” 以太网 认识以太网 “以太网” 不是一种具体的网络&#xff0c;而是一种技术标准&#xff1b;既包含…

MySql#MySql安装和配置

目录 一、卸载不需要的环境 二、安装mysql yum 源 三、开始安装 四、如果保证安装成功呢&#xff1f; 五、MySql 启动&#xff01; 六、登录mysql 七、配置文件说明 八、设置开机启动&#xff01; 本次安装是在Linux环境在centos7中完成 首先先将自己切换成root 一、…

【EI会议|稳定检索】2024年能源资源与动力、控制工程国际会议(ICERPCE 2024)

2024 International Conference on Energy Resources and Power, Control Engineering 一、大会信息 会议名称&#xff1a;2024年能源资源与动力、控制工程国际会议 会议简称&#xff1a;ICERPCE 2024 收录检索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等 会议官…

深入解析算法效率核心:时间与空间复杂度概览及优化策略

算法复杂度&#xff0c;即时间复杂度与空间复杂度&#xff0c;衡量算法运行时资源消耗。时间复杂度反映执行时间随数据规模增长的关系&#xff0c;空间复杂度表明额外内存需求。优化策略&#xff0c;如选择合适数据结构、算法改进、循环展开等&#xff0c;对于提升程序效率、减…

【高阶数据结构(一)】并查集详解

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:高阶数据结构专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Go语言知识   &#x1f51d;&#x1f51d; 高阶数据结构 1. 前言2. 并查集…

【vue+echarts】绘制中国地图,3D地图,省、市、县三级下钻以及回钻,南海诸岛小窗化显示,点位飞线图,点位名称弹窗轮播展示,及一些常见问题

先看效果展示图 目录 准备工作一, 绘制3D地图1,调用官网地址接口获取2,去官网下载中国地图的json数据到本地,本地引入 二, 南海诸岛小窗化显示1, 手动过滤掉,只保留小窗化的南海诸岛2, 代码层面过滤掉,只保留小窗化的南海诸岛 三, 省、市、县三级地图下钻及回钻1, 下钻2, 回钻…

深度学习 --- stanford cs231学习笔记(一)

stanford cs231学习笔记(一) 1&#xff0c;先是讲到了机器学习中的kNN算法&#xff0c;然后因为kNN分类器的一些弊端&#xff0c;引入了线性分类器。 kNN算法的三大弊端&#xff1a; (1)&#xff0c;计算量大&#xff0c;当特征比较多时表示性差 (2)&#xff0c;训练时耗时少…

C++初阶之模板初阶

一、泛型编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp left;left right;right temp; } void Swap(char& left,…

sql编写规范(word原件)

编写本文档的目的是保证在开发过程中产出高效、格式统一、易阅读、易维护的SQL代码。 1 编写目的 2 SQL书写规范 3 SQL编写原则 软件全套资料获取进主页或者本文末个人名片直接获取。

[Java、Android面试]_22_APP启动流程(中频问答)

欢迎查看合集&#xff1a; Java、Android面试高频系列文章合集 本人今年参加了很多面试&#xff0c;也有幸拿到了一些大厂的offer&#xff0c;整理了众多面试资料&#xff0c;后续还会分享众多面试资料。 整理成了面试系列&#xff0c;由于时间有限&#xff0c;每天整理一点&am…

偏微分方程算法之混合边界条件下的差分法

目录 一、研究目标 二、理论推导 三、算例实现 四、结论 一、研究目标 我们在前几节中介绍了Poisson方程的边值问题&#xff0c;接下来对椭圆型偏微分方程的混合边值问题进行探讨&#xff0c;研究对象为&#xff1a; 其中&#xff0c;为矩形区域&#xff0c;为上的连续函数…

毕业设计参考-PyQt5-YOLOv8-鱼头鱼尾鱼长测量程序,OpenCV、Modbus通信、YOLO目标检测综合应用

“PyQt5-YOLOv8-鱼头鱼尾鱼长测量程序”是一个特定的软件程序&#xff0c;用于通过图像处理和目标检测技术来测量鱼类的长度。 视频效果&#xff1a; 【毕业设计】基于yolo算法与传统机器视觉的鱼头鱼尾识别_哔哩哔哩_bilibili 这个程序结合了多种技术&#xff1a; 1. OpenCV…

【数据结构(邓俊辉)学习笔记】列表03——有序列表

文章目录 0. 概述1. 唯一化2. 查找2.1 实现2.2 顺序查找2.3 复杂度 0. 概述 介绍下有序列表。 若列表中所有节点的逻辑次序与其大小次序完全一致&#xff0c;则称作有序列表&#xff08;sorted list&#xff09;。为保证节点之间可以定义次序&#xff0c;依然假定元素类型T直接…

【一刷《剑指Offer》】面试题 12:打印 1 到最大的 n 位数

力扣对应题目链接&#xff1a;LCR 135. 报数 - 力扣&#xff08;LeetCode&#xff09; 牛客对应题目链接&#xff1a;打印从1到最大的n位数_牛客题霸_牛客网 (nowcoder.com) 一、《剑指Offer》内容 二、分析题目 1、暴力解法 2、用字符串模拟数字加法 首先要考虑当 n 很大时&…