生成三角不等式所在的图

时间:2013-11-15 18:52:51

标签: algorithm graph

我想生成一组相当大(~1,000-50,000)的完整图G=(V,E),其中加权边是尖锐三角形不等式 - 所以对于每个{{ 1}}:重量(vu)+ 重量(uw)> 重量(VW);权重是正整数。

修改 顶点是N-dim欧几里德空间中的点,并且边 uv 的每个权重必须大于或等于 u v (所以如果距离是例如2.753那么最小允许重量是3,但它可能是4,5 ......)。


到目前为止,我想出了两种天真的方法。 这两种方法都是基于N维欧氏空间中的随机生成点。

一些符号:

  • vu或vertex1-vertex2表示边
  • E(v,u) - v与u之间的欧几里德距离
  • 对于双/实数 r ceil(r)是整数n,使得n - 1 <1。 r&lt; = n(例如 ceil(10.5)= 11,ceil(0.000000000001)= 1,ceil(172)= 172。
  • (vu,c) - edge vu具有权重c

方法1 - 本地

v,u,w from V

方法2 - 全球

vertices = {v,u} -- v, u generated randomly
edges = {vu} 
weights = {(vu,ceil(E(v,u))} 
i = 0
while(i < total_number_of_vertices)
    candidate = generate_new_point()
    ok = true
    foreach (vertex in vertices):
        integer_distance = ceil(E(candidate,vertex))
        if adding (candidate-vertex, integer_distance) to weights
           violates the triangle inequality:
               ok = false \\ this candidate is wrong
               break \\ breaking for-each; start with new candidate
        end_if
    end_for_each
    if(ok)
         i++
         add candidate to vertices, 
         for_each vertex in vertices:
             add vertex-candidate to  edges
             add (vertex-candidate, ceil(E(candidate,vertex))) to weights
         end_for_each          
     end_if
end_while            

我非常怀疑,如果这些方法足够有效,那么任何帮助 - 改进它们或提出完全不同的方法 - 都会受到赞赏。

如果上述任何内容不够清楚,我会提供更多信息。


如果结果是,将权重保持为正vertices = generate_points(total_number_of_vertices) edges = complete Graph induced by vertices weights = {} for_each edge uv: add (uv, ceil(E(u,v))) to weights end_for_each all_good = false while (!all_good): all_good = true for_each edge in edges: \\ this one has to be check in all triangles that edge belongs to if edge violates triangle inequality: \\ by appropriate I mean directly involved update appropriate weights to satisfy triangle inequality all_good = false \\ 'updating one edge may disturb other' end_if end_for_each end_while 太难了我可以考虑将它们设为正integers,但在这种情况下,浮点精度可能会成为一个问题处理[因为我真的需要尖锐的三角不等式]

1 个答案:

答案 0 :(得分:1)

我会提出另一种天真的方法,尽管是O(E)方法。选择范围R = [A, B),其中2A > B。这意味着如果权重在R,则三角不等式保证保持不变。

例如,B = 100。因此A = B/2 = 50。对于每个边缘,选择一个50到99之间的随机数。

您可以通过将随机数添加到欧几里德距离来满足您的欧几里德空间要求。