- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试编写 Bron-Kerbosch algorithm 的 C# 实现在图论中,用于查找图中最大大小的团。
理想情况下,该算法会生成一个图列表,其中每个图都代表初始输入图中的最大团。我的代码没有产生预期的结果,我希望得到一些指导以编写更好的代码来实现此实现。
此实例中使用的图类是基于图的邻接表表示的自定义类。
public class BronKerbosch
{
public List<Graph<Person>> Run(Graph<Person> R, Graph<Person> P, Graph<Person> X, List<Graph<Person>> maximalCliques)
{
// if P and X are both empty, and the size of R is greater than 1 (implies clique):
if (!P.Nodes.Any() && !X.Nodes.Any() && R.Nodes.Count() > 1)
// report R as a maximal clique
maximalCliques.Add(R);
else
{
// Copy P's nodes for traversal
List<GraphNode<Person>> nodesCopy = P.Nodes.ToList();
// For each node v in P:
foreach (GraphNode<Person> v in nodesCopy)
{
// Make graph with just v
Graph<Person> vGraph = new Graph<Person>(new NodeList<Person>());
vGraph.AddNode(v);
// Make graph with just v's neighbors
Graph<Person> neighborGraph = new Graph<Person>(v.Neighbors);
// Move v to X
P.Remove(v.Value);
// BronKerbosch(R U {v}, P INTERSECT N(v), X INTERSECT N(v)))
maximalCliques = Run(R.Union(vGraph), P.Intersect(neighborGraph), X.Intersect(neighborGraph), maximalCliques);
X = X.Union(vGraph);
}
}
return maximalCliques;
}
}
如能提供任何帮助,我们将不胜感激 - 如果我可以提供任何其他信息,请告诉我。
--
更新 1 输入和输出的一个上下文是三个人的图表 - 人 A、人 B 和人 C。下面提供了代码以提供更准确的细节:
graphR = new Graph<Person>(new NodeList<Person>());
graphP = new Graph<Person>(new NodeList<Person>());
graphX = new Graph<Person>(new NodeList<Person>());
Person personA = new Person() {FirstName = "Person A"};
Person personB = new Person() {FirstName = "Person B"};
Person personC = new Person() {FirstName = "Person C"};
Anode = new GraphNode<Person>(personA);
Bnode = new GraphNode<Person>(personB);
Cnode = new GraphNode<Person>(personC);
graphP.AddNode(Anode);
graphP.AddNode(Bnode);
graphP.AddNode(Cnode);
graphP.AddUndirectedEdge(Anode, Bnode);
graphP.AddUndirectedEdge(Cnode, Anode);
expectedClique1 = new Graph<Person>(new NodeList<Person>());
expectedClique1.AddNode(Anode);
expectedClique1.AddNode(Bnode);
expectedClique1.AddUndirectedEdge(Anode, Bnode);
expectedClique2 = new Graph<Person>(new NodeList<Person>());
expectedClique2.AddNode(Cnode);
expectedClique2.AddNode(Anode);
expectedClique2.AddUndirectedEdge(Cnode, Anode);
maximalCliques = new List<Graph<Person>>();
bronKerbosch = new BronKerbosch();
bronKerbosch.Run(graphR, graphP, graphX, maximalCliques);
在这种情况下,我希望输出是两个图 expectedClique1 和 expectedClique2 - 然而,实际输出是四个图,只有 personA。希望这对您有所帮助!
--
UPDATE 2 看来我已经找到了问题的解决方案,但在我进行更多测试以确认我的解决方案正确之前,我犹豫要不要关闭案例。当我能够确认我的解决方案足够时将更新。
最佳答案
为了扩展 ananthonline 的评论,包含良好的数据结构,例如这些是单元测试的完美候选者。启动您最喜欢的测试框架并设置您的预期输出,包括所有边界条件。
从简单开始,将其变为绿色,然后扩展。形式化您的期望将帮助您思考算法并可能为您打开灯泡。
关于Bron-Kerbosch算法的C#实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11508237/
Bron–Kerbosch algorithm是一种列出图的所有最大派系的方法。我最近成功地实现了这个算法只是为了好玩。缺点是该算法是递归的,因此只能在小图上运行,直到堆栈溢出。 应该可以使算法完全迭
我正在尝试理解 Bron-Kerbosch 的算法(带旋转)以在无向图。我有一些问题: 选择枢轴顶点有什么标准吗?我已经看到一些实现选择具有最多邻居的顶点进行优化,而其他实现则简单地选择预期顶点中的第
我在实现 Bron-Kerbosch 算法的 C 版本时遇到了一些问题: 1- 我完全不了解该算法的工作原理。我试图在 Internet 上找到引用资料,但所有这些引用资料都很糟糕,算法示例实现糟糕透
任何人都可以告诉我,我可以在网络上的哪个位置找到有关 Bron-Kerbosch 算法的解释以查找派系或在此处解释其工作原理? 我知道它发表在“算法 457:查找无向图的所有团”一书中,但我找不到描述
我目前正在尝试在 Bron-Kerbosch 算法的 Clojure 实现中正确有效地使用集合和 clojure.set 命名空间,但遇到了困难。 我正在尝试重构我当前的实现 (defn BK [r
我一直在练习我的 C++ 算法知识,并卡在了标准 BK 实现上。该算法输出了太多派系,我似乎不明白为什么。我将图形表示为邻接表: vector > adjacency_list; 我的 BK 函数如下
简而言之,我的原始代码(用 Ruby 编写)如下所示: # $seen is a hash to memoize previously seen sets # $sparse is a hash of
对于一个大学项目,我正在尝试实现 Bron–Kerbosch algorithm ,即列出给定图中的所有最大团。 我正在尝试实现第一个算法(不旋转),但我的代码在 Wikipedia's exampl
我正在寻找 Bron-Kerbosch algorithm 的 Javascript 实现或 Girvan-Newman algorithm . 基本上,我想在无向图中为最大集团/社区着色。 遗憾的是
我一直在尝试实现 Bron-Kerbosch algorithm在 Rust 中为我的硕士论文。到目前为止一切正常,但是当我尝试从 BTreeSet 更改时到 HashSet出于性能比较的目的,行为变
我是一名优秀的程序员,十分优秀!