Exemple #1
0
def initialize(dag: DirectGraph, s: Vertex, t: Vertex):
    """
    做搜索前 forward backward 的初始化
    :return:
    """
    Sf = {s}
    Sb = {t}
    Qf = set()
    Qb = set()
    df = {s: 0}
    db = {t: 0}
    paif = {s: None}
    paib = {t: None}
    for u in dag.vertexes:
        if u != s:
            Qf.add(u)
            w = dag.get_edge_weight(s, u)
            df[u] = w
            if w < sys.maxsize:
                paif[u] = s
            else:
                paif[u] = None
        if u != t:
            Qb.add(u)
            w = dag.get_edge_weight(u, t)
            db[u] = w
            if w < sys.maxsize:
                paib[u] = t
            else:
                paib[u] = None
    return Sf, Sb, Qf, Qb, df, db, paif, paib
Exemple #2
0
def initialize(dg: DirectGraph, s: Vertex):
    """
    对数据进行初始化,这里仅仅初始化 distance dict, pai 记录最路径中访问的上一个顶点
    :param dg:
    :return:
    """
    d = {s: 0}
    pai = {s: None}
    for v in dg.vertexes:
        pai[v] = None
        if v != s:
            d[v] = dg.get_edge_weight(s, v)
            # 使用 sys.maxsize 代表两者之间没有任何关联
            if d[v] < sys.maxsize:
                pai[v] = s
    return d, pai
Exemple #3
0
def initialize(dg: DirectGraph, s):
    """
    在进行 Dijkstra 算法前先进行初始化数据
    :param dg:
    :param s:
    :return:
    """
    # 所有已经找到了最短路径的顶点集和
    S = {s}
    # 所有还没有找到最短路径的顶点集和
    Q = set()
    d = {s: 0}
    pai = {s: None}
    # 将所有非 s 顶点加入到 Q 中
    for v in dg.vertexes:
        pai[v] = None
        if v != s:
            Q.add(v)
            d[v] = dg.get_edge_weight(s, v)
            if d[v] < sys.maxsize:
                pai[v] = s
    return S, Q, d, pai
Exemple #4
0
def initialize(dag: DirectGraph):
    """
    对进行 Floyd 算法求解之前先进行数据的初始化
    :return:
    """
    vexnum = dag.get_vertex_num()
    # Graph 中顶点以 set() 集和存储,这里我们需要将其转化为 list,方便使用下标 index 访问,list 中保存的只是引用,根本上还是 Graph 中 set 的顶点
    vexes = list(
        dag.vertexes)  # 由于是从 set 转化为 list,所以即使是相同的顶点,生成的 list 每次顶点顺序也可能不一样
    # 用于记录最短路径的关系的三维数组 p
    p = [[[False for _ in range(vexnum)] for j in range(vexnum)]
         for i in range(vexnum)]
    # 生成用于记录图中每两个顶点之间的最短路径的二维数组 d[i][j] 代表 vi-->vj 的距离
    d = [[
        dag.get_edge_weight(vexes[i], vexes[j]) if i != j else 0
        for j in range(vexnum)
    ] for i in range(vexnum)]
    for i in range(vexnum):
        for j in range(vexnum):
            if d[i][j] < sys.maxsize:
                p[i][j][i], p[i][j][j] = True, True
    return d, p, vexes, vexnum