什么是一个很好的加权功能?

时间:2009-01-26 16:20:13

标签: algorithm function graph-theory

我正在尝试对非定向的循环加权图执行一些计算,我正在寻找一个很好的函数来计算总重量。

每条边的距离值在[1,∞)范围内。该算法应该更加重视较低的距离(它应该单调递减),它应该为距离∞赋值0.

我的第一直觉只是1 / d,满足了这两个要求。 (好吧,技术上1 /∞是未定义的,但是程序员倾向于让这一个比数学家更容易滑动。)1 / d的问题是该函数更关心1/1和1/2之间的差异而不是1/34和1/35之间的差异。我想要更多一点。我可以使用√(1 / d)或∛(1 / d)甚至∜(1 / d),但我觉得我错过了一整套可能性。有什么建议吗?

(我想到了ln(1 / d),但是当d进入∞时,它会变为-∞,而我想不出将它推到0的好方法。)

后来

我忘记了一个要求:w(1)必须是1.(这不会使现有答案无效;乘法常数很好。)

5 个答案:

答案 0 :(得分:2)

也许:

exp(-d)

编辑:

的内容
exp(k(1-d)), k real

符合你的额外要求(我相信你知道但是嘿嘿)。

答案 1 :(得分:1)

1 / ln(d + k)怎么样?

答案 2 :(得分:1)

上面的一些答案是高斯分布的版本,我同意这是一个不错的选择。高斯或正态分布通常可以在自然界中找到。它是有序无穷大的B样条基函数。

将其用作混合函数的一个缺点是其无限支持需要比有限混合函数更多的计算。发现混合物是产品系列的总和。在实践中,当下一个术语小于公差时,总和可以停止。

如果可能,形成静态表以保持离散高斯函数值,因为计算值在计算上是昂贵的。如果需要,可以插值表值。

答案 3 :(得分:0)

这个怎么样?

  

w d )=(1 + k )/( d + k )对于某些大型 k

d = 2 + k 将是 w 的地方( d )= 1/2

答案 4 :(得分:0)

看起来你实际上正在寻找线性减少,这是无限的线 - d。显然这个解决方案是垃圾,但由于你可能没有使用任意精度数据类型的距离,你可以使用yourDatatype.MaxValue - d来获得线性递减函数。

事实上你可能会考虑使用(yourDatatype.MaxValue - d)+ 1你正在使用双打,因为如果你的距离是“无穷大”,你可以将权重指定为0(因为双倍实际上有一个值。)

当然你仍然需要考虑实现细节,比如w(d)= double.infinity或w(d)= integer.MaxValue,但是如果你知道你正在使用的实际数据类型,这些应该很容易找到;)