【问题标题】:Need help reducing triple for loop to increase efficiency需要帮助减少三倍循环以提高效率
【发布时间】:2013-05-09 03:31:39
【问题描述】:
for (int i = 0; i < 3; ++i) {
    for (int k = 0; k < 7; ++k) {
        for (int h = i; h < 4 + i; ++h) {
            result = state.getAt(k, h);
            if (result == 1) {
                ++firstpl;
            }
            if (result == 2) {
                ++secondpl;
            }
            if (firstpl > 0 && secondpl > 0) {
                break;
            }
            //y = k;
        }
        if (firstpl == 0 && secondpl == 0) {
            break;
        } else if (firstpl > secondpl) {
            score += firstpl * firstpl;
            //if(state.getHeightAt(y)-3 < 3) score += 3+firstpl*2;
        } else {
            score -= secondpl * secondpl;
            //if(state.getHeightAt(y)-3 < 3) score -= 3+secondpl*2;
        }

        firstpl = 0;
        secondpl = 0;
    }
}

基本上我有一个 7 x 6 的网格。我正在浏览 7 列并垂直查看每 4 个连续的块。因为向上有6个街区。每列有 3 个四个连续的块。 State.getAt(k,h) 接受 x 和 y 并返回一个值。

【问题讨论】:

  • 为了帮助提高效率,我们需要了解更多上下文。例如,这个计算的最终目标是什么?这将帮助我们提出实现相同目标的替代方法。此外,为什么需要加快速度?您是针对state 的不同值多次调用此代码,还是多次调用但代码中的操作之一(例如state.getAt())很昂贵?如果是后者,那么最好专注于减少所需的昂贵操作的数量(例如,也许通过记忆化方法)。
  • 为什么需要提高这个效率?看起来根本不需要太多时间。你测量/分析过它吗?
  • 它在 Min_Max 函数中被调用,因此会被多次调用。我只被允许在几毫秒内产生分数。确切地说,它在评估函数中。
  • 对于最终目标,将每4个连续块的得分相加并返回。
  • 抱歉再次发表评论。澄清一下,状态是 7x6 网格。 getAt() 接受 x 值和 y 值并返回 0、1 或 2。

标签: java for-loop performance


【解决方案1】:

我认为您无法对此进行改进,除非您可以为这种“状态”找出一种替代表示,以允许增量执行此计算。

而且由于您未能正确解释状态或计算的实际含义,因此除了您之外,任何人都很难弄清楚替代方法是否可行。 (而且我不会试图从你的代码中逆向工程。)


好的。对于 Connect4,赢/输是 7x6 网格中水平、垂直或对角线的 4 个棋子线。所以你可以做的是将分数状态表示为一个计数器数组,对应于可以制作获胜线的每一列、每一行和对角线。 (7 + 5 + 4 + 4 = 其中 20 个 => 20 个计数器)然后构造一个从 (x,y) 位置到通过该位置的行索引的静态映射。当您在点 (x,y) 添加检查器时,您会查找计数器并增加它们。当您删除检查器时...递减。

我不确定这与您现有的计分功能有何关系……但我看不出该功能与赢得比赛的策略有何关系。无论哪种方式,您都可以潜在地使用上述方法逐步计算分数。

【讨论】:

  • 状态是游戏Connect 4的棋盘。我在看每个槽,看有没有连1,连2,连3。我根据它分配值并总结。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 2015-10-08
  • 2013-05-24
  • 1970-01-01
  • 2018-06-06
相关资源
最近更新 更多