【问题标题】:How can I compute the best outcome and keep it efficient?如何计算最佳结果并保持高效?
【发布时间】:2014-02-27 16:55:41
【问题描述】:

我正在构建一个游戏,我需要有关如何在此处继续的帮助。这个函数可能会经常被调用,直到最近阶段的每一分钟。我不能让它成为瓶颈并放慢速度,我能看到它的唯一方法是暴力破解它,我很确定它可以以更好的方式完成。

我有(最多)16 件物品。

我必须把它们放在一个 4x4 的网格中

每个项目都有 16 分(0 到 3k),具体取决于它们在网格中的位置。

编辑没有算法,只有简单的属性:

item A : position (0,0) = 2 point
item A :  position (0,1) = 123 point 
item A :  position (0,2) = 9 point
... 

item B :  position (0,0) = 0 point
item B :  position (0,1) = 0 point 
item B :  position (0,2) = 1224 point
....

If you set item A in position (0,0) and end your turn, your total socre is 2.
IF you set item A in posistion(0,0) + item B in position (0,2) than end your turn,  your total score is 1226

每 16 项等。

我可以获取每个项目的每个可能位置的数组,并检查每个结果的总分......但是构建一个包含 16 的数组! int 每分钟对我来说似乎不是一种非常有效的方法。

如何计算可能的最佳结果(总分)?

编辑:似乎得分似乎很重要(但我看不到如何):

Public Class Item
    Public Property Objects As List(Of BaseObject)

    Public Function Score(position) As Integer
        Dim total As Integer = 0
        For Each o In baseObject
            total += o.value(position)
        Next

        Return total
    End Function
End Class

Public Class RedObject
    inherits BaseObject

    property value as list(of integer)
end Class

【问题讨论】:

  • 举一个更具体的例子。 IE。你输入的数字和你试图达到的最佳结果。您可以尝试 3x3,只是为了展示这个概念 - 这可能是蛮力的。
  • 我从 4x4 网格开始。它最终会增加大小。当我到 8 点!或 9!暴力破解确实是个坏主意。
  • 忘记网格大小:你还没有解释评分算法;请这样做,因为这几乎是我们可以提供帮助的唯一方法。
  • 你知道局部最大值是否是全局最大值吗?即你的优化函数是凸的吗?
  • @lev 我什至不知道凸函数是什么意思

标签: c# vb.net artificial-intelligence


【解决方案1】:

您可能会考虑编写一个递归例程来计算每种可能性的值。如果您有性能问题,您可以使用参数限制递归的深度。在伪代码中,这看起来像:

GameBoard GetBestNextMove(GameBoard, recursiveDepth) {
    if (recursiveDepth == 0 || GameBoard.NoMovesRemaining()) return GameBoard;

    BestGameBoard = null;
    foreach (possibleMove) {
       GameBoard = GameBoard.Clone();
       GameBoard.MakeMove(possibleMove);
       GameBoard = GetBestNextMove(GameBoard, recursiveDepth - 1);
       if (GameBoard != null) {
         if (BestGameBoard == null) BestGameBoard = GameBoard;
         else if (GameBoard.Score > BestGameBoard) BestGameBoard = GameBoard;
       }
    }

    return BestGameBoard;
}

同样,这是 PSEUDO 代码,但希望它能让您走上正确的道路。

【讨论】:

  • @dew_w 除非我没看懂,这只是一种(更)干净的方法来测试每个可能的结果?
  • @ThierrySavardSaucier 你可能会这么说。由于我对游戏的了解不够,我编写了一种蛮力方法来限制搜索的深度。限制的重点是确保对于复杂的游戏(想想“国际象棋”)不会永远持续下去
  • 好的,谢谢。这比我所做的要先进得多。我没有提供太多信息,因为它是获得我想要的结果的数学方法(我确定它存在,我从 2 天开始就尝试用谷歌搜索,发现它与阶乘函数和二项式系数有关,但不要足够了解数学以理解这一切)
  • @ThierrySavardSaucier 如果你想要数学细节,我想你可能不得不更好地解释游戏!
  • 这件作品有一个位置得分,它只是我发明的自动判断项目A是否比项目B更好的(0,0)。我不明白为什么每个人都关注分数,它甚至不是一个真正的价值。它只是我发明的一个评分系统,用来帮助我决定哪个位置最适合不同的项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多