进化人工智能的探索
https://medium.com/@bobby.elmes?source=post_page---byline--e23e6a58963a--------------------------------https://towardsdatascience.com/?source=post_page---byline--e23e6a58963a-------------------------------- Robert Elmes
·发表于数据科学探索 ·阅读时长:7 分钟·2024 年 3 月 23 日
–
一个国际象棋难题,采用进化理论生成。白方两步将死…
进化算法(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;
}
适者生存
一旦生成了一个位置群体,真正棘手的部分开始了。任何进化算法的关键在于如何评估你的启发式。在我的案例中,只有那些有单一解法并导致将军的位置才会被考虑为谜题。在筛选这些结果后,启发式是衡量选择正确棋步以赢得比赛的难度。但计算机程序如何评估一个人类解读国际象棋位置的难度呢?
通过一种偏向棋盘上骑士的启发式生成的谜题。2 步将军
一种方法是考察谜题的结构。国王安全吗?是否有那些不解决谜题但看起来很不错的棋步?我们是否牺牲了任何棋子?我们移动的是什么棋子?通过评估多个因素,我们可以创建一个难度衡量标准。这个方法的问题是,很难根据这么多因素来决定如何创建最终得分。僵化的规则也完全忽视了人类感知中的偏差。可能甚至是微小的棋盘变化,使得某些人更难选出正确的棋步。
那么,如何更好地了解人类的表现呢?通过利用充满真实比赛的大型数据库,机器学习模型已经训练成能够像某一等级的玩家一样下棋。通过这些模型,我们可以更好地理解不同能力的玩家可能如何尝试解谜。一个经过 1200 等级训练的 AI 能解开这个谜题吗?1600、1900 呢?这种方法的好处在于它能更深入地探究真实玩家的思维。然而,机器学习模型也不是没有缺点。这些 AI 并不像真实玩家那样下棋,它们更像是玩家的近似模型。它们还在真实、常规的比赛中训练,这意味着它们在评估随机的国际象棋位置时可能不可靠。
通过将机器学习模型与复杂且详细的基于规则的评估相结合,我创造了一种“两全其美”的场景。这是一种启发式方法,既能理解谜题的构成,又能考虑人类可能如何解决它。
下一代
一旦找到一组最佳谜题,下一步就是创建新一代谜题。这可以通过许多受进化启发的技术来实现。我选择使用交叉和变异。
交叉涉及随机合并两个结果的特征,希望能够得到两者的最佳特征。我们可以通过回溯到某个共享的起始点,然后选择用来到达每个结果的合法棋步,来交叉相似的国际象棋位置。也许移动皇后使得一个谜题具有了非常好的特性,而移动骑士则让另一个谜题变得有趣。通过结合这两种特性,我们可以创建出更具吸引力的问题。
类似地,我们可以通过回溯然后向前走若干步来改变谜题。根据你回溯和前进的步数,谜题可能会发生细微或巨大的变化。突变过多可能会导致算法永远无法改进,而突变过少则可能使你的最佳结果过快地收敛到一个单一的值。
那么……问题是什么呢?
进化算法最常见的问题是收敛太快。最初,我生成的谜题在仅仅经过几代后就停止了改进。在现实世界中,山脉、沙漠和海洋等物理边界阻止了种群之间的基因交换,保持了遗传多样性。没有足够的遗传多样性,种群的进化就会受到限制。通过将较小的国际象棋谜题种群并行运行一段时间,我为它们提供了足够的“呼吸空间”,以保持一些多样性并避免过早收敛。
进化算法也可能非常缓慢。国际象棋当然也不例外。在数百万个棋盘位置上进行启发式评估需要大量的处理能力。通常,你运行国际象棋引擎的时间越长,它预测下一步最佳棋着的准确性就越高。通过找到分析每个位置所需时间的最佳平衡点,挑选出最有前景的棋局,并更详细地分析它们,我可以在合理的范围内优化时间。决定何时停止生成也至关重要。如果一个样本在经过几代之后停止改进,那么也许最好从新的随机种群开始,因为它可能无法进一步改进。在经过无数次优化后,我的家用电脑能够每天使用进化算法生成超过 1000 个具有挑战性的谜题。
最后,诊断错误可能是极其困难的。对于许多程序,你可以根据特定的输入预期得到某些输出。而在进化算法中情况则不同。我花了很多时间琢磨为什么我的种群会过快收敛。是位置生成的问题吗?是进化方法的问题,可能是启发式方法的问题?当程序的预期输出无法明确界定时,很容易忽略某些地方没有按预期工作。
结果
然而,尽管存在一些问题,这种 AI 技术的强大力量和潜力依然光芒四射,人人可见。仅凭我那台旧电脑,我在 3 个月内就生成了近 50,000 个国际象棋难题,涵盖了大量奇特而美妙的棋局。
算法的随机性意味着它能够创造出极其丰富多彩、千变万化的难题。在国际象棋中,我们很少见到一些有趣的战术问题,比如皇后牺牲、骑士升变和“过路兵”吃子,而通过进化算法这些问题很容易生成,而用真实棋局的数据库则难以找到。然而,这些难题的荒诞性质使它们对实际场景的适用性较差。虽然非常有趣,但也可以说,基于真实棋局的难题更适合学习国际象棋中的常见模式。
除了极具生产力外,这个算法还异常灵活。沙特兰奇、倾斜棋盘等,扩展进化算法以适应任何衍生版的国际象棋都非常简单。正是这种可扩展性,使得进化技术在这里表现得尤为出色。你无法通过游戏数据库来实现这一点,因为这些数据库根本不存在!
由算法生成的沙特兰奇(Shatranj)难题。你能在 2 步内将白方国王将死吗?
结语
尽管对于许多人来说,AI 的这一领域可能已经被遗忘,但我展示了如何利用进化算法为现实世界的问题创造出新颖的解决方案。这个技术仍有许多未开发的潜力。随着生成式 AI 的崛起,我不禁想知道,未来人们还会为进化算法发现哪些有趣的应用…
你可以在我的网站上亲自体验这些难题,chesspuzzler.com。
除非另有说明,所有图片均由作者提供。
51

被折叠的 条评论
为什么被折叠?



