我想生成一组相当大(~1,000-50,000)的完整图G=(V,E)
,其中加权边是尖锐三角形不等式 - 所以对于每个{{ 1}}:重量(vu)+ 重量(uw)> 重量(VW);权重是正整数。
修改 顶点是N-dim欧几里德空间中的点,并且边 uv 的每个权重必须大于或等于 u 和 v (所以如果距离是例如2.753那么最小允许重量是3,但它可能是4,5 ......)。
到目前为止,我想出了两种天真的方法。 这两种方法都是基于N维欧氏空间中的随机生成点。
一些符号:
v,u,w from V
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
,但在这种情况下,浮点精度可能会成为一个问题处理[因为我真的需要尖锐的三角不等式]
答案 0 :(得分:1)
我会提出另一种天真的方法,尽管是O(E)方法。选择范围R = [A, B)
,其中2A > B
。这意味着如果权重在R
,则三角不等式保证保持不变。
例如,B = 100
。因此A = B/2 = 50
。对于每个边缘,选择一个50到99之间的随机数。
您可以通过将随机数添加到欧几里德距离来满足您的欧几里德空间要求。