【问题标题】:Storing a graph in a queue with minimum distance between adjacent edges将图形存储在相邻边之间距离最小的队列中
【发布时间】:2018-04-20 08:47:43
【问题描述】:

我需要将图形的边存储在一个队列中,以使入射边索引之间的距离尽可能小。

有什么算法可以达到这个目的吗?

【问题讨论】:

  • “入射边索引之间的距离”是什么意思?能给我举个例子吗?索引是一个整数,不清楚两个整数之间的“距离”是什么意思。边缘的“索引”是什么?
  • @pkpnd,例如,图中的边ab存储在我们队列的索引5中,边ac存储在索引8中。它们之间的距离是3。目的是将边缘存储在一个序列中,以最小化所有事件边缘的这个数量。 :)
  • 所以你真的不需要一个“队列”,你只需要一个边缘的排序,对吧?
  • @pkpnd 是的,没错!
  • 您需要绝对最佳(最小)的解决方案,还是一个近似值可以?

标签: algorithm graph queue


【解决方案1】:

这是一个可以找到局部最小值的合理算法。基本上,您从一些任意排序开始,然后在每一步都贪婪地进行局部改进,直到无法再进行改进为止。

  1. 从边缘的任意顺序Q 开始。 (也许一些启发式方法会有所帮助,但我认为这不会太重要。)
  2. 计算Q 的当前成本C,它是入射边索引的绝对差之和。
  3. 重复以下操作:
    1. 对于每对(无序的)边(edge i, edge j)
      • 计算“新成本”Cij,即当前订购的成本 Q,除了边 ij 已切换
    2. C* 为上面计算的最小值Cij,并设i*j* 为已切换的对应边
    3. 如果C* < C
      • Q 中交换边缘i*j*
      • 更新C := C*
    4. 否则 (C* >= C),没有更多的本地交换有帮助,我们处于本地最低限度。
      • 返回当前订单Q,费用为C

如果您有额外的计算时间,您可以使用不同的初始顺序运行上述程序。这可能会导致不同的局部最优,您可以在所有运行中选择最好的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 2021-11-03
    • 1970-01-01
    • 2016-10-31
    • 2021-03-03
    相关资源
    最近更新 更多