Python中的加权随机图遍历

Python中的加权随机图遍历,python,random,graph,traversal,weighted,Python,Random,Graph,Traversal,Weighted,基本上,我有一个300乘250的区域,我想随机移动。然而,在18750点和9300点有一些感兴趣的区域(你可以通过这样做算出x,y) y=0 而(num>x): num=num-x y+=1 你会得到坐标)。无论如何,如果起点是(0,0),我希望能够在这个区域内随机移动,但是在两个给定点的一般区域内移动。可能一个节点有更强的拉力,所以即使节点遍历导致较弱的一个节点,它也会在足够的时间内,以更强的拉力结束 到目前为止,我用这个来创建我的图,创建我的顶点和边。它给了我一个300x250的空间,每

基本上,我有一个300乘250的区域,我想随机移动。然而,在18750点和9300点有一些感兴趣的区域(你可以通过这样做算出x,y)

y=0
而(num>x):
num=num-x
y+=1
你会得到坐标)。无论如何,如果起点是(0,0),我希望能够在这个区域内随机移动,但是在两个给定点的一般区域内移动。可能一个节点有更强的拉力,所以即使节点遍历导致较弱的一个节点,它也会在足够的时间内,以更强的拉力结束

到目前为止,我用这个来创建我的图,创建我的顶点和边。它给了我一个300x250的空间,每个节点垂直和水平连接。 `

` 我该怎么办?我想让移动节点在每个静止节点上做出选择,但它在任何方向上移动的概率完全取决于重力点的权重。所以它可能有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坐标表示每个节点,包括Traveler节点。后继函数不需要依赖于图形,因为除了矩形的边缘外,通常有四个选项。因此,我们可以非常直接地对您的问题进行编码:

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
traveller_x,traveller_y=10,10#或任何你想要的
当不在重力点(移动器x、移动器y)时:
方向=[“左”、“右”、“上”、“下”]
如果traveller_x==0:
方向。删除(“左”)
如果旅客_x==x:
方向。删除(“右”)
如果旅行者_y==0:
方向。移除(“向下”)
如果旅行者_y==y:
方向。移除(“向上”)
到重力点
如果走行器_x<重力点_1_x:
至重力点1。附加(“右”)
elif traveller\u x>重力点\u 1\u x:
至重力点1。附加(“左”)
如果旅行者y<重力点y:
至重力点1.附加(“向上”)
elif traveller\u y>重力点\u 1\u y:
至重力点1。附加(“向下”)
# ... 对重力点2进行同样的构造
#然后使用这两个列表来构建权重方案
#然后使用random.random()从方向中选择一个方向
#根据这个权重。
如果方向==“左”:
旅行者_x-=1
elif方向==“右”:
旅行者_x+=1
elif方向==“向上”:
旅行者_y+=1
elif方向==“向下”:
旅行者_y-=1
这太简单了,我真的不认为这是你要问的。因此,您的问题可能是如何使用igraph的功能来实现这一点?在这种情况下,我的首选答案是“为什么?”

但是,为了努力,你可以这样做。首先,用权重扩充你的图。通过对所有顶点进行迭代,并将每个顶点的x和y与重力点的x和y进行比较来完成此操作。使用这些比较为其输出边构造权重,并使用igraph中的加权图功能存储它们

然后将Traveler节点定义为
igraph.Vertex

然后重复:

在该顶点上使用IGRAPHE SUCCURE函数查找可能的后续对象。使用igraph权重查找查找权重。使用
random.random()
根据权重在它们之间进行选择。将Traveler节点更改为所选的后续节点


在算法方面,这里唯一的区别是我们预先计算权重,而不是按需计算。

你说的“方向”是什么意思?你的意思是,好像这些点在平面上?所以每次你朝着正确的方向移动,你就减少了曼哈顿的距离?你是在问如何移动(即如何表示移动节点并更改其x和y)还是在问如何加权选择?当我说“方向”时,我的意思几乎是这样的。北西南东。想象一下,如你所说,它在一个平面上,每个正确的方向都会缩短距离。我所要求的是@strubbly如何权衡选择并根据我的图表做出决定,或者如果你有其他建议,我也很乐意接受!老实说,我真的不知道你在哪一部分遇到了麻烦。你有四个选择,你想根据加权概率来选择。如果您知道权重,那么可以在Python中使用random中的函数轻松完成此操作。设置权重应该很简单,尽管您尚未指定要使用的方案。通过比较移动节点和重力点的x和y坐标,可以知道应该加权的方向。还需要什么?我想我很难想出一个穿越它的方法。让移动节点在移动每个节点后做出“加权随机”决策@这绝对是我想要的。我肯定是在用这个和igraph做不必要的处理。我想,如果我想实现边缘权重什么的,可能会更好,但就目前而言,这绝对是我设想的方式。谢谢
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