所以今晚我正在考虑一个图形距离算法,并在我开车时想到了这个:
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)
但现在我觉得我已经考虑过了.
在处理我可以阅读的核心数据时是否有常见错误和反模式的列表,所以我可以训练我的大脑进行核心思考?经验训练我很好地思考非核心数据,但如果可以的话,我想从别人的错误中吸取教训.
在Wiki页面说
通过选择其顶点的总顺序并将每个边缘从顺序中的较早端点定向到后一个端点,可以将任何无向图形制成DAG.
但我不知道如何获得无向图的总顺序.我应该使用DFS吗?如果是这样,我将如何进行?
更多信息:我正在研究一个有一个源和一个接收器的无向图.我试图引导这些边缘,以便沿着边缘方向我可以从源头到达接收器.
假设我们有一个DIRECTED,WEIGHTED和CYCLIC图表.
假设我们只对总重量小于MAX_WEIGHT的路径感兴趣
找到总重量小于MAX_WEIGHT的两个节点A和B之间的不同路径数量的最合适(或任何)算法是什么?
PS:这不是我的功课.只是个人的非商业项目.
注意:由于旅行不是在它开始的同一个地方结束的事实,而且只要我仍然访问所有这些点,每个点都可以被访问多次这一事实,这不是真正的TSP变体,而是我之所以说是因为缺乏对问题的更好定义.
所以..
假设我正在徒步旅行,有n个兴趣点.这些景点都通过远足径相连.我有一张地图显示了所有距离的路径,给我一个有向图.
我的问题是如何近似一个从A点开始并且访问所有n个兴趣点的旅游,同时结束旅行的任何地方,但我开始的点,我希望旅游尽可能短.
由于远足的性质,我认为这可能不是一个对称问题(或者我可以将我的不对称图转换为对称图?),因为从高海拔到低海拔显然比其他方式更容易.
另外我认为它必须是一种适用于非度量图的算法,其中不满足三角不等式,因为从a到b到c可能比从a到c的真正漫长而奇怪的道路更快直.我确实考虑过三角不等式是否仍然存在,因为对于我访问每个点的次数没有限制,只要我访问所有这些,这意味着我总是选择从a到c的两条不同路径中最短的路径,从而永远不会抓住漫长而奇怪的道路.
我相信我的问题比TSP更容易,因此这些算法不适合这个问题.我考虑过使用最小生成树,但我很难说服自己可以将它们应用于非度量非对称有向图.
我真正想要的是关于如何能够提出近似算法的一些指示,该算法将通过所有n个点找到近乎最佳的旅行
algorithm graph-theory traveling-salesman approximation graph-algorithm
我正在接受一家高频交易公司的采访.他们问我一个算法O(n):
n空间点O(1),3.我用Google搜索并做了一些研究.有一个O(n)算法(来自普林斯顿大学的Chazelle的最佳圆圈放置),但它有点超出我的水平,理解并将其组合起来在10分钟内解释它.我已经知道O(n^2)和O(n^3)算法.
请帮我找一个O(n)算法.
我正在帮助一个与工作相关的项目的朋友,他需要计算从节点a到节点b的最大容量,其中边缘具有容量.然而,从a到b的路径中的最大容量受到具有最低容量的边缘的限制.
让我试着用一个简单的样本来解释

因此,图是带有加权边的有向图,它可以是循环的.容量最大的路径为s-> b-> t,容量为250,因为该边缘设置了限制.
我做了一些阅读,发现这类问题是"最广泛的路径问题",或者我称之为最小容量最大的路径,但我没有找到任何示例或任何伪代码解释如何解决这个问题.
我正在考虑使用BFS找到从s到t的所有路径,并且某种方式只允许在路径中访问一个节点,然后在路径中找到最小值,这是否有效?
我正在使用Python的瑞士锦标赛系统,我正试图找出一个最佳的配对算法.
我最大的问题是我所带来的每个算法都会在几个序列中产生错误,其中最后一对被拾取的对象已经相互发挥作用,判断配对无效.
我正在研究的瑞士系统很简单:即使是玩家,每个人都会在每一轮比赛中进行比赛,并且基于胜利的接近度来完成配对(因此强大的球员与强大的球员对抗,弱对弱者).
没有再见,只有输赢(没有平局),对手不能互相打两次.
我目前的算法如下工作:
例如:
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) 在递归DFS,我们可以通过着色节点的检测周期WHITE,GRAY并BLACK为解释在这里。
如果GRAY在 DFS 搜索期间遇到节点,则存在循环。
我的问题是:当我标记节点作为GRAY和BLACK在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) 我可以使用 DFS 算法确定有向图的拓扑排序。如果没有循环,我认为我发现的拓扑顺序是有效的。如果存在循环,我认为拓扑顺序是无用的。到目前为止我是否正确?
无向图呢?“拓扑类型的无向图”是一个有效的陈述吗?对于拓扑排序,图是否必须是有向无环图?
graph directed-acyclic-graphs graph-algorithm undirected-graph
graph-algorithm ×10
algorithm ×8
graph ×4
graph-theory ×3
haskell ×1
path-finding ×1
pseudocode ×1
python ×1
python-2.7 ×1