如何对仿真器输入优化问题进行分类,应该使用哪种算法进行处理?


10

由于问题的性质,我必须包括许多背景信息(因为我的问题是:如何缩小此范围?)也就是说,据我所知,可以总结为:

有哪些方法可以在极大的组合搜索空间中找到局部最优值?

背景

在工具辅助的超级游戏社区中,我们希望为视频游戏机或仿真器提供特制的(不是实时生成的)输入,以最大程度地减少成本(通常是完成时间)。这是目前做的方法是通过玩游戏帧一帧,并确定各帧的输入,经常重做多次运行的部分(例如,最近公布的运行塞尔达传说:时之笛有总共198,590次重试)。

使这些运行达到其目标通常可以归结为两个主要因素:路线规划和遍历。前者比后者更具“创造力”。

路线规划是确定玩家应该整体导航以完成游戏的方式,并且通常是奔跑过程中最重要的部分。例如,这类似于选择使用哪种排序方法。世界上最好的气泡排序根本不会胜过100万个元素的快速排序。

然而,在追求完美的过程中,遍历(路线的执行方式)也是一个巨大的因素。继续类推,这就是实现排序算法的方式。如果没有非常具体的输入帧,甚至无法执行某些路由。这是最繁琐的工具辅助过程,因此完成完整生产的过程要花费数月甚至数年。对于人类而言,这不是一个困难的过程,因为它可以尝试对同一想法进行不同的变体,直到被认为是最好的,但是人类只能在注意力范围上尝试如此多的变体。在这里,将计算机应用于此任务似乎是正确的。

我现在的目标是尝试使Nintendo 64系统的遍历过程自动化。对于这个问题的搜索空间是远远太大用蛮力的方法来攻击。N64运行的n帧段具有2个30n可能的输入,这意味着仅30帧输入(每秒30FPS)就有2 900个可能的输入;测试这些潜在的解决方案是不可能的,更不用说整整运行两个小时了。

但是,我对尝试(或者甚至不想尝试)完整的全局全局优化没有兴趣。相反,在给定初始输入的情况下我想近似某个运行特定局部最优值对于某种半全局优化,则近似n个局部最优值)。也就是说,给定一条路线和该路线的初始遍历:搜索该遍历的邻居以最大程度地降低成本,但不要退化为尝试所有可以解决问题的情况。

因此,我的程序应采用启动状态,输入流,评估函数,并通过使评估结果最小化来输出局部最优值。

当前状态

目前,我已经处理了所有框架。这包括通过仿真器的操作,设置和拆卸,配置等评估输入流。作为各种占位符,优化器是一种非常基本的遗传算法。它只是评估输入流的总数,存储/替换获胜者,并通过更改获胜者流来生成新的总数。这个过程一直持续到满足一些任意标准,例如时间或世代号。

注意,到目前为止,该程序最慢的部分将是对输入流的评估。这是因为这涉及到模拟n帧游戏。(如果有时间,我要编写自己的仿真器来提供此类功能的钩子,但是现在,我剩下的工作是合成消息并为来自另一个进程的现有仿真器修改内存。)在我的主计算机上,相当现代,评估200帧大约需要14秒。因此,我更喜欢一种算法(给定的选择),该算法可以最大程度地减少函数求值的次数。

我在框架中创建了一个同时管理模拟器的系统。这样,我可以立即以线性性能尺度评估多个流,但是实际上,在系统性能下降之前,正在运行的仿真器的数量只能是8到32(并且实际上是在推动它)。这意味着(根据选择),可以在进行评估时执行处理的算法将非常有益,因为优化器可以在等待评估时进行一些繁重的工作。

作为测试,我的评估功能(对于游戏Banjo Kazooie)是每帧求出从玩家到目标点的距离之和。这意味着最佳解决方案是尽可能快地接近该点。仅将突变限制在模拟摇杆上,就花了一天的时间才得到一个好的解决方案。(这是在我实现并发之前。)

添加并发之后,我启用了A按钮按下的突变,并在需要跳转的区域执行了相同的评估功能。在运行24个仿真器的过程中,从最初空白的输入流中花费了大约1个小时才能达到目标,但可能要花几天时间才能达到接近最佳的水平。

问题

我面临的问题是,我对数学优化领域的了解不足,无法知道如何正确地对我的优化问题建模!例如,我可以大致遵循Wikipedia上描述的许多算法的概念,但是我不知道如何对问题进行分类或如何为该类别选择最新的算法。

据我所知,我在一个非常大的邻里中遇到一个组合问题。最重要的是,评估功能非常不连续,没有梯度,并且有很多平稳状态。而且,约束不多,但如果可以解决问题,我很乐意添加表达约束的能力;我想允许指定例如不应使用“开始”按钮,但这不是一般情况。

所以我的问题是:如何建模?我要解决哪种优化问题?我应该使用哪种算法?我不害怕阅读研究论文,所以让我知道我应该阅读什么!

直觉上,遗传算法不可能是最好的,因为它似乎并没有真正学习。例如,如果按Start(开始)似乎总是使评估变得更糟(因为它使游戏暂停),那么应该有一些设计师或大脑可以学习:“在任何时候按Start都是没有用的。” 但是,即使达到这个目标也不是那么简单,因为有时按启动最佳选择,例如在Super Mario 64中所谓的“暂停向后跳远” !在这里,大脑必须学习一个更为复杂的模式:“按下开始是没有用的,除非玩家处于这种非常特定的状态,并且会继续进行某些按键组合。”

似乎我应该(或机器可以学习)以更适合修改的其他方式表示输入。每帧输入似乎太细粒度了,因为真正需要的是“动作”,它可能跨越多个帧...但是许多发现是逐帧进行的,因此我不能完全排除它(上述暂停向后长跳需要帧级精度)。似乎也可以串行处理输入,这是可以利用的事实,但我不确定如何使用。

目前,我正在阅读(反应式)禁忌搜索,超大规模邻域搜索,基于教学的优化以及蚁群优化。

除了随机遗传算法,这个问题是否真的很难解决?还是实际上是一个很久以前解决的琐碎问题?感谢您的阅读,并预先感谢您的任何答复。


您的帖子很长,如果您在该主题中有一小段以清晰的字眼说明问题而又没有额外的背景信息,将会对读者有所帮助。
卡夫

@Kaveh:我知道这很冗长,但是由于问题的性质,很难缩小范围,因为我几乎在问如何缩小范围。:(

Answers:


6

从您在问题中提供的信息,我看不到如何应用标准优化方法(我知道)。您的对象不是那么复杂(稍后会详细介绍),但是目标函数是一个讨厌的函数:其值是由无法控制的外部系统定义的,它不太可能具有任何不错的属性,依此类推。因此,我认为在这里使用遗传算法并不是一个可行的方法,甚至不是一个好的方法。如果您对问题的结构一无所知,它们通常会比其他方法更好。有很多事情要考虑

  • 对象空间
  • 目标功能和
  • 您的遗传算法的参数,

请允许我详细说明。

你的对象是什么?

您已经回答了:您正在查看一系列动作,每个动作占用一帧。我认为这可能太细了;也许尝试一系列动作,每个动作都有一个持续时间(以帧数为单位)。与自然地“插入A的压力”相比,这将允许具有诸如“走得更长一些”之类的突变以具有不同的概率。尝试最有效的方法;考虑其他成分后,您可能需要重新访问此项目。

您的目标功能是什么?

这真的很关键。您要优化什么?是时候进球了?有多少不同的动作?收集了多少颗星星?综合几个因素?一旦获得多个目标,事情就会变得扑朔迷离 -(通常)那里不再是最佳状态!

您提到了达到目标的时间。这可能根本不是一个好的目标功能。为什么?由于大多数序列甚至都无法达到目标,因此它们会将底线定为某个常数,从而创建了这样的适应性景观(一维概念草图):

在此处输入图片说明
[ 来源 ]

00

1个1个+到目标的最终距离+1个1个+达到目标的时间

01个1个

那么如何测量距离呢?线性距离看起来很诱人,但有问题。同样,可能会发送错误的信号。考虑以下简单情况:

在此处输入图片说明
[ 来源 ]

从跳到上层走廊开始的每个序列都会得到改善,直到到达目标上方的某个点为止,但实际上永远无法达到目标!更糟糕的是,在所有未达到目标的序列中,上升的序列与下降的序列一样好,因此GA无法拒绝明显注定的序列。换句话说,线性距离会产生特别糟糕的局部最优值,如果水平中存在死角,则会陷入GA。

因此,我建议您在游戏关卡上覆盖一个网格,并在游戏角色可以从一个到另一个之间连接邻居点。然后,您用距离最接近序列的位置的点到距离目标最近的点的最短路径长度来计算距目标的距离。这很容易计算,走进死胡同(局部最优)会立即受到惩罚¹。当然,您需要访问级别数据,但是我认为您已经拥有这些数据。

您的GA如何运作?

现在我们可以进入实际的遗传算法。关键考虑因素是种群,选择,繁殖/变异和停止标准。

人口

如何的人口将是?如果太小,则可能无法提供达到良好解决方案所需的多样性。如果太大,您很可能会随身携带无用的垃圾,从而减慢了该过程。

您如何初始化人口?您会选择随机动作序列吗?如果是这样,长度是多少?您是否有(少量)手动生成的合理解决方案来作为种子,也许可以达到目标?

选拔

ķ

这里的核心概念是选择压力:生存有多难?使其过小,您就不会淘汰垃圾解决方案。将其设置得太高,您将很难进行更改(尤其是在局部最优值之间移动)。

繁殖与变异

一旦选择了一个回合的幸存者,就必须从他们那里创造下一代(父母是否可以存活并成为下一代的一部分?)。有两种主要策略:突变和重组。

突变很明显,尽管具体情况可能有所不同。对于一个人的序列中的每个位置,以一定的概率对其进行变异。您可以针对每个位置独立执行此操作,也可以随机选择突变数,也可以执行具有不同概率的不同突变(例如插入新元素,删除一个元素,更改一个元素……)。变异通常是关于微小的变化。

重组是将两个或多个解决方案的各个方面组合成一个新解决方案,这比较棘手,但可以允许较大的步骤,即离开一个“健身山峰”,然后直接移至另一个山峰(可能更高)。一个经典的想法是分频 ; 我不知道在这里是否有意义(在我看来,将给定序列的前缀替换为其他内容很可能会使后缀贬值)。也许您可以使用有关游戏角色在序列中不同点的级别和位置的知识来指导这一点,即仅在两个序列中角色位于相同位置的地方创建交叉点。

终止

ñķ1个ñ


如您所见,所有这些东西交织在一起,以影响实际性能。如果您并行运行多个种群,您甚至可以考虑由于迁移和/或灾难而实施遗传漂移。几乎没有什么理论可以指导您的方法,因此您必须尝试不同的设置并查看它的用途。希望对一个级别有用的东西对其他级别也有用。修修补补!

注意:鉴于上述内容,请查看BoxCar 2D。它们在某些方面做得很好(其他情况则并非如此),您可以直观了解GA参数如何影响其性能。


  1. 实际上,使用这种适应性贪婪地构建一个序列,即从所有可能的下一个动作中选择使目标距离最小的动作,可能会很好地工作。在使用GA之前先尝试一下!
  2. 当然,作为观察员,您始终记得曾经遇到的最佳解决方案。

1
真好!两个问题。是什么让您说(通常)MOO中没有优化?这些点是帕累托最优的,也就是说,您不能在不牺牲其他东西的情况下改进某些东西。给他们赋值取决于建模者。而且,难道不是因为很小的变化而导致变异的可能性很小?由于突变概率较大,因此搜索趋向于进行随机的,不受指导的移动,这通常会损害性能。我认为已经观察到小突变概率最有效。
Juho 2012年

1个/ññ1个

知道了 关于第三点,我的意思完全是这样。谢谢!
Juho 2012年

感谢您提供所有信息。布置得很好的答案可以澄清我的理解。
GManNickG

1

有关基于教学的优化(TLBO)方法及其代码的更多详细信息,请参阅以下文章:

R. Venkata Rao和V. Patel 提出的一种基于精英教学的优化算法,用于解决复杂的约束优化问题。国际工业工程计算杂志3(4):535–560(2012)

有关其他阅读:


1
欢迎使用cs.SE,并感谢您的答复!请注意,您可以使用Markdown设置帖子的格式;我建议您检查我的编辑。关于内容,我认为这对希望了解如何为他的问题建模而不是详细介绍特定技术的OP没有帮助。此外,只有这个人从事TLBO吗?
拉斐尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.