进化国际象棋难题

原文:towardsdatascience.com/evolving-chess-puzzles-e23e6a58963a?source=collection_archive---------2-----------------------#2024-03-23

进化人工智能的探索

https://medium.com/@bobby.elmes?source=post_page---byline--e23e6a58963a--------------------------------https://towardsdatascience.com/?source=post_page---byline--e23e6a58963a-------------------------------- Robert Elmes

·发表于数据科学探索 ·阅读时长:7 分钟·2024 年 3 月 23 日

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9cbdc030208655c6a92be84f77c5e81f.png

一个国际象棋难题,采用进化理论生成。白方两步将死…

进化算法(EAs)是人工智能的一个子集,通过模仿生物进化的方法来解决问题。从优化神经网络到资源调度,它们在现实世界中有着广泛的应用。它们的魅力在于解决问题的方式发生了转变,重点不再是描述达到目标的步骤,而是描述目标的样貌。

在本文中,我将探讨如何利用这一出色的人工智能生成国际象棋难题、它带来的好处以及我们需要考虑的缺点。

国际象棋难题是一个合法的棋盘位置,其中一个独特的走法组合会导致胜利,通常以将死结束。它们通常通过分析人类玩家之间竞争性游戏的数据库来发现。

通过仅使用代码、随机性和一点生物学知识生成自己的难题,可以创建一个有趣且多样的难题数据库。让我们探索一下如何实现。

进化算法通常通过随机生成大量结果的种群,然后使用启发式方法选择“最适合”的结果,最后将这些“最适合”的结果用于生成后续的随机种群。它们的灵感来自达尔文的自然选择理论,在一个种群中,那些更可能生存的动物也更可能将其特征传递给下一代。经过多代的演化,有时甚至是成千上万代,种群会收敛到一个最优解。那么,我们如何将这一原理应用于国际象棋呢?

种群生成

在国际象棋中,我们可以通过模拟比赛来创建一个随机合法位置的群体,其中程序轮流进行随机的黑白双方移动若干次。通过重复这一过程成千上万次,可以分析大量的随机位置的适应性。

以下是我的 Board 类中的一个函数,它返回一个棋步列表。

public List<(int[] from, int[] to)> GetAllPotentialMoves(Colour currentColour) 
{
    var activePieces = ActivePieces.Find(p => p.colour == currentColour);
    var allLegalMoves = new List<(int[] from, int[] to)>();

    foreach (var piece in activePieces.pieces) 
    {
        var moves = piece.GetLegalMoves(this);

        allLegalMoves.AddRange(moves);
    }

    return allLegalMoves;
}

适者生存

一旦生成了一个位置群体,真正棘手的部分开始了。任何进化算法的关键在于如何评估你的启发式。在我的案例中,只有那些有单一解法并导致将军的位置才会被考虑为谜题。在筛选这些结果后,启发式是衡量选择正确棋步以赢得比赛的难度。但计算机程序如何评估一个人类解读国际象棋位置的难度呢?

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/0f9a1b46ce55996898c8f74f8da59b2c.png

通过一种偏向棋盘上骑士的启发式生成的谜题。2 步将军

一种方法是考察谜题的结构。国王安全吗?是否有那些不解决谜题但看起来很不错的棋步?我们是否牺牲了任何棋子?我们移动的是什么棋子?通过评估多个因素,我们可以创建一个难度衡量标准。这个方法的问题是,很难根据这么多因素来决定如何创建最终得分。僵化的规则也完全忽视了人类感知中的偏差。可能甚至是微小的棋盘变化,使得某些人更难选出正确的棋步。

那么,如何更好地了解人类的表现呢?通过利用充满真实比赛的大型数据库,机器学习模型已经训练成能够像某一等级的玩家一样下棋。通过这些模型,我们可以更好地理解不同能力的玩家可能如何尝试解谜。一个经过 1200 等级训练的 AI 能解开这个谜题吗?1600、1900 呢?这种方法的好处在于它能更深入地探究真实玩家的思维。然而,机器学习模型也不是没有缺点。这些 AI 并不像真实玩家那样下棋,它们更像是玩家的近似模型。它们还在真实、常规的比赛中训练,这意味着它们在评估随机的国际象棋位置时可能不可靠。

通过将机器学习模型与复杂且详细的基于规则的评估相结合,我创造了一种“两全其美”的场景。这是一种启发式方法,既能理解谜题的构成,又能考虑人类可能如何解决它。

下一代

一旦找到一组最佳谜题,下一步就是创建新一代谜题。这可以通过许多受进化启发的技术来实现。我选择使用交叉和变异。

交叉涉及随机合并两个结果的特征,希望能够得到两者的最佳特征。我们可以通过回溯到某个共享的起始点,然后选择用来到达每个结果的合法棋步,来交叉相似的国际象棋位置。也许移动皇后使得一个谜题具有了非常好的特性,而移动骑士则让另一个谜题变得有趣。通过结合这两种特性,我们可以创建出更具吸引力的问题。

类似地,我们可以通过回溯然后向前走若干步来改变谜题。根据你回溯和前进的步数,谜题可能会发生细微或巨大的变化。突变过多可能会导致算法永远无法改进,而突变过少则可能使你的最佳结果过快地收敛到一个单一的值。

那么……问题是什么呢?

进化算法最常见的问题是收敛太快。最初,我生成的谜题在仅仅经过几代后就停止了改进。在现实世界中,山脉、沙漠和海洋等物理边界阻止了种群之间的基因交换,保持了遗传多样性。没有足够的遗传多样性,种群的进化就会受到限制。通过将较小的国际象棋谜题种群并行运行一段时间,我为它们提供了足够的“呼吸空间”,以保持一些多样性并避免过早收敛。

进化算法也可能非常缓慢。国际象棋当然也不例外。在数百万个棋盘位置上进行启发式评估需要大量的处理能力。通常,你运行国际象棋引擎的时间越长,它预测下一步最佳棋着的准确性就越高。通过找到分析每个位置所需时间的最佳平衡点,挑选出最有前景的棋局,并更详细地分析它们,我可以在合理的范围内优化时间。决定何时停止生成也至关重要。如果一个样本在经过几代之后停止改进,那么也许最好从新的随机种群开始,因为它可能无法进一步改进。在经过无数次优化后,我的家用电脑能够每天使用进化算法生成超过 1000 个具有挑战性的谜题。

最后,诊断错误可能是极其困难的。对于许多程序,你可以根据特定的输入预期得到某些输出。而在进化算法中情况则不同。我花了很多时间琢磨为什么我的种群会过快收敛。是位置生成的问题吗?是进化方法的问题,可能是启发式方法的问题?当程序的预期输出无法明确界定时,很容易忽略某些地方没有按预期工作。

结果

然而,尽管存在一些问题,这种 AI 技术的强大力量和潜力依然光芒四射,人人可见。仅凭我那台旧电脑,我在 3 个月内就生成了近 50,000 个国际象棋难题,涵盖了大量奇特而美妙的棋局。

算法的随机性意味着它能够创造出极其丰富多彩、千变万化的难题。在国际象棋中,我们很少见到一些有趣的战术问题,比如皇后牺牲、骑士升变和“过路兵”吃子,而通过进化算法这些问题很容易生成,而用真实棋局的数据库则难以找到。然而,这些难题的荒诞性质使它们对实际场景的适用性较差。虽然非常有趣,但也可以说,基于真实棋局的难题更适合学习国际象棋中的常见模式。

除了极具生产力外,这个算法还异常灵活。沙特兰奇、倾斜棋盘等,扩展进化算法以适应任何衍生版的国际象棋都非常简单。正是这种可扩展性,使得进化技术在这里表现得尤为出色。你无法通过游戏数据库来实现这一点,因为这些数据库根本不存在!

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/417016acc765c96534d12c67bd0acc31.png

由算法生成的沙特兰奇(Shatranj)难题。你能在 2 步内将白方国王将死吗?

结语

尽管对于许多人来说,AI 的这一领域可能已经被遗忘,但我展示了如何利用进化算法为现实世界的问题创造出新颖的解决方案。这个技术仍有许多未开发的潜力。随着生成式 AI 的崛起,我不禁想知道,未来人们还会为进化算法发现哪些有趣的应用…

你可以在我的网站上亲自体验这些难题,chesspuzzler.com

除非另有说明,所有图片均由作者提供。

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
数字图像隐写术是一种将秘密信息嵌入到数字图像中的技术,它通过利用人类视觉系统的局限性,在保持图像视觉质量的同时隐藏信息。这项技术广泛应用于信息安全、数字水印和隐蔽通信等领域。 典型隐写技术主要分为以下几类: 空间域隐写:直接在图像的像素值中进行修改,例如LSB(最低有效位)替换方法。这种技术简单易行,但对图像处理操作敏感,容易被检测到。 变换域隐写:先将图像转换到频域(如DCT或DWT域),然后在变换系数中嵌入信息。这类方法通常具有更好的鲁棒性,能抵抗一定程度的图像处理操作。 自适应隐写:根据图像的局部特性动态调整嵌入策略,使得隐写痕迹更加分散和自然,提高了安全性。 隐写分析技术则致力于检测图像中是否存在隐藏信息,主要包括以下方法: 统计分析方法:检测图像统计特性的异常,如直方图分析、卡方检测等。 机器学习方法:利用分类器(如SVM、CNN)学习隐写图像的区分特征。 深度学习方法:通过深度神经网络自动提取隐写相关特征,实现端到端的检测。 信息提取过程需要密钥或特定算法,通常包括定位嵌入位置、提取比特流和重组信息等步骤。有效的隐写系统需要在容量、不可见性和鲁棒性之间取得平衡。 随着深度学习的发展,隐写与反隐写的技术对抗正在不断升级,推动了这一领域的持续创新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值