Python 中的加权随机图遍历
Weighted Random Graph Traversal in Python
基本上,我有一个 300 x 250 的区域,我想随机移动它。但是,在点 18750 和 9300 处有一些值得关注的区域(您可以通过执行以下操作计算出 x,y
y = 0
while(num > x):
num = num - x
y += 1
你会得到坐标)。无论如何,如果起点是 (0,0),我希望能够在该区域中随机移动,但在给定的两个点的一般区域中移动。也许一个人有更强的拉力,所以即使节点遍历导致更弱的节点,如果有足够的时间,它也会最终到达拉力更强的节点。
到目前为止,我已经有了这个来创建我的图形并创建我的顶点和边。它给了我一个 300x250 space,每个节点垂直和水平连接。
`
from igraph import *
g = Graph()
x = 300
y = 250
g.add_vertices(x*y)
li = []
for i in range(x-1):
for j in range(y):
li.append((i+j*x, i+1+j*x))
for i in range(x):
for j in range(y-1):
li.append((i+j*x, i+x+j*x))
g.add_edges(li)
gravity_points = [18750, 9300]
final_point = 24900
`
我该怎么做?我想让行进节点必须在每个静止节点上做出选择,但它在任何方向上行进的概率完全取决于重力点的权重。所以它可能有 10% 的机会向左走,有 10% 的机会向右走,有 50% 的机会向下走,有 30% 的机会向上走。像那样的东西。概率不必随着接近度而改变,而是随着重力点所在的方向而改变。
欢迎任何帮助!!提前谢谢你。
不确定,但也许您的问题不是找到算法,而是如何在这种情况下使用 igraph
。这很棘手,因为它似乎没有为此要求添加任何内容。我将从描述算法开始:希望这能帮助您解决问题,直到我们得到答案。
随机遍历看起来像这样,在伪代码中:
traveller_node = start_node # Chosen somehow
while not stopping_condition(traveller_node):
possible_successors = traveller_node.successors()
traveller_node = random_choice_from(possible_successors)
在这种情况下,最简单的方法是通过其 x,y 坐标来表示每个节点,包括旅行者节点。后继函数不需要依赖于图形,因为通常有四个选项,矩形的边缘除外。那么我们就可以直接编写您的问题:
traveller_x,traveller_y = 10,10 # Or whatever you want
while not at_gravity_points(traveller_x,traveller_y):
directions = ["left","right","up","down"]
if traveller_x == 0:
directions.remove("left")
if traveller_x == x:
directions.remove("right")
if traveller_y == 0:
directions.remove("down")
if traveller_y == y:
directions.remove("up")
to_gravity_point_1 = []
if traveller_x < gravity_point_1_x:
to_gravity_point_1.append("right")
elif traveller_x > gravity_point_1_x:
to_gravity_point_1.append("left")
if traveller_y < gravity_point_1_y:
to_gravity_point_1.append("up")
elif traveller_y > gravity_point_1_y:
to_gravity_point_1.append("down")
# ... do the same to construct to_gravity_point_2
# then use these two lists to construct your weighting scheme
# then use random.random() to choose a direction from directions
# according to that weighting.
if direction == "left":
traveller_x -= 1
elif direction == "right":
traveller_x += 1
elif direction == "up":
traveller_y += 1
elif direction == "down":
traveller_y -= 1
这一切都非常简单,我真的认为这不是您要问的。那么,也许您的问题是如何使用 igraph
的功能来做到这一点?在这种情况下,我的首选答案是 "why?"
但是,为了努力,你可以做这样的事情。首先用权重增加你的图表。通过迭代所有顶点来完成此操作,并且对于每个顶点,将它们的 x 和 y 与重力点的 x 和 y 进行比较。使用这些比较为它们的出边构建权重,并使用 igraph 中的加权图功能存储它们。
然后定义旅行者节点为igraph.Vertex
。
然后重复:
对该顶点使用 igraph 后继函数来查找可能的后继。使用 igraph 权重查找来查找权重。使用 random.random()
根据权重在它们之间进行选择。将旅行者节点更改为选定的后继者。
在算法方面,这里唯一的区别是我们预先计算权重而不是按需计算。
基本上,我有一个 300 x 250 的区域,我想随机移动它。但是,在点 18750 和 9300 处有一些值得关注的区域(您可以通过执行以下操作计算出 x,y
y = 0
while(num > x):
num = num - x
y += 1
你会得到坐标)。无论如何,如果起点是 (0,0),我希望能够在该区域中随机移动,但在给定的两个点的一般区域中移动。也许一个人有更强的拉力,所以即使节点遍历导致更弱的节点,如果有足够的时间,它也会最终到达拉力更强的节点。
到目前为止,我已经有了这个来创建我的图形并创建我的顶点和边。它给了我一个 300x250 space,每个节点垂直和水平连接。 `
from igraph import *
g = Graph()
x = 300
y = 250
g.add_vertices(x*y)
li = []
for i in range(x-1):
for j in range(y):
li.append((i+j*x, i+1+j*x))
for i in range(x):
for j in range(y-1):
li.append((i+j*x, i+x+j*x))
g.add_edges(li)
gravity_points = [18750, 9300]
final_point = 24900
` 我该怎么做?我想让行进节点必须在每个静止节点上做出选择,但它在任何方向上行进的概率完全取决于重力点的权重。所以它可能有 10% 的机会向左走,有 10% 的机会向右走,有 50% 的机会向下走,有 30% 的机会向上走。像那样的东西。概率不必随着接近度而改变,而是随着重力点所在的方向而改变。
欢迎任何帮助!!提前谢谢你。
不确定,但也许您的问题不是找到算法,而是如何在这种情况下使用 igraph
。这很棘手,因为它似乎没有为此要求添加任何内容。我将从描述算法开始:希望这能帮助您解决问题,直到我们得到答案。
随机遍历看起来像这样,在伪代码中:
traveller_node = start_node # Chosen somehow
while not stopping_condition(traveller_node):
possible_successors = traveller_node.successors()
traveller_node = random_choice_from(possible_successors)
在这种情况下,最简单的方法是通过其 x,y 坐标来表示每个节点,包括旅行者节点。后继函数不需要依赖于图形,因为通常有四个选项,矩形的边缘除外。那么我们就可以直接编写您的问题:
traveller_x,traveller_y = 10,10 # Or whatever you want
while not at_gravity_points(traveller_x,traveller_y):
directions = ["left","right","up","down"]
if traveller_x == 0:
directions.remove("left")
if traveller_x == x:
directions.remove("right")
if traveller_y == 0:
directions.remove("down")
if traveller_y == y:
directions.remove("up")
to_gravity_point_1 = []
if traveller_x < gravity_point_1_x:
to_gravity_point_1.append("right")
elif traveller_x > gravity_point_1_x:
to_gravity_point_1.append("left")
if traveller_y < gravity_point_1_y:
to_gravity_point_1.append("up")
elif traveller_y > gravity_point_1_y:
to_gravity_point_1.append("down")
# ... do the same to construct to_gravity_point_2
# then use these two lists to construct your weighting scheme
# then use random.random() to choose a direction from directions
# according to that weighting.
if direction == "left":
traveller_x -= 1
elif direction == "right":
traveller_x += 1
elif direction == "up":
traveller_y += 1
elif direction == "down":
traveller_y -= 1
这一切都非常简单,我真的认为这不是您要问的。那么,也许您的问题是如何使用 igraph
的功能来做到这一点?在这种情况下,我的首选答案是 "why?"
但是,为了努力,你可以做这样的事情。首先用权重增加你的图表。通过迭代所有顶点来完成此操作,并且对于每个顶点,将它们的 x 和 y 与重力点的 x 和 y 进行比较。使用这些比较为它们的出边构建权重,并使用 igraph 中的加权图功能存储它们。
然后定义旅行者节点为igraph.Vertex
。
然后重复:
对该顶点使用 igraph 后继函数来查找可能的后继。使用 igraph 权重查找来查找权重。使用 random.random()
根据权重在它们之间进行选择。将旅行者节点更改为选定的后继者。
在算法方面,这里唯一的区别是我们预先计算权重而不是按需计算。