这是每两周挑战#3。主题:遗传算法
这个挑战有点实验。我们想看看我们可以用遗传算法做些什么。并非所有内容都是最佳的,但我们尽了最大努力使其变得可访问。如果能够解决问题,谁会知道我们将来会看到什么。也许是希尔的遗传之王?
规格很长!我们已尝试将规范分为基础知识-开始使用框架并提交答案所需的最低知识-和Gory Details-完整规范,以及有关控制器的所有详细信息,可以自己写。
如果您有任何疑问,请随时加入我们的聊天室!
您是行为心理学的研究者。今天是星期五晚上,您和您的同事决定找点乐子,并用您的实验用老鼠参加小老鼠赛跑。实际上,在我们对它们过于迷恋之前,我们称它们为标本。
您已经为标本设置了一个小小的赛道,并且为了使其更加有趣,您在赛道上放置了一些墙壁,陷阱和传送器。现在,您的标本仍然是老鼠……他们不知道什么是陷阱或传送器。他们所看到的只是一些颜色不同的东西。他们也没有任何记忆力-他们所能做的就是根据当前环境做出决定。我猜自然选择会从那些不知道如何避免陷阱的标本中挑选出来(这场比赛将需要一段时间...)。让游戏开始!†
†84,465个样本在进行挑战时受到了伤害。
基础
这是一款单人游戏(您和您的同事不想混合人口,因此每个人都建立自己的赛车场)。赛道是一个矩形网格,高15格,宽50格。您从左边缘(其中x = 0)上随机(不一定不同)的15个样本开始。您的标本应尝试达到x≥49和0≤y≤14的任何单元的目标(标本可能会超出右侧的轨道)。每次发生这种情况,您都会得到一点。您也以1点开始游戏。您应该尝试在10,000转后最大化积分。
多个标本可能占据同一个细胞,并且不会相互作用。
在每个转弯处,每个标本都看到一个5x5的周围网格(自身位于中心)。该网格的每个单元包含一个颜色-1
来15
。-1
表示超出范围的单元格。如果标本超出范围,则标本会死亡。至于其他颜色,它们代表空的单元,陷阱,墙壁和传送器。但是您的标本不知道哪种颜色代表什么,您也不知道。但是有一些限制:
- 8种颜色代表空单元格。
- 4种颜色代表一个传送器。传送器会将标本发送到其9x9邻域内的某个单元中。对于所有相同颜色的传送器,此偏移量将相同。
- 2种颜色代表墙壁。进入墙壁等同于静止不动。
- 2种颜色代表陷阱。甲陷阱表明一个的9个单元在其近邻的是致死的(不一定是陷阱细胞本身)。对于所有相同颜色的陷阱,此偏移量将相同。
现在,关于自然选择……每个标本都有一个基因组,即一个具有100位的数字。通过杂交两个现有的标本,然后稍微突变基因组,可以创建新的标本。标本越成功,复制的机会就越大。
因此,这是您的任务:您将编写一个函数,该函数接收标本所见颜色的5x5网格及其基因组作为输入。您的函数将返回样本的移动(Δx,Δy),其中Δx和Δy分别为之一{-1, 0, 1}
。您不得在函数调用之间保留任何数据。这包括使用您自己的随机数生成器。您的函数将提供带种子的RNG,您可以随意使用它。
您提交的分数将是50条随机轨道上的点数的几何平均值。我们发现该分数存在一定差异。因此,这些分数将是初步的。一旦挑战消失,将宣布截止日期。在截止日期结束时,将随机选择100个委员会,所有提交的意见将在这100个委员会中重新评分。请随意在您的答案中加上预估的分数,但我们会为每份提交的作品评分,以确保没有人作弊。
我们提供了几种语言的控制器程序。目前,您可以使用Python(2或3),Ruby,C ++,C#或Java编写提交内容。控制器生成棋盘,运行游戏并为遗传算法提供框架。您所要做的就是提供移动功能。
等一下,那么我该如何处理基因组呢?
挑战在于弄清楚!
由于标本没有记忆,因此您在给定回合中所拥有的只是5x5的颜色网格,对您没有任何意义。因此,您必须使用基因组来达到目标。通常的想法是,您使用基因组的一部分来存储有关颜色或网格布局的信息,而您的机器人则根据存储在基因组中的其他信息来做出决定。
现在,您当然不能实际在此处手动存储任何内容。因此,在那里存储的实际信息最初将是完全随机的。但是遗传算法将很快选择那些基因组包含正确信息的标本,同时杀死那些信息错误的标本。您的目标是找到从基因组位和视野到移动的映射,这使您可以快速找到目标的路径,并且始终如一地发展为制胜法宝。
这应该是足够的信息,可以帮助您入门。如果需要,可以跳过下一部分,并从底部的控制器列表中选择您要选择的控制器(还包含有关如何使用该特定控制器的信息)。
继续阅读...
血腥细节
该规范已完成。所有控制器都必须执行这些规则。
除非另有说明,否则所有随机性均使用均匀分布。
轨道生成:
- 轨道是一个矩形网格,X = 53单元宽,Y = 15单元高。与细胞X≥49是目标细胞(其中,X是从零开始)。
- 每个单元格只有一种颜色,并且可能是致命的,也可能不是致命的 -除非由以下一种单元格类型指定,否则这些单元格不是致命的。
- 有16种不同的单元格颜色,从标记
0
为15
,其含义将因游戏而异。另外,-1
表示超出范围的细胞-这些是致命的。 - 选择8种随机颜色。这些将是空单元格(无效)。
- 再选择4种随机颜色。这些是传送器。对于其中两种颜色,请在9x9邻域中选择一个非零偏移量(从(-4,-4)到(4,4),除了(0,0)以外)。对于其他两种颜色,请反转这些偏移量。如果样本踩在传送器上,它将立即移动该偏移量。
- 再选择2种随机颜色。这些是陷阱。对于每种颜色,在3x3邻域中选择一个偏移量(从(-1,-1)到(1,1))。陷阱表示该偏移量处的单元格是致命的。注意:陷阱单元本身不一定具有致命性。
- 剩下的2种颜色是墙壁,阻碍运动。尝试移动到墙单元上将使移动变得静止。壁细胞本身具有致命性。
- 对于网格的每个非目标单元,选择一种随机颜色。为每个目标单元选择一个随机的空色。
- 对于轨道左边缘的每个像元,确定是否可以在100转内达到目标(根据下面的转弯顺序规则)。如果是这样,则此单元格是允许的起始单元格。如果起始单元少于10个,则丢弃轨道并生成一个新轨道。
- 创建15个样本,每个样本具有随机的基因组,年龄为0。将每个标本放在随机的起始细胞上。
转订单:
- 对于每个样本,将依次执行以下步骤。标本不会相互作用或看不见,可能会占据同一单元格。
- 如果标本的年龄为100岁,则会死亡。否则,将其年龄增加1。
- 给标本以其视野-以标本为中心的5x5颜色网格-并在其3x3邻域中返回移动。超出此范围将导致控制器终止。
- 如果目标单元是墙,则移动更改为(0,0)。
- 如果目标单元是传送器,则样本会按传送器的偏移量移动。注意:此步骤执行一次,而不是迭代执行。
- 如果当前被标本占据的细胞(可能是在使用一个传送器之后)是致命的,则标本会死亡。这是样品死亡的唯一时间(除了上述步骤1.1。)。特别是,在致死细胞上产生的新标本不会立即死亡,而是有机会先移出危险细胞。
- 如果标本占据目标格,则得分,将标本移至随机起始格,并将其年龄重置为0。
- 如果板上剩下的样本少于两个,则游戏结束。
- 创建10个年龄为0的新标本。每个基因组(分别)由以下育种规则确定。将每个标本放在随机的起始细胞上。
配种:
创建新标本时,随机选择两个不同的亲本,偏向于向右进一步发展的标本。选择标本的概率与其当前的适应度得分成正比。标本的健身得分为
1 + x + 50 *达到目标的次数
其中x是从0开始的水平索引。同一回合中创建的标本不能选择为父本。
在两个亲本中,选择一个随机的一个作为第一个基因组位。
- 现在,当您沿着基因组行走时,以0.05的概率切换亲本,并继续从所得亲本中获取位。
- 突变完全组装的基因组:对于每个位,以0.01的概率翻转。
得分:
- 一局游戏持续10,000回合。
- 玩家以1分开始游戏(允许使用几何平均值)。
- 每当标本达到目标时,玩家就会得分。
- 目前,每个玩家的提交将运行50场比赛,每场比赛都有不同的随机轨迹。
- 上述方法导致比期望更多的变化。一旦挑战消失,将宣布截止日期。在截止日期结束时,将随机选择100个委员会,所有提交的意见将在这100个委员会中重新评分。
- 玩家的总得分是这些单个游戏得分的几何平均值。
控制器
您可以选择以下任何控制器(因为它们在功能上是等效的)。我们已经测试了所有这些,但是如果您发现错误,想要提高代码或性能或添加图形输出等功能,请在GitHub上发送引发问题或发送拉动请求!也欢迎您添加其他语言的新控制器!
单击每个控制器的语言名称,以转到GitHub上的正确目录,其中包含README.md
带有正确用法说明的。
如果您不熟悉git和/或GitHub,则可以从首页以ZIP格式下载整个存储库(请参见侧栏中的按钮)。
蟒蛇
- 经过最彻底的测试。这是我们的参考实现。
- 可与Python 2.6+和Python 3.2+一起使用!
- 非常慢 我们建议与PyPy一起运行以大幅提高速度。
- 支持使用
pygame
或进行图形输出tkinter
。
红宝石
- 已在Ruby 2.0.0上测试。应该与较新的版本一起使用。
- 它也相当慢,但是Ruby可能会方便地为提交的原型制作原型。
C ++
- 需要C ++ 11。
- (可选)支持多线程。
- 迄今为止最快的控制器。
C#
- 使用LINQ,因此需要.NET 3.5。
- 相当慢。
爪哇
- 并不是特别慢。并不是特别快。
初步排行榜
所有分数均为初步分数。不过,如果出现明显错误或过时,请通知我。我们列出的示例提交供比较,但没有争用。
Score | # Games | User | Language | Bot
===================================================================================
2914.13 | 2000 | kuroi neko | C++ | Hard Believers
1817.05097| 1000 | TheBestOne | Java | Running Star
1009.72 | 2000 | kuroi neko | C++ | Blind faith
782.18 | 2000 | MT0 | C++ | Cautious Specimens
428.38 | | user2487951 | Python | NeighborsOfNeighbors
145.35 | 2000 | Wouter ibens | C++ | Triple Score
133.2 | | Anton | C++ | StarPlayer
122.92 | | Dominik Müller | Python | SkyWalker
89.90 | | aschmack | C++ | LookAheadPlayer
74.7 | | bitpwner | C++ | ColorFarSeeker
70.98 | 2000 | Ceribia | C++ | WallGuesser
50.35 | | feersum | C++ | Run-Bonus Player
35.85 | | Zgarb | C++ | Pathfinder
(34.45) | 5000 | Martin Büttner | <all> | ColorScorePlayer
9.77 | | DenDenDo | C++ | SlowAndSteady
3.7 | | flawr | Java | IAmARobotPlayer
1.9 | | trichoplax | Python | Bishop
1.04 | 2000 | fluffy | C++ | Gray-Color Lookahead
学分
这项挑战是一项巨大的协作努力:
- Nathan Merril:编写了Python和Java控制器。将挑战概念从山丘之王转变为老鼠赛跑。
- trichoplax:游戏测试。在Python控制器上工作。
- feersum:编写了C ++控制器。
- VisualMelon:编写了C#控制器。
- 马丁·布特纳(MartinBüttner):概念。写了Ruby控制器。游戏测试。在Python控制器上工作。
- T亚伯拉罕:游戏测试。测试了Python,并检查了C#和C ++控制器。
以上所有用户(可能还有更多我忘记了的用户)都为挑战的总体设计做出了贡献。
C ++控制器更新
如果将C ++与Visual Studio和多线程一起使用,则应获得最新更新,因为它们的随机数生成器种子存在错误,该错误允许生成重复的电路板。
'In particular, a new specimen which spawns on a lethal cell will not die immediately, but has a chance to move off the dangerous cell first.'