问题标签 [genetic-algorithm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
algorithm - 我应该使用什么算法来进行“遗传 AI 改进”
首先:这不是关于如何让程序播放五连冠的问题。去过也做过。
介绍说明
我已经制作了一个五合一游戏作为框架来试验基因改进的人工智能(哎呀,这听起来非常自命不凡)。与大多数回合制游戏一样,最好的走法是通过为每个可能的走法分配一个分数来决定的,然后玩得分最高的走法。将分数分配给移动(正方形)的函数如下所示:
如果方格已经有令牌,则得分为 0,因为在方格中放置新令牌是非法的。
每个方格可以是多达 20 个不同的获胜行(5 个水平,5 个垂直,10 个对角线)的一部分。平方的分数是这些行中每一行的分数之和。
一行的得分取决于该行中已经存在的友方和敌方标记的数量。例子:
- 有四个友好标记的一排应该有无限的分数,因为如果你把一个标记放在那里你就赢了。
- 连续有四个敌人标记的分数应该很高,因为如果你不在那里放置一个标记,对手将在下一回合获胜。
- 包含友方和敌方标记的行将得分为 0,因为该行永远不会成为获胜行的一部分。
给定这个算法,我声明了一个名为 TBrain 的类型:
数组中的值表示 N 个友好标记和 0 个敌人标记,或 0 个友好标记和 N 个敌人标记的行的分数。如果连续有 5 个标记,则由于该行已满,因此没有得分。
实际上很容易决定哪些值应该在数组中。Brain[0,4](四个友好标记)应该是“无限的”,我们称之为 1.000.000。vBrain[1,4] 应该非常高,但不要太高以至于大脑宁愿阻止几个敌人获胜而不是自己获胜
考虑以下(不可能的)板:
玩家 2 应该将他的令牌放入 (9,4),赢得比赛,而不是放入 (4,4),即使他会阻止玩家 1 的 8 个潜在获胜行。因此,vBrain[1,4] 应该是 (vBrain [0,4]/8)-1。像这样工作,我们可以找到“大脑”的最佳值,但同样,这不是我感兴趣的。我想要一个算法来找到最佳值。
我已经实现了这个框架,所以它是完全确定的。分数中没有添加随机值,如果多个方块的分数相同,则将选择左上角。
实际问题
介绍就是这样,现在是有趣的部分(至少对我来说)
我有两个“大脑”,vBrain1 和 vBrain2。我应该如何迭代地使这些变得更好?我想象这样的事情:
- 用随机值初始化 vBrain1 和 vBrain2。
- 模拟他们之间的游戏。
- 将获胜者的值分配给失败者,然后随机更改其中一个。
这似乎行不通。大脑并没有变得更聪明。为什么?
score-method 是否应该在结果中添加一些小的随机值,以便相同的两个大脑之间的两个游戏会有所不同?每次迭代的值应该改变多少?“大脑”应该如何初始化?具有恒定值?使用随机值?
另外,这与人工智能或遗传算法有什么关系吗?
PS:这个问题与五连冠无关。这只是我选择的东西,因为我可以声明一个非常简单的“大脑”来进行实验。
neural-network - 任天堂 DS 和神经网络
我想知道 DS 的硬件是否能够运行使用遗传算法利用前馈神经网络的游戏。我知道这与自制游戏以及 nn 和 ga 的实现有关,但我很好奇......
(我对如何使用 DS 的 ARM 等一无所知)
提前致谢 :-)
java - 用 Java 编写的 GA
我正在尝试根据我从“游戏程序员的人工智能技术”一书中学到的技术编写一个遗传算法,该技术使用二进制编码和适应度比例选择(也称为轮盘赌选择)对人口的基因进行选择在程序中随机生成一个二维数组。
我最近遇到了一段伪代码并尝试实现它,但是在我需要做的细节方面遇到了一些问题。我检查了许多书籍和一些开源代码,但仍在努力取得进展。我知道我必须得到人口总适应度的总和,在总和和零之间选择一个随机数,然后如果该数字大于父母将其覆盖,但我正在努力实现这些想法.
由于我的 Java 生锈了,因此非常感谢您对实现这些想法的任何帮助。
matlab - MATLAB-将函数句柄参数作为句柄传递给另一个函数
从事涉及遗传算法的任务(大量的头痛,大量的乐趣)。我需要能够测试不同的交叉方法和不同的变异方法,以比较它们的结果(我必须为课程写的部分论文)。因此,我只想将函数名称作为函数句柄传递给 Repopulate 方法。
这里的关键点就像3,参数3:我如何将mutationMethod向下传递另一个级别?如果我使用 @ 符号,我会被告知:
如果我不使用@ 符号,那么mutationMethod 会被调用,没有参数,并且非常不高兴。
虽然我知道是的,但我可以重写我的代码以使其以不同的方式工作,但我现在很好奇如何让它真正工作。
任何帮助是极大的赞赏。
c++ - 如何使用遗传算法求解线性方程组?
我想使用遗传算法求解包含 n 个变量的 n 个线性方程组。
我很难定义交叉操作,因为解决方案可能包含浮点值。我该如何进行?这似乎是可能的,但这是我第一次接触遗传算法。
假设我们必须解决
答案是 x = 1/2 和 y = 1/4。
我们如何为问题建模?
更新:看看您是否可以从论文http://www.masaumnet.com/archives/mjbas/volume1/issue2/mjbas010205.pdf中破译任何内容。
c++ - 如何对浮点数执行按位运算
我试过这个:
我收到一个编译器错误,提示操作数&
不能是浮点类型。
当我做:
我让程序运行。唯一的一点是,按位运算是对四舍五入后获得的数字的整数表示进行的。
以下也是不允许的。
我不明白为什么int
可以强制转换为void*
但不能float
。
我这样做是为了解决堆栈溢出问题如何使用遗传算法求解线性方程组中描述的问题?.
language-agnostic - 改善 Q 学习
我目前正在使用 Q-Learning 来尝试教机器人如何在充满墙壁/障碍物的房间中移动。它必须从房间的任何地方开始并达到目标状态(例如,这可能是有门的瓷砖)。目前,当它想移动到另一个图块时,它会去那个图块,但我在想将来我可能会添加一个随机的机会去另一个图块,而不是那个。它只能上下左右移动。达到目标状态产生 +100,其余动作产生 0。
我正在使用此处找到的算法,如下图所示。
现在,关于这个,我有一些问题:
- 使用 Q-Learning 时,有点像神经网络,我必须区分学习阶段和使用阶段?我的意思是,似乎他们在第一张图片中显示的是学习的,而在第二张图片中显示的是使用的。
- 我在某处读到,要达到最佳 Q 值表需要无数个步骤。真的吗?我会说这不是真的,但我必须在这里遗漏一些东西。
我也听说过 TD(Temporal Differences),它似乎由以下表达式表示:
对于 alpha = 1,这似乎是图片中第一个显示的那个。伽马值在这里有什么不同?
- 如果我尝试一个非常大的房间(例如 300x200 像素),我会遇到一些复杂情况。由于它本质上是随机运行的,如果房间很大,那么从第一个状态随机进入目标状态将需要很长时间。我可以使用哪些方法来加快速度?我想也许有一张桌子,里面装满了对与错,关于我在那一集中所拥有的任何东西是否已经处于那种状态。如果是,我会丢弃它,如果不是,我会去那里。如果我已经去过所有这些州,那么我会去一个随机的。这样一来,就像我现在正在做的事情一样,我知道我会比现在更频繁地重复状态。
- 除了 Q 值的查找表之外,我还想尝试其他的东西,所以我正在考虑使用带有反向传播的神经网络。我可能会尝试为每个动作(上、下、左、右)设置一个神经网络,因为这似乎是产生最佳结果的方法。是否有任何其他方法(除了 SVM,这似乎太难以实现自己)我可以使用和实现给我很好的 Q-Values 函数逼近?
- 你认为遗传算法在这种情况下会产生好的结果吗,使用 Q 值矩阵作为它的基础?如何测试我的健身功能?它给我的印象是 GA 通常用于更随机/更复杂的事情。如果我们仔细观察,我们会注意到 Q 值遵循一个明显的趋势 - 靠近目标的 Q 值越高,离目标越远,Q 值越低。试图通过 GA 得出这个结论可能需要太长时间吗?
c++ - 我如何将遗传算法应用于遵循过山车轨道的简单游戏?
我可以自由支配我在学校的期末作业中所做的事情,关于修改一个简单的 Direct-x 游戏,该游戏目前只是让相机跟随一些过山车轨道。我对遗传算法产生了兴趣,并想借此机会应用并学习一些有关它们的知识。但是,在这种情况下,我想不出任何可能应用的方法。我有哪些选择?