人工智能如何为战舰进行基因编程建模

2023-12-15

我有一个关于基因编程的问题。我将研究遗传算法游戏名为战舰.

我的问题是:我如何决定人工智能进化的“决策”模型?这是如何运作的?

我已经阅读了多篇论文和多个答案,这些论文和答案只是谈到使用不同的模型,但找不到具体的内容,不幸的是,我显然需要集中精力解决这个问题。

我希望它能够经过多次迭代而发展,并“学习”什么最有效,但不确定如何保存这些“决定”(我知道保存到文件中,但如何“编码”?) 以一种好的方式,所以它将学会对之前的行动采取立场,并根据当前董事会状态的信息。

我一直在考虑为人工智能提供决策的“树结构”,但我实际上不知道如何开始。

如果有人可以给我指出正确的方向(链接?一些伪代码?类似的东西),那将非常感激,我尝试尽可能多地搜索谷歌,观看有关该主题的多个 YouTube 视频,但是我想我只需要朝着正确方向的一点推动。

我也可能只是不知道到底要搜索什么,这就是为什么我在实现什么以及如何实现这一点方面的结果是空白的。


回答第一部分:遗传算法的基础是拥有一组参与者,其中一些参与者进行繁殖。选择最适者进行繁殖,后代是父母的轻微变异的复制品。这是一个非常简单的概念,但要对其进行编程,您必须具有可以随机选择和动态修改的操作。对于战舰模拟,我创建了一个名为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 是最差的分数。

This Shooter演员有reproduce and 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。通过平均分数列表,您可以咳咳,进行“分析”。

A graph of the results looks like this: Graph of Scores vs Generations

正如您所看到的,它一开始的平均分数相当低,但学得很快。然而,船舶的方向不断变化,除了随机分量之外还会产生一些噪声。时不时地,突变会给群体带来一些混乱,但随着群体整体的进步,这种情况会越来越少。

挑战,以及许多论文肯定的原因,是让更多的事情变得可变,特别是以建设性的方式。例如,镜头的数量可以是可变的。或者,将镜头列表替换为一棵树,该树的分支取决于最后一个镜头是命中还是未命中might改善事情,但这很难说。这就是“决策”逻辑考虑的来源。拥有一个随机镜头列表或一棵根据先前镜头决定采用哪个分支的树是更好吗?更高级别的挑战包括预测哪些变化将使团队学习得更快并且不易受到不良突变的影响。

最后,考虑可能有多个组,例如一组是战舰猎人,一组是潜艇猎人。每个群体虽然由相同的代码组成,但可以“进化”不同的内部“遗传学”,使他们能够专门从事自己的任务。

不管怎样,一如既往,从简单的地方开始,边学边学,直到你足够好,可以回去阅读论文。

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();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

人工智能如何为战舰进行基因编程建模 的相关文章

  • 我可以通过在 Android Activity 中声明适当的成员“静态”来提高效率吗

    如果一个 Activity 在实践中是单例 我认为我可以通过声明适当的成员 静态 来获得一些效率 且风险为零 是的 The Android 文档说 http developer android com guide topics fundam
  • WCF 服务主机配置 - 请尝试将 HTTP 端口更改为 8732

    我的 PC 上运行着一个复杂的基于 WCF 服务的解决方案 但由于安装 Windows 8 1 时出现问题 我不得不 刷新 我的 PC 现在我已经重新安装了 Visual Studio 2012 我的项目不再正常运行 当我调试单元测试时 w
  • Java中单例的其他方式[重复]

    这个问题在这里已经有答案了 只是我在考虑编写单例类的其他方法 那么这个类是否被认为是单例类呢 public class MyClass static Myclass myclass static myclass new MyClass pr
  • Chrome 调试器注入 javascript

    我有这样的好奇心 是否可以以某种方式在我的页面中注入 javascript 并执行它并调试它 正如您在控制台中所做的那样 但在控制台中您无法暂停并观察变量 是否可以调试我通过控制台输入的代码 为什么无法调试通过 XHR 接收的代码 Than
  • mybatis:使用带有 XML 配置的映射器接口作为全局参数

    我喜欢使用 XML 表示法来指定全局参数 例如连接字符串 我也喜欢 Mapper 注释 当我尝试将两者结合起来时 我得到这个例外 https stackoverflow com questions 4263832 type interfac
  • 如何在连接到 Heroku PostgreSQL 的 Flask 应用程序上处理更多并发用户?

    Heroku 上的 Flask API 有许多端点 它们在将 json 化结果返回给客户端之前在我的 Heroku PostgreSQL 数据库上运行查询 我当前的计划是 Hobby Basic 层 因此数据库最多只能处理 20 个连接 如
  • Matplotlib loglog 的错误刻度/标签(双轴)

    我正在使用 matplotlib 创建对数图 如下图所示 默认刻度选择得很糟糕 充其量是这样 右边的 y 轴甚至根本没有 在线性等效中确实如此 而两个 x 轴都只有一个 有没有办法获得合理数量的带有标签的刻度 without为每个情节手动指
  • Jquery 以编程方式更改

    文本

    编辑 解决方案是将其添加到个人资料页面而不是性别页面 profile live pageinit function event p pTest text localStorage getItem gender 我在列表视图中有一个带有一些文
  • 如何为命令 stdout 添加 [stdout] 和 [stderr] 前缀?

    使用命令结构 https doc rust lang org std process struct Command html 如何向 stdout 和 stderr 缓冲区添加前缀 我希望输出看起来像这样 stdout things are
  • 区分 NaN 输入和输入类型为“number”的空输入

    我想使用 type number 的表单输入 并且只允许输入数字
  • 如何将 SQLite 数据库捆绑到 Go 二进制文件中?

    我尝试使用 go bindata 和 packr 但这些包没有显示如何将 SQLite 数据库文件打包到二进制文件中 我不需要以任何方式更新数据库 我只想在启动时从中读取数据 如何将 SQLite 数据库文件嵌入到 Go 二进制文件中 SQ
  • 在DialogFragment中,onCreate应该做什么?

    我目前正在摆弄 DialogFragment 以学习使用它 我假设相比onCreateView onCreate 可以这样做 public void onCreate Bundle savedInstanceState super onCr
  • 如何禁用 solr 管理页面

    对于生产来说 拥有一个甚至不要求登录凭据的 solr 管理员感觉不安全 如何禁用默认的 solr 管理页面 我只是希望我的 web 应用程序使用 Solr 进行搜索词索引 我强烈建议保留管理页面用于调试目的 它在很多情况下拯救了我 有多种方
  • 水平和垂直居中 div 位于页面中间,页眉和页脚粘在页面顶部和底部

    我正在尝试制作一个具有固定高度页眉和页脚的页面 页眉位于屏幕顶部 100 宽度 页脚位于底部 100 宽度 我想将一个具有可变高度内容的 div 居中放置在页眉和页脚之间的空间中 在下面的 jsfiddle 中 如果内容比空格短 它会起作用
  • java中void的作用是什么?

    返回类型 方法返回值的数据类型 如果方法不返回值 则返回 void http download oracle com javase tutorial java javaOO methods html http download oracle
  • 是否可以使用 Dapper 流式传输大型 SQL Server 数据库结果集?

    我需要从数据库返回大约 500K 行 请不要问为什么 然后 我需要将这些结果保存为 XML 更紧急 并将该文件通过 ftp 传输到某个神奇的地方 我还需要转换结果集中的每一行 现在 这就是我正在做的事情 TOP 100结果 使用 Dappe
  • 描述符“join”需要“unicode”对象,但收到“str”

    代码改编自here http wiki geany org howtos convert camelcase from foo bar to Foo Bar def lower case underscore to camel case s
  • 对象指针值作为字典的键

    我想使用对象的引用值作为字典的键 而不是对象值的副本 因此 我本质上想在字典中存储与另一个对象的特定实例关联的对象 并稍后检索该值 这可能吗 是不是完全违背了NSDictionary的理念 我可以看出我可能以错误的方式处理这个问题 因为字典
  • 通过 Telnet 运行应用程序

    我需要创建一个 BAT 文件来通过 telnet 运行应用程序 但据我所知 在 DOS 上无法执行此操作 Telnet 不允许在连接的瞬间向远程计算机发送任何命令 并且 BAT 文件中的每个后续命令只有在 telnet 停止后才会执行 这段
  • R data.table 1.9.2 关于 setkey 的问题

    这似乎是 1 8 10 后引入的一个错误 与包含列表的 DT 的 setkey 相关 运行下面两个代码来查看问题 library data table dtl lt list dtl 1 lt data table scenario 1 p

随机推荐

  • execvp - ls: fts_open: 没有这样的文件或目录

    我目前正在努力解决这个错误 我正在编写一个 shell 模拟器 使用 fork 来使用 execvp 执行命令 几乎我尝试解析到 shell 的每个命令都运行良好 除了不带参数的 ls 如果我尝试执行 ls lah 一切正常 但简单的 ls
  • 从结构体字段分配变量时“无法移出借用的内容”

    我正在学习 Rust 并且正在与借用检查器作斗争 我有一个基本的Point结构 我有一个scale修改点的所有坐标的函数 我想从另一个名为的方法调用此方法convert struct AngleUnit struct Point x f32
  • 数组的累积和

    所以我正在解决一个问题 重点是获取数组的累积和 例如 如果我有一个 0 2 3 1 1 数组 它将返回 0 2 5 4 3 或者如果你有一个 1 2 3 4 5 6 7 8 9 10 数组 它应该返回 1 3 6 10 15 21 28 3
  • Ctrl-Shift-键发出蜂鸣声但不发送到终端

    My OS X terminal does not seem to recognise Ctrl Shift Instead it beeps when I hit Ctrl Shift and any other key on the k
  • 将 cURL 响应流式传输到发布结果的另一个 cURL 命令

    有一个公共流式 Meetup API 可传输 JSON 事件 http stream meetup com 2 rsvps 在命令行的一行中 我希望能够重定向该流 以便将每个 JSON 对象发布到另一个 API 我已经尝试了很多 cURL
  • 在 Python 中生成唯一哈希的最安全方法

    我需要生成可在文件名中使用的唯一标识符 并且可以在给定相同输入值的情况下重现 我需要生成数百万个这样的标识符 因为源输入有数百万种组合 为了简单起见 我将在示例中使用一个小集合 但实际的集合可能相当大 数百个 也许数千个项目 大于可以手动编
  • 因诺数据库;多个数据目录

    我需要将两个 Innodb 数据库文件存储在不同的分区上 一个数据库位于 raid0 上以提高速度 另一个数据库位于 raid1 上以提高稳定性 根据我的阅读 实现这一目标的唯一方法是使用innodb file per table并将 ib
  • ASP.NET Core 中的属性注入

    我正在尝试将 ASP NET 应用程序移植到 ASP NET Core 我在 UnitOfWork 实现上进行了属性注入 使用 Ninject 如下所示 Inject public IOrderRepository OrderReposit
  • 导入错误:无法导入名称 ExponentialSmoothing

    我尝试在 python 中安装 statsmodels 安装后 我用 pip freeze 检查了 该包可以在列表中看到 当我尝试时 from statsmodels tsa api import ExponentialSmoothing
  • R read.table 将行列条目循环到下一行

    这是我第一次使用 read table 遇到此问题 对于具有大量列的行条目 read table 会将列条目循环到下一行 我有一个 txt 文件 其中的行长度可变且不等 作为参考 这是我正在阅读的 txt 文件 http www broad
  • oauth2 openid 连接 javascript (电子) 桌面应用程序

    桌面应用程序的正确 oauth2 流程是什么 除了桌面应用程序之外 我还有一个使用隐式流程的 SPA Web GUI 在那里 客户端是否在 3600 秒后重定向到 IdP 以颁发新的访问令牌并不重要 但桌面应用程序需要 24 7 运行 或者
  • 根据 URL 前缀执行不同的操作

    这是我的情况 我正在我的 ios 应用程序上本地调用文件 在 Swift 中运行 如果文件是 jpg 则发生一个操作 如果文件是 mp4 则发生另一个操作 为此 我使用这段代码 let urlString posts selectedInd
  • 延迟的作业和操作邮件程序

    我在使用 ActionMailer 实施延迟作业时遇到问题 延迟实施工作之前 class NotificationsMailer lt ActionMailer Base default from gt email protected de
  • Ionic - 没有互联网连接

    我们正在使用 Ionic Cordova 构建 Android 应用程序 这一切都在我的浏览器中运行 但是当我构建它并运行 apk 时 会发生这种情况 外部图像不会出现 嵌入的谷歌地图仍为空 我们的index html中有以下代码
  • 如何因 Django 中的不活动而使会话过期?

    我们的 Django 应用程序具有以下会话管理要求 当用户关闭浏览器时 会话就会过期 会话在一段时间不活动后就会过期 检测会话何时因不活动而过期并向用户显示适当的消息 在不活动期结束前几分钟警告用户会话即将到期 除了警告之外 还为用户提供延
  • CoreData 唯一约束在 Xcode 中消失

    我想做的事 为属性添加唯一约束photoID在实体中PhotoUpload Problem 我点击约束并添加photoID 当我导航到另一个文件并返回到xcdatamodeld文件中 约束不存在 它会自动删除 所以唯一约束不起作用 到目前为
  • java 8 中的函数式接口如何工作

    这是我在研究函数式接口概念时遇到的一个例子 interface Sayable void say public class MethodReference public static void saySomething System out
  • onActivityResult 返回 Intent data.getData();始终为 Null 仅在 Marshmallow 和 Lollipop 中

    阅读我的整个代码 它在所有手机上都能完美运行 除了Marshmallow and Lollipop In Marshmallow and Lollipop电话 唯一的问题是进来data getData 返回null仅在以下情况下拍摄的照片
  • 如何让弹性项目具有相同的宽度?

    我希望第一个和最后一个元素具有相同的宽度 怎么做 main display flex justify content space between width 100 input width 200px
  • 人工智能如何为战舰进行基因编程建模

    我有一个关于基因编程的问题 我将研究遗传算法游戏名为战舰 我的问题是 我如何决定人工智能进化的 决策 模型 这是如何运作的 我已经阅读了多篇论文和多个答案 这些论文和答案只是谈到使用不同的模型 但找不到具体的内容 不幸的是 我显然需要集中精