首页 > 编程问答 >在 python 中表示矩阵等价类的好方法是什么?

在 python 中表示矩阵等价类的好方法是什么?

时间:2024-07-22 14:57:21浏览次数:9  
标签:python reinforcement-learning

我正在尝试编写一个程序来对井字棋进行强化学习。我希望引擎认识到,如果您反射棋盘或旋转它,您会得到完全相同的游戏,因此这些棋盘应该被视为彼此相同。

目前我有一本字典,代表我当前对每个棋盘的估计估值游戏中的棋盘,每次游戏结束时,该游戏期间发生的所有棋盘位置的估值都会根据它们是否导致胜利或导致失败进行更新。

我想要一种方法来实现这一点所有的旋转和反射都会组合在一起,这样一个更新也会更新所有其他的。

我当前的策略是生成一块板的所有可能的旋转和反射,将它们放在一组中,然后把这个集合变成一个冻结集合,这样我就可以用它作为字典中的键。我认为这应该可行,但是使用冻结集感觉非常危险。

我很好奇还有什么其他方法可以解决这个问题。而且,如果我对冰冻套装的感觉是“狡猾的”,有任何优点,或者只是一些愚蠢的心理障碍,我应该克服。每当我使用某种不为人所知的 python 结构时,我经常有这种感觉。


在 Python 中表示井字棋的等价类的想法不错,冻结集合是一个合理的选择。以下是对的方法的改进以及一些替代方案:

1. 使用冻结集合(推荐)

的直觉是正确的,冻结集合非常适合这个任务。它们是不可变的,这意味着一旦创建就不能更改,这使得它们可以安全地用作字典键。以下是它的工作原理:

import numpy as np
from functools import reduce

def generate_equivalences(board):
  """生成棋盘的所有旋转和反射。"""
  base_board = np.array(board)
  equivalences = [base_board]
  for _ in range(3):
    base_board = np.rot90(base_board)
    equivalences.append(base_board)
  equivalences.append(np.fliplr(base_board))  # 水平翻转
  equivalences.append(np.flipud(base_board))  # 垂直翻转
  return [frozenset(board.flatten()) for board in equivalences]

# 示例用法
board = [
  ['X', 'O', ' '],
  [' ', 'X', ' '],
  [' ', ' ', 'O']
]

equivalence_class = generate_equivalences(board)

# 使用冻结集合作为字典键
value_function = {}
value_function[equivalence_class[0]] = 0.5  # 示例值

# 检查等价类是否在字典中
if equivalence_class[1] in value_function:
  print("找到等价棋盘!") 

为什么冻结集合适合此任务?

  • 不可变性: 冻结集合是不可变的,因此可以作为字典键使用。
  • 散列: 冻结集合是可散列的,因此可以有效地在字典中查找。
  • 清晰度: 冻结集合清楚地表明,将一组唯一元素视为一个组,并且该组的顺序无关紧要。

2. 整数表示

另一种方法是将每个棋盘表示为一个唯一的整数,该整数考虑了其对称性。这可以通过为每个单元格分配一个三进制(0、1、2)值并将棋盘视为三进制数来实现。然后,可以计算所有等价棋盘的整数表示形式,并使用最小的整数作为规范表示形式。这种方法效率很高,但不如冻结集合直观。

3. 自定义类

可以创建一个自定义类来表示棋盘等价类。此类可以存储棋盘的规范表示形式(例如,规范方向的二维数组)并覆盖 __hash__ __eq__ 方法以确保正确处理等价性。这种方法更加灵活,但需要更多代码。

结论

对于大多数情况,使用冻结集合是表示井字棋的等价类的一个好的解决方案。它既高效又易于理解。如果担心性能或需要更复杂的表示,可以考虑使用整数表示或自定义类。

请记住,理解数据结构背后的概念比坚持“正确”答案更重要。如果对冻结集合感到满意并且它们适合的需求,那么请放心地使用它们!

标签:python,reinforcement-learning
From: 78710425

相关文章

  • MIT自学---python---6.100A_lecture2
    MIT自学---python---6.100A_lecture2前言一、设置python编译器地址二、将运行python文件的命令简化三、终端尝试执行简单python命令四、今日学到的python命令个人总结前言  这两天去听讲座,没什么时间按照计划自学MIT,今天赶紧补上。今天主要任务是搭建vscodepython......
  • python pip 需要构建工具,而它已经安装
    我看到这个问题已经被发布了很多次,人们设法解决了这个问题,但我没有!!操作系统版本:Windows1021H1Build19043.1288Python版本:Python3.9.7(tags/v3.9.7:1016ef3,Aug302021,20:19:38)[MSCv.192964bit(AMD64)]onwin32Pip、wheel和setuptool都可以日期:......
  • 无法在浏览器中访问Python 127.0.0.1:8000上的本地主机
    fromdjango.contribimportadminfromdjango.urlsimportpath,includeurlpatterns=[path('admin/',admin.site.urls),path('products/'),include('products.urls')#thisline]嗨,任何人。很抱歉问这样的问题,但这是我第一次尝试python。......
  • 在 VSCode 中通过 Python 使用 YouTube API 时如何启用 Intellisense
    我想在使用GoogleYouTubeAPI和Python时在VSCode中获得IntelliSense。但我不知道详细步骤。fromgoogleapiclient.discoveryimportbuildapi_key="****"youtube=build("youtube","v3",developerKey=api_key)request=youtube.channels().list(part......
  • 当 python 脚本通过 jenkins + Github 在 Windows 本地计算机上运行时,chrome 浏览器不
    我的Python代码是(windowsMachine)fromseleniumimportwebdriverprint("newLine")print("2Line")print("3Line")holdChrome=webdriver.ChromeOptions()holdChrome.add_experimental_option("detach",True)#Restricta......
  • python_基础_数据类型
    基础数据类型不需要声明,只有被赋值后才会创建变量。变量本身没有类型,“类型”指的是所存值的类型。类型判断type(x)和isinstance(x,int)前者不会认为子类是一种他的父类类型后者会认为子类是父类类型>>>classA:...pass...>>>classB(A):...pass......
  • IPython 使用技巧
    IPython是一个强大的交互式Pythonshell,提供了许多方便的功能,使Python编程更加高效和愉快。本文将介绍一些IPython的实用技巧,帮助开发者充分利用其功能,提高编程效率。1.基本操作和快捷键1.1启动IPython可以通过在终端输入以下命令来启动IPython:ipython启动后,你......
  • 【python】类方法和静态方法的区别
    类方法和静态方法在Python中都可以用来定义与类相关的功能,但它们有不同的使用场景和优缺点。虽然类方法也可以用来实现验证逻辑,但静态方法在某些情况下更合适。让我们详细看看这两种方法的区别以及为什么在某些情况下静态方法可能更适合验证功能。类方法和静态方法的区别类......
  • Python自动化:一键提取千万个Excel指定数据
    一、传统方法的局限性打开每个Excel文件,逐个查找需要的数据。筛选出老板需要的数据列。复制并粘贴到新的工作表中。保存并关闭每个文件。这个过程不仅耗时,而且容易出错。每一次的筛选都可能遗漏数据,每一次的复制粘贴都可能引入错误。二、Python自动化的解决方案i......
  • Python:提交和跟踪许多子流程会导致“卡住”子流程
    我有一个第3方cli可执行文件,需要从python代码中调用。这些都是繁重的计算(CPU),我需要调用它大约50-100次。可执行文件本身在某种程度上是多线程的,但不是所有步骤,而且我有很多可用的核心。这意味着我希望同时运行多个子进程,但不是全部。因此,我需要提交其中一些,然后跟踪......