Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在锦标赛中赢得分数的最佳算法(带演示2人游戏) 背景_Javascript_C++_Algorithm - Fatal编程技术网

Javascript 在锦标赛中赢得分数的最佳算法(带演示2人游戏) 背景

Javascript 在锦标赛中赢得分数的最佳算法(带演示2人游戏) 背景,javascript,c++,algorithm,Javascript,C++,Algorithm,我参加了一场完整的代码部队竞赛。这个问题被称为“关于树的一个简单问题” 皮盖伊和皮耶尔在玩游戏。它们有一个有根的二叉树,它的属性是每个节点要么是一片叶子,要么正好有两个子节点。每个叶都有一个与其关联的编号 轮到他/她时,玩家可以选择共享其直接父对象的任意两个叶,将它们移除,并将它们的任一值与其父对象关联,该父对象现在成为一个叶(玩家决定关联这两个值中的哪一个)。当只剩下一个节点(树的根节点)时,游戏结束 Piegay首先开始,他的目标是在游戏结束时最大化与根相关的价值。Piegirl希望最小化该

我参加了一场完整的代码部队竞赛。这个问题被称为“关于树的一个简单问题”

皮盖伊和皮耶尔在玩游戏。它们有一个有根的二叉树,它的属性是每个节点要么是一片叶子,要么正好有两个子节点。每个叶都有一个与其关联的编号

轮到他/她时,玩家可以选择共享其直接父对象的任意两个叶,将它们移除,并将它们的任一值与其父对象关联,该父对象现在成为一个叶(玩家决定关联这两个值中的哪一个)。当只剩下一个节点(树的根节点)时,游戏结束

Piegay首先开始,他的目标是在游戏结束时最大化与根相关的价值。Piegirl希望最小化该值。假设两个玩家都处于最佳状态,那么当游戏结束时,与根相关的数字是多少

树的大小最多为250个节点

比赛中没有人解决这个问题

问题: 解决这个问题的有效算法是什么

<>我会对C++中的答案感兴趣(可以在码本站点上进行测试),或者在JavaScript中(允许我添加AI给游戏)< /P> 我试过的 通过选择阈值水平T并回答“是否可以保证获得小于或等于T的值?”的问题,可以简化该问题。 如果我们能解决这个更简单的问题,那么我们可以使用二分法来找到T的最小值,这将是原始问题的答案

简化后的问题相当于一个有斑点的游戏:

规则:

  • 这是一个两人游戏,游戏的目的是加入所有的斑点,使你的颜色一个巨大的斑点
  • 玩家们轮流组合水滴
  • 可以合并两个相邻的相同大小的水滴。如果两个斑点中的任何一个是你的颜色,那么最终的颜色将是你的颜色
  • 我制作了一个这个游戏的演示,试图了解这个策略

    到目前为止,感觉就像:

  • 把你的颜色做成大斑点很好
  • 经常会有陷阱,在那里谁先动谁就会输
  • 最后一步的玩家只需要让前两个子模组中的一个有颜色,而另一个玩家需要让两个子模组都有颜色
  • 通常有一些区域可以进行一些等待移动,这些移动不会影响子模糊的最终颜色
  • 我认为一个简单的minimax前瞻(例如,使用一个评分更高的评价函数)在实践中可能会很好地工作,但它感觉应该有一个更好的算法来最佳地解决这个问题

    有人有进一步的想法吗

    更新 我已经在演示中添加了一个极大极小解算器(单击FindBest使计算机运行)。
    这对于深度高达4的情况很好,以毫秒为单位进行求解,但对于深度为5或更高的情况,需要花费很多时间来思考。我可以通过保存以前看到的位置的结果来加速这一过程,但即使有了这一改进,它仍有巨大的状态空间可供探索。

    这不是一个完整的答案,但它太长,无法发表评论

    让我们把运动员分别称为蓝色和红色。对于给定的树,有四种可能在最佳播放下获胜:始终为蓝色(
    B
    ),始终为红色(
    R
    ),始终为第一名玩家(
    1
    ),始终为第二名玩家(
    2
    )。即使子树有奇数个叶子(即偶数个移动),我们也将其称为奇数;如果子树有偶数个叶子(即奇数个移动),我们将其称为奇数

    下面是缺少几个案例的案例分析。它仍然可能对优化极小极大搜索有用

    子树的三种不同性质的可能性是偶数、偶数、奇数(对称地,奇数、偶数)和奇数。让我们对称地假设蓝色首先起作用

    甚至,甚至 蓝色是第一个也是最后一个。如果有一个
    B
    1
    子树,那么Blue通过在其中玩来获胜。随后的子树选择由Blue echo Red的剧本完成。如果两个子树都是
    R
    2
    ,则红色通过响应蓝色的子树选择而获胜

    Missing cases: none
    
    奇数 蓝色是第一个也是最后一个。如果有一个
    B
    2
    子树,那么蓝色通过在另一个子树中播放并在红色的子树中暂停来获胜。如果两个子树都是
    R
    ,则Red通过在两个子树中强制交替来获胜

    Missing cases: R1 (= 1R), 11
    
    奇偶 蓝色第一,红色最后。如果奇数子树是
    R
    2
    ,则只要蓝色在偶数子树中暂停,红色就会获胜。如果偶数子树是
    B
    2
    ,而奇数子树是
    B
    1
    ,则蓝色通过在奇数子树中播放并响应红色在同一子树中的后续播放而获胜

    Missing cases: RB, R1, 1B, 11
    
    评论 有问题的情况似乎是一个玩家强迫另一个玩家在子树中连续移动两次。从竞赛参数来看,在一次任意移动后,似乎有足够的时间来确定胜负,但案例分析变得非常漫长,比我现在有耐心的时间更长。

    Update 该解决方案发布在教程中:

    这个问题的解决方案是在一棵具有 O(n)复杂性

    在这篇社论中,“偶数树”指的是一棵树,玩家可以在其中做出选择 偶数圈数,而“奇数树”是指玩家在其中的树 将进行奇数圈

    我们将解决一个稍加修改的问题:其中所有 叶子上的数字是0$s和1$s。这个问题一旦解决了,, 一般的问题可以通过在计算机上进行二进制搜索来解决 回答,然后在所有的叶子上打上记号