【发布时间】:2012-01-06 18:23:02
【问题描述】:
我有一个加权的有向图,它包含大约 20,000 个节点。
- 给定图中的一个节点,我以与相对权重相关的概率随机选择一个相邻节点。
- 每次选择后,我都会收到有关选择是好是坏的反馈,并更新网络。例如,在一个错误的选择之后,我会降低指向所选节点的所有边的权重。
我学习了yesterday alias method 用于模拟滚动加权骰子,这与选择一个相同(每个节点是一个加权骰子,边对应于其他节点)。一卷是高效的,但更新权重不是;别名方法可能不合适,因为我将更新比我滚动的更多的骰子!
我应该使用哪种数据结构,允许频繁更新,以及哪种算法最适合做出选择?
一些想法/笔记:
- 我可以通过记录每次权重调整来减少更新,然后仅在必要时实际更新节点/模具(即直接在滚动之前)。但我仍然会为 每个 卷预先计算一次别名数据。
- 相反,我可以简单地按原样存储图形(这样更新成本很低)并放弃别名方法。我会在每次滚动之前即时计算相对权重(二进制搜索在这里有效)。
- 动态计算相对权重的另一个好处是我可以将每个节点的“全局权重”分解出来,以进一步减少更新。然后,一个错误的选择将导致只有 2 次更新:传入边权重和节点的全局权重。
- 添加:也许有一些介于两者之间的东西:一种在数据结构中保持局部相对权重的方法(例如树或别名方法),然后在每次滚动期间将它们与“全局权重”动态合并。
事实是,在实践中,我不需要经常做出选择(每分钟不超过一次),所以我不需要 最有效的解决方案。但这是一个有趣的项目,我有兴趣找到理论上的最佳解决方案。
【问题讨论】:
-
您对权重进行了哪些更新?您是否要重新计算所有权重、仅一个权重、一半权重等?
-
@templatetypedef "例如,在一个错误的选择之后,我减少了指向所选节点的所有边的权重。"此外,当使用别名方法(或使用预先计算的二分搜索概率)时,更改一个传出权重意味着重新计算所有别名信息(或概率)。
标签: c algorithm data-structures graph-theory