Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 拓扑排序_Algorithm_Sorting_Graph Algorithm - Fatal编程技术网

Algorithm 拓扑排序

Algorithm 拓扑排序,algorithm,sorting,graph-algorithm,Algorithm,Sorting,Graph Algorithm,给定具有N个节点的DAG,每个节点都有一个值(例如,0.2、0.5、1.3、0.1…)。我想将顶点排序为一个链。难点在于在对节点进行排序时存在一个目标函数 例如,链是x-->y-->z-->w。每个链接都有一个权重,例如(x,y)权重=x,链接(y,z)权重=xy,链接(z,w)权重=xyz等等 目标函数是最小化所有链接重量的总和(此处为链:x+xy+xyz) 我一直在想这件事。但我现在不知道。是否有人能给出一些关于算法设计或问题复杂性证明的想法?谢谢。这是kevmo314提到的算法,用Pyth

给定具有N个节点的DAG,每个节点都有一个值(例如,0.2、0.5、1.3、0.1…)。我想将顶点排序为一个链。难点在于在对节点进行排序时存在一个目标函数

例如,链是x-->y-->z-->w。每个链接都有一个权重,例如(x,y)权重=x,链接(y,z)权重=xy,链接(z,w)权重=xyz等等

目标函数是最小化所有链接重量的总和(此处为链:x+xy+xyz)


我一直在想这件事。但我现在不知道。是否有人能给出一些关于算法设计或问题复杂性证明的想法?谢谢。

这是kevmo314提到的算法,用Python实现。也许它应该在C中重新实现,用位操作替换集合操作

我们可以重写目标

x + x*y + x*y*z = x*(1 + y*(1 + z)),
所以假设所有的权重都是正的,总体目标在子问题目标中是单调的,这允许动态规划

def optimal_order(predecessors_map, weight_map):
    vertices = frozenset(predecessors_map.keys())
    memo_map = {frozenset(): (0, [])}
    return optimal_order_helper(predecessors_map, weight_map, vertices, memo_map)


def optimal_order_helper(predecessors_map, weight_map, vertices, memo_map):
    if vertices in memo_map:
        return memo_map[vertices]
    possibilities = []
    for v in vertices:
        if any(u in vertices for u in predecessors_map[v]):
            continue
        sub_obj, sub_order = optimal_order_helper(predecessors_map, weight_map, vertices - frozenset({v}), memo_map)
        possibilities.append((weight_map[v] * (1.0 + sub_obj), [v] + sub_order))
    best = min(possibilities)
    memo_map[vertices] = best
    return best


print(optimal_order({'u': [], 'v': ['u'], 'w': [], 'x': ['w']}, {'u': 1.2, 'v': 0.5, 'w': 1.1, 'x': 1.001}))

贪婪不就是为了这个吗?由于是拓扑排序,每个子问题都独立于父问题。否。我不这么认为。这里是一个反例:DAG由两个独立的链组成:1.2-->0.5和1.1-->1.001。优化的排序链应为1.2-->0.5-->1.1-->1.001。也许对于一个贪婪算法,链应该是:1.1-->1.001-->1.2-->0.5(最小顶点优先)。你能给出更多关于贪婪算法的想法吗?节点值是否重要,或者仅仅是链接权重?@user2585677你贪婪地选择下一个状态,而不是下一个节点。实际上,这只是状态空间上的Dijkstra,其中距离是下一个节点的边际成本。这应该在O(n log n)中运行,其中n是状态数,所以O(v*2^v),这对于几十个节点来说是好的,但对于一般的n不起作用。此外,您的反例与您的问题陈述相矛盾,因为您将链接(z,w)的权重定义为xyz,所以输出只是总和,但我知道你的意思可能是重量是z,选择链接的成本是之前重量的乘积。聪明,优秀!!你帮我了解问题的性质和背景。