【问题标题】:Acquire maximum nodes (score) in a graph获取图中的最大节点(分数)
【发布时间】:2019-08-13 03:45:20
【问题描述】:

我得到了一个图Gn 顶点,标记从1n (2<=n<=10^5)。每个顶点都有一个与之相关的分数。两个朋友AB 玩游戏。 A 以顶点 1 和 B 从 n 开始。在任何步骤中,如果该顶点尚未被占据并且与同一玩家已经占据的任何顶点相邻,则玩家可以移动到该顶点。 A 首先开始。最终分数是您从访问的节点获得的所有分数的总和。得分多的玩家获胜。 AB 中的哪一个赢得了比赛?如果两个玩家得分相同,B 获胜。

我的尝试:

如果G 是一棵树,我可以得到从1n 的路径。说是

1 -> a_1 -> a_2 -> ... a_k -> n

A 将占据所有 1a_1、...a_x(其中 x = ceil(k/2))的“子”节点,B 将占据其余节点。我们可以看看谁得到的更多,并成为赢家。


如果G 是一个图(多于n-1 边),则上述方法将不起作用,因为从给定起点到顶点的路径可能不止一条。所以,我为A 和其他B 创建了一个最大堆。那么:

  1. 首先在各自的堆中添加1s 和ns 相邻顶点的分数。

  2. 获取最大分数的索引,将其删除。将其相邻顶点的分数添加到各自的堆中。

分数高的获胜。

对吗?不,这是一种贪婪的方法,在很多情况下都会给出错误的答案。这种情况下的最佳策略应该是什么?


示例

假设n = 5。以下顶点是相邻的:

1 5
1 2
3 5
4 5

与每个顶点相关的分数分别为:

10 20 30 40 50 

A 初始得分为10B 50。A 只能访问2(最终得分=10 + 20)而B 可以访问34(最终得分)分数 = 30 + 40 + 50)。因此B 赢得了比赛。

【问题讨论】:

  • 我们可能会遇到这样一种情况,即一名球员有可用动作而另一名球员没有。这种情况下游戏会停止吗?
  • @hilberts_drinking_problem no.在这种情况下,另一个人会继续,直到他有可用的动作
  • 问题对我来说不是很清楚。玩家是否在前往每个节点时获得分数(因此将您访问的所有节点的分数相加),还是他们在游戏结束时只有当前节点的分数。另外,如果你通过一个节点,你可以重新访问它吗?而其他玩家根本无法使用它?因为那时你可能想访问分数小的节点来阻止访问大块,然后在其他玩家没有移动等时收集它们。请澄清问题。
  • 动态编程方法不起作用?每一步,所有相邻的顶点都在哪里考虑?
  • 因为游戏中的组合实在是太多了。假设您有一个节点作为通往许多高分节点的通道,如果您获得了入口,尽管该节点的分数为零,您最终将获胜,因为您可以收集所有保留给您的高分节点。在其他一些情况下,您可能需要变得贪婪,只收集得分最高的节点。在其他一些情况下,您可能有兴趣消除对手的最佳情况行动,或通过包围对手等来诱捕对手。因此,这在很大程度上取决于游戏状态,这是一个“最小最大”问题

标签: algorithm graph graph-algorithm graph-traversal


【解决方案1】:

正如在 cmets 中已经提到的,这是一个复杂的问题,许多情况应该被视为象棋游戏,决策高度依赖于图的初始化方式,而且图似乎是随机初始化的。因此,在我看来,不是一种简单的获胜方法,它需要一种启发式算法。

事实证明它需要启发式算法:(如 cmets 中所述)

  1. 需要访问一个分数小的节点来阻止访问一个大的节点,然后在其他玩家没有动作时收集它
  2. 需要让其他玩家出招
  3. 需要强制优先选择得分最高的节点的情况

我相信为了下一步行动做出一个合乎逻辑的决定,应该创建一个minimax 树(就像在普通国际象棋游戏中发生的那样)。每个节点都应标有一个值,该值指示要达到的程度,该值应由position evaluation function 计算。最后玩家A 考虑玩家B 下一个可能的举动。为了使其最优,可以考虑使用alpha-beta pruning 算法。

玩家B很有可能赢得大部分比赛的机会更高,因为他以最高分开始。但是,如果图形以玩家A 可以阻止玩家B 访问其他节点玩家A 的方式进行初始化,则可以获胜。考虑这个图表:

1 2
2 3
2 4
2 5

【讨论】:

    猜你喜欢
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多