标签: graph-algorithm

Haskell:常见的Corecursive谬误

所以今晚我正在考虑一个图形距离算法,并在我开车时想到了这个:

module GraphDistance where
import Data.Map

distance :: (Ord a) => a -> Map a [a] -> Map a Int
distance a m = m' 
  where m' = mapWithKey d m
        d a' as = if a == a' then 0 else 1 + minimum (Prelude.map (m'!) as)
Run Code Online (Sandbox Code Playgroud)

起初,我为自己感到骄傲,因为它看起来很优雅.但后来我意识到它不起作用 - 核心运行可能会陷入循环中.

我不得不编码来说服自己:

ghci> distance 1 $ fromList [(0,[1]),(1,[0,2]),(2,[1,3]),(3,[2])]
fromList [(0,1),(1,0),(2,^CInterrupted.
Run Code Online (Sandbox Code Playgroud)

但现在我觉得我已经考虑过了.

在处理我可以阅读的核心数据时是否有常见错误和反模式的列表,所以我可以训练我的大脑进行核心思考?经验训练我很好地思考非核心数据,但如果可以的话,我想从别人的错误中吸取教训.

haskell graph graph-algorithm

9
推荐指数
1
解决办法
470
查看次数

如何将无向图转换为DAG?

Wiki页面

通过选择其顶点的总顺序并将每个边缘从顺序中的较早端点定向到后一个端点,可以将任何无向图形制成DAG.

但我不知道如何获得无向图的总顺序.我应该使用DFS吗?如果是这样,我将如何进行?

更多信息:我正在研究一个有一个源和一个接收器的无向图.我试图引导这些边缘,以便沿着边缘方向我可以从源头到达接收器.

algorithm graph-theory graph-algorithm

9
推荐指数
1
解决办法
7416
查看次数

在加权定向循环图中寻找从A到B的不同路径的算法

假设我们有一个DIRECTED,WEIGHTEDCYCLIC图表.

假设我们只对总重量小于MAX_WEIGHT的路径感兴趣

找到总重量小于MAX_WEIGHT的两个节点A和B之间的不同路径数量的最合适(或任何)算法是什么?

PS:这不是我的功课.只是个人的非商业项目.

algorithm graph path-finding graph-algorithm

9
推荐指数
1
解决办法
2069
查看次数

TSP变量的近似算法,固定开始和结束任何地方但起点+允许每个顶点多次访问

注意:由于旅行不是在它开始的同一个地方结束的事实,而且只要我仍然访问所有这些点,每个点都可以被访问多次这一事实,这不是真正的TSP变体,而是我之所以说是因为缺乏对问题的更好定义.

所以..

假设我正在徒步旅行,有n个兴趣点.这些景点都通过远足径相连.我有一张地图显示了所有距离的路径,给我一个有向图.

我的问题是如何近似一个从A点开始并且访问所有n个兴趣点的旅游,同时结束旅行的任何地方,但我开始的点,我希望旅游尽可能短.

由于远足的性质,我认为这可能不是一个对称问题(或者我可以将我的不对称图转换为对称图?),因为从高海拔到低海拔显然比其他方式更容易.

另外我认为它必须是一种适用于非度量图的算法,其中不满足三角不等式,因为从a到b到c可能比从a到c的真正漫长而奇怪的道路更快直.我确实考虑过三角不等式是否仍然存在,因为对于我访问每个点的次数没有限制,只要我访问所有这些,这意味着我总是选择从a到c的两条不同路径中最短的路径,从而永远不会抓住漫长而奇怪的道路.

我相信我的问题比TSP更容易,因此这些算法不适合这个问题.我考虑过使用最小生成树,但我很难说服自己可以将它们应用于非度量非对称有向图.

我真正想要的是关于如何能够提出近似算法的一些指示,该算法将通过所有n个点找到近乎最佳的旅行

algorithm graph-theory traveling-salesman approximation graph-algorithm

9
推荐指数
2
解决办法
1588
查看次数

特定类型图表中的最长路径

我知道最长的路径问题对于一般图表来说是NP难的.但是,我正在考虑一种特殊的图形,包括一个周期,加上周期的每个顶点上的一个附加边缘事件.例如,对于长度为7的循环,我们有图表:

图形

所有边都是加权的(权重是实数,可以是正数或负数).我想在此图上找到最大的简单路径,其中路径的大小是路径上边缘权重的总和.

该算法应该是循环大小的线性.但任何想法都值得赞赏.

algorithm graph-theory pseudocode graph-algorithm

9
推荐指数
2
解决办法
1279
查看次数

找到覆盖太空中大多数点的圆

我正在接受一家高频交易公司的采访.他们问我一个算法O(n):

  • 给出n空间点
  • 给定一个返回平面点的哈希函数O(1),
  • 找到覆盖空间中最多点的最佳匹配圆.

要求:

  • 圆心必须有整数坐标,它的半径是3.
  • 圆内的点不一定具有整数坐标

我用Google搜索并做了一些研究.有一个O(n)算法(来自普林斯顿大学的Chazelle的最佳圆圈放置),但它有点超出我的水平,理解并将其组合起来在10分钟内解释它.我已经知道O(n^2)O(n^3)算法.

请帮我找一个O(n)算法.

algorithm computational-geometry graph-algorithm

9
推荐指数
1
解决办法
2248
查看次数

在图中查找具有最大最小容量的路径

我正在帮助一个与工作相关的项目的朋友,他需要计算从节点a到节点b的最大容量,其中边缘具有容量.然而,从a到b的路径中的最大容量受到具有最低容量的边缘的限制.

让我试着用一个简单的样本来解释 简单的示例图

因此,图是带有加权边的有向图,它可以是循环的.容量最大的路径为s-> b-> t,容量为250,因为该边缘设置了限制.

我做了一些阅读,发现这类问题是"最广泛的路径问题",或者我称之为最小容量最大的路径,但我没有找到任何示例或任何伪代码解释如何解决这个问题.

我正在考虑使用BFS找到从s到t的所有路径,并且某种方式只允许在路径中访问一个节点,然后在路径中找到最小值,这是否有效?

algorithm graph graph-algorithm

9
推荐指数
2
解决办法
2万
查看次数

瑞士锦标赛 - 配对算法

我正在使用Python的瑞士锦标赛系统,我正试图找出一个最佳的配对算法.
我最大的问题是我所带来的每个算法都会在几个序列中产生错误,其中最后一对被拾取的对象已经相互发挥作用,判断配对无效.

我正在研究的瑞士系统很简单:即使是玩家,每个人都会在每一轮比赛中进行比赛,并且基于胜利的接近度来完成配对(因此强大的球员与强大的球员对抗,弱对弱者).
没有再见,只有输赢(没有平局),对手不能互相打两次.

我目前的算法如下工作:

  1. 按排名顺序制作球员名单(大多数胜利至最少胜利)
  2. 选择球员,从拥有最多胜利的球员开始
  3. 将他与排名最靠近的球员相匹配.如果他们已经玩过,请将他与下一个匹配,直到找到匹配为止
  4. 将该对弹出列表并返回1

例如:
2轮后的排名:

1. P1: [P2 win, P3 win] 2 wins
2. P5: [P6 win, P2 win] 2 wins
3. P3: [P4 win, P1 lost] 1 win, 1 loss
4. P4: [P6 win, P3 lost] 1 win, 1 loss
5. P2: [P1 lost, P5 lost] 2 losses
6. P6: [P5 lost, P4 lost] 2 losses
Run Code Online (Sandbox Code Playgroud)

第一个选择是P1,第一个匹配是P5.将(P1,P5)从列表中取出.

1. P3: [P4 win, P1 lost] 1 win, 1 loss
2. P4: [P6 win, P3 lost] …
Run Code Online (Sandbox Code Playgroud)

python algorithm graph-algorithm python-2.7

9
推荐指数
2
解决办法
5594
查看次数

如何使用迭代版本的 DFS 检测有向图中的循环?

在递归DFS,我们可以通过着色节点的检测周期WHITEGRAYBLACK为解释在这里

如果GRAY在 DFS 搜索期间遇到节点,则存在循环。

我的问题是:当我标记节点作为GRAYBLACK在DFS的这个版本的迭代?(来自维基百科)

    1  procedure DFS-iterative(G,v):
    2      let S be a stack
    3      S.push(v)
    4      while S is not empty
    5          v = S.pop()
    6          if v is not labeled as discovered:
    7              label v as discovered
    8              for all edges from v to w in G.adjacentEdges(v) do 
    9                  S.push(w)
Run Code Online (Sandbox Code Playgroud)

algorithm depth-first-search graph-algorithm

9
推荐指数
2
解决办法
4708
查看次数

使用 DFS 算法对有向图和无向图进行拓扑排序

我可以使用 DFS 算法确定有向图的拓扑排序。如果没有循环,我认为我发现的拓扑顺序是有效的。如果存在循环,我认为拓扑顺序是无用的。到目前为止我是否正确?

无向图呢?“拓扑类型的无向图”是一个有效的陈述吗?对于拓扑排序,图是否必须是有向无环图?

graph directed-acyclic-graphs graph-algorithm undirected-graph

9
推荐指数
1
解决办法
5062
查看次数