0

我有一个带有几个公共方法的公共类。该类还可能具有指示状态的公共属性。这些方法可能有参数。也许是一个返回值。也许其中一些被定义为异步的。假设该类表示控制游戏的接口。

也许这个类有左移、右移、跳跃、开火等方法。

例子:

public class Game
{
    public int Ammo { get; private set; }

    public void Fire() { /* ... */ }
    public void Jump() { /* ... */ }
    public void MoveRight() { /* ... */ }
    public void MoveLeft() { /* ... */ }
    // more methods
}

我想用ml.net来上课,玩游戏。我该怎么做?

4

2 回答 2

1

您可以将命令模式与 ML.NET 结合使用来解决您的问题。命令模式本质上生成命令序列,然后由传统架构模式意义上的命令解释器执行。

我们使用命令模式生成游戏训练数据如下:

创建一个名为 GameState 的类。

public class GameState
{
  public enum GameAction
  {
    Fire,
    Jump,
    MoveRight,
    MoveLeft,
    ...
  }

  public GameState Current { get; set; }
  public GameAction NextAction { get; set; }
  public GameOutcome Outcome { get; set; }

  public string Descriptor { 
    get {
       // returns a string that succinctly and uniquely 
       // describes the current game state
    }
  }
}

并定义一个 GameOutcome 类:

public class GameOutcome
{
  public int GameID { get; set; }
  public enum OutcomeState
  {
     Win,
     Loss,
     Tie,
     Unfinished
  }
  public OutcomeState Outcome { get; set; }
}

如果您可以从实际游戏中生成 GameState 序列作为训练数据,那么您可以使用 ML.NET 创建一个预测器(本质上是 MultiClassClassifier),它采用 GameState.Descriptor、GameState.Outcome.OutcomeState 和 GameState.NextAction 以及 Descriptor 和 OutcomeState作为特征,NextAction 作为预测标签。

在现场(自动游戏)中,您初始化游戏状态,然后预测下一个动作,将 OutcomeState 设置为“Win”,并使用 ML 分类器来预测学习到的下一个动作。

诀窍在于封装丰富而简洁的游戏状态描述,其中考虑了进入当前游戏状态所遵循的步骤历史和游戏的预计未来结果(来自大量历史游戏)。

于 2019-03-25T18:16:22.683 回答
1

据我所知,您想构建一个“人工智能”,将“控制输入”应用于给定系统(如您的Game班级),并学习“玩游戏”。

这似乎与强化学习的定义非常吻合。正如您从 Wikipedia 文章中看到的那样,存在许多强化学习方法,因此您现在所说的问题还不够明确,只能有一种解决方案。

正如评论中还提到的,ML.NET 目前不支持任何强化学习方案。这可能会在未来发生变化,特别是如果公众对它们有足够的兴趣。

于 2018-08-20T15:13:21.090 回答