- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个关于遗传编程的问题。我将研究 game called Battleships 的遗传算法.
我的问题是:我将如何决定 AI 进化的“决策”模型?它是如何工作的?
我已经阅读了多篇论文和多个答案,它们只是谈论使用不同的模型,但找不到具体的内容,不幸的是,我显然需要全神贯注地解决这个问题。
我希望它在多次迭代中进化并“学习”什么最有效,但不确定如何保存这些“决定”(我知道保存到文件中,但如何“编码”?)以一种好的方式,因此它将学会对先前的操作采取立场并基于当前棋盘状态的信息。
我一直在考虑让 AI 做出决策的“树结构”,但实际上我不知道如何开始。
如果有人能给我指出正确的方向(链接?一些伪代码?类似的东西),那将不胜感激,我尽可能多地使用谷歌搜索,观看多个关于主题,但我认为我只需要在正确的方向上稍微插入一下。
我也可能只是不知道到底要搜索什么,这就是为什么我对实现它的内容和方式一无所知。
最佳答案
第 I 部分的答案:遗传算法的基础是拥有一组参与者,其中一些参与者会进行繁殖。选择最适者进行繁殖,后代是 parent 稍有突变的副本。这是一个非常简单的概念,但要对其进行编程,您必须具有可以随机选择和动态修改的操作。对于战舰模拟,我创建了一个名为 Shooter
的类,因为它会“射击”一个位置。这里的假设是第一个位置已经被击中,射手现在正试图击沉战列舰。
public class Shooter implements Comparable<Shooter> {
private static final int NUM_SHOTS = 100;
private List<Position> shots;
private int score;
// Make a new set of random shots.
public Shooter newShots() {
shots = new ArrayList<Position>(NUM_SHOTS);
for (int i = 0; i < NUM_SHOTS; ++i) {
shots.add(newShot());
}
return this;
}
// Test this shooter against a ship
public void testShooter(Ship ship) {
score = shots.size();
int hits = 0;
for (Position shot : shots) {
if (ship.madeHit(shot)) {
if (++hits >= ship.getSize())
return;
} else {
score = score - 1;
}
}
}
// get the score of the testShotr operation
public int getScore() {
return score;
}
// compare this shooter to other shooters.
@Override
public int compareTo(Shooter o) {
return score - o.score;
}
// getter
public List<Position> getShots() {
return shots;
}
// reproduce this shooter
public Shooter reproduce() {
Shooter offspring = new Shooter();
offspring.mutate(shots);
return offspring;
}
// mutate this shooter's offspring
private void mutate(List<Position> pShots) {
// copy parent's shots (okay for shallow)
shots = new ArrayList<Position>(pShots);
// 10% new mutations, in random locations
for (int i = 0; i < NUM_SHOTS / 10; i++) {
int loc = (int) (Math.random() * 100);
shots.set(loc, newShot());
}
}
// make a new random move
private Position newShot() {
return new Position(((int) (Math.random() * 6)) - 3, ((int) (Math.random() * 6)) - 3);
}
}
这里的想法是,Shooter
有多达 100 次射击,在 X 方向的 +-3 和 Y 方向的 +-3 之间随机选择。是的,100 次射击有点过头了,但是嘿,任何。将 Ship
传递给此 Shooter.testShooter
,它将自行评分,100 分是最高分,0 分是最差分。
这个 Shooter
actor 有 reproduce
和 mutate
方法,它们将返回一个有 10% 的射击随机变异的后代。一般的想法是,最好的 Shooters
已经“学会”尽可能快地以交叉模式 ('+') 射击他们的射击,因为一艘船以四种方式之一定向(北,南、东、西)。
运行模拟的程序 ShooterSimulation
非常简单:
public class ShooterSimulation {
private int NUM_GENERATIONS = 1000;
private int NUM_SHOOTERS = 20;
private int NUM_SHOOTERS_NEXT_GENERATION = NUM_SHOOTERS / 10;
List<Shooter> shooters = new ArrayList<Shooter>(NUM_SHOOTERS);
Ship ship;
public static void main(String... args) {
new ShooterSimulation().run();
}
// do the work
private void run() {
firstGeneration();
ship = new Ship();
for (int gen = 0; gen < NUM_GENERATIONS; ++gen) {
ship.newOrientation();
testShooters();
Collections.sort(shooters);
printAverageScore(gen, shooters);
nextGeneration();
}
}
// make the first generation
private void firstGeneration() {
for (int i = 0; i < NUM_SHOOTERS; ++i) {
shooters.add(new Shooter().newShots());
}
}
// test all the shooters
private void testShooters() {
for (int mIdx = 0; mIdx < NUM_SHOOTERS; ++mIdx) {
shooters.get(mIdx).testShooter(ship);
}
}
// print the average score of all the shooters
private void printAverageScore(int gen, List<Shooter> shooters) {
int total = 0;
for (int i = 0, j = shooters.size(); i < j; ++i) {
total = total + shooters.get(i).getScore();
}
System.out.println(gen + " " + total / shooters.size());
}
// throw away the a tenth of old generation
// replace with offspring of the best fit
private void nextGeneration() {
for (int l = 0; l < NUM_SHOOTERS_NEXT_GENERATION; ++l) {
shooters.set(l, shooters.get(NUM_SHOOTERS - l - 1).reproduce());
}
}
}
代码从 run 方法中读取为伪代码:创建一个 firstGeneration
然后迭代若干代。对于每一代,为飞船设置一个newOrientation
,然后执行testShooters
,并使用Collections.sort
对测试结果进行排序。 printAverageScore
的测试,然后构建 nextGeneration
。有了平均分列表,咳咳,做个“分析”。
如您所见,它一开始的平均分数很低,但学得很快。然而,船的方向不断变化,除了随机成分外,还会产生一些噪音。时不时地,一个突变会把群体搞得一团糟,但随着群体整体的改善,这种情况会越来越少。
挑战,以及许多论文可以肯定的原因,是让更多的东西可变,尤其是以建设性的方式。例如,拍摄次数可能是可变的。或者,将镜头列表替换为根据最后一击是命中还是未命中而分支的树可能会改善情况,但很难说。这就是“决策”逻辑考虑因素的来源。拥有随机镜头列表或根据先前镜头决定采用哪个分支的树更好吗?更高级别的挑战包括预测哪些变化将使团队学习得更快并且更不容易受到不良突变的影响。
最后,考虑可能有多个组,例如一组是战列舰猎人,一组是潜艇猎人。每个小组虽然由相同的代码组成,但可以“进化”出不同的内部“遗传学”,从而使他们能够专注于他们的任务。
无论如何,一如既往,从简单的地方开始,边学边学,直到你足够好,可以回去阅读论文。
PS> 也需要这个:
public class Position {
int x;
int y;
Position(int x, int y ) {this.x=x; this.y=y;}
@Override
public boolean equals(Object m) {
return (((Position)m).x==x && ((Position)m).y==y);
}
}
更新:添加了 Ship
类,修复了一些错误:
public class Ship {
List<Position> positions;
// test if a hit was made
public boolean madeHit(Position shot) {
for (Position p: positions) {
if ( p.equals(shot)) return true;
}
return false;
}
// make a new orientation
public int newOrientation() {
positions = new ArrayList<Position>(3);
// make a random ship direction.
int shipInX=0, oShipInX=0 , shipInY=0, oShipInY=0;
int orient = (int) (Math.random() * 4);
if( orient == 0 ) {
oShipInX = 1;
shipInX = (int)(Math.random()*3)-3;
}
else if ( orient == 1 ) {
oShipInX = -1;
shipInX = (int)(Math.random()*3);
}
else if ( orient == 2 ) {
oShipInY = 1;
shipInY = (int)(Math.random()*3)-3;
}
else if ( orient == 3 ) {
oShipInY = -1;
shipInY = (int)(Math.random()*3);
}
// make the positions of the ship
for (int i = 0; i < 3; ++i) {
positions.add(new Position(shipInX, shipInY));
if (orient == 2 || orient == 3)
shipInY = shipInY + oShipInY;
else
shipInX = shipInX + oShipInX;
}
return orient;
}
public int getSize() {
return positions.size();
}
}
关于java - AI 如何为战舰建模遗传编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35820854/
更新:下面提到的stackoverflow给出了另一种解决方案,即导入json并用正确格式的数据替换文本。我现在试图看看如何适应给定的格式,它看起来像这样: { "text" : "use
有谁知道三者之间的具体区别和功能,或者作为开发人员是否有更多功能/更灵活地使用? 最佳答案 wit.ai 与 Dialogflow 与 luis.ai ╔═══════════════════════
我知道 Wit.ai 引擎可以通过手动验证案例来训练,但是有没有办法用一组定义的输入和输出来训练它? 最佳答案 您可能可以查看其中一个应用程序的导出格式并对其进行调整以导入新应用程序。 https:/
来自 wit.ai 团队的一些人请回答这个 我们计划将 wit.ai 用于商业目的。有使用政策吗?请提供一些注意事项指南。此外,这项服务将来是否也是免费的,还是您计划推出企业版? 主要是 API 命中
我需要添加一个确认实体,以便在对话框流 (api.ai) 中的某个操作的参数中得到"is"或“取消”。假设用户正在购买咖啡,我会询问有关咖啡和数量的详细信息,最后我需要确认,我应该向哪个实体申请?任何
谁能帮我解决上面的问题。我们必须在数组 (a1,a2),(a1,a3),(a1,a4).... 等中找到元素的组合,然后选择满足条件 (ai*aj) <= max 的组合(A) 其中 A 是数组并返回
我正在尝试训练我的 Wit.ai 机器人以识别某人的名字。我不太确定我是否完全理解 NLP 的工作原理,所以我会给你一个例子。 我定义了很多表达,比如“我的名字是XXXX”、“大家都叫我XXXX” 在
我想知道是否存在一个网站,人们可以上传他们的 AI 在不同的棋盘游戏中相互竞争:国际象棋、五子棋等。 该站点将接受程序的源代码(以某种通用语言编写)、对其进行编译并相互运行程序。所有程序都必须使用一些
大家好,我是程序员幽鬼。 你想为后代开发一个令人难以置信的应用程序,你想到的第一件事——人工智能!还有什么比模仿人类智能的机器更令人着迷的呢?如果你期待打破刻板印象并准备推出出色的 AI 应用
我在 Application Insights Analytics 中创建了几个查询来获取我想要的图表。 示例: customEvents | where timestamp >= ago(31d)
我似乎无法让这个请求生效: https://wit.ai/docs/http/20160526#delete--entities-:entity-id-values-link 我已经设置了一个值为“C
我正在尝试在 wit.ai 中编写示例应用程序。我使用在 https://wit.ai/docs/quickstart 中显示的 node.js 客户端跟随快速启动应用程序。 .那里显示的示例只有一个
在 api.i(dialogflow) 中,我想获取用户的输入,如姓名、年龄、邮件等,并使用 PHP 将它们存储在我的 MYSQL 数据库中。 如何在对话流中生成我的代理的公共(public) API
我目前正在与 Wit.ai 合作 webpage in CodePen.io .我想知道是否可以使用 HTTP API 检索 Wit.ai 机器人的文本响应(“Bot says”)。 例如:如果用户要
我接到了一项任务,要编写一个由人类玩家和 AI 玩家组成的 NIM 游戏。游戏是“Misere”(最后一个必须拿起一根棍子的人输了)。 AI 应该使用 Minimax 算法,但它正在采取使其输得更快的
为了通过 shell 从端点取消部署模型,我必须指定 deployed-model-id如 gcloud ai endpoints undeploy-model 中所述 我如何获得这个已部署的模型 I
我在谷歌的 Vertex AI 中运行自定义训练作业。执行自定义作业的简单 gcloud 命令将使用类似于以下语法的内容(可以查看命令的完整文档 here ): gcloud beta ai cust
Wit AI project 在他们的 Converse 功能中添加了一个名为 Story 的新概念。有没有办法通过 HTTP API 管理(创建/编辑/验证)这些 Wit AI 故事? 最佳答案 W
我想为 Google 智能助理部署一个应用。但是,我想使用不同的 AI 后端而不是 api.ai。 有人知道这是否可能吗?如何? 或者如果我想使用 Google 智能助理,我会被 api.ai 困住吗
我的项目有一个依赖项,需要 python v3.6+。因此,它会在通过 pip 在 python 3 内核中安装时抛出错误,因为 AI Platform Notebooks 默认附带 v3.5。如何使
我是一名优秀的程序员,十分优秀!