1个不稳定版本
0.1.0 | 2022年7月11日 |
---|
#1424 在 算法
每月99次下载
18KB
317 行
此crate提供了解决图顶点着色问题的算法。这些算法返回一个"着色",即每个顶点被分配到一个"颜色"(索引),使得没有两个同色的顶点通过边连接。这些算法使用启发式方法来最小化所需的不同颜色数量。
当前状态:基本功能正常,但未经过优化且测试不充分。
创建具有4个顶点、添加4条边并着色的示例。
use heuristic_graph_coloring::*;
let mut graph = VecVecGraph::new(4);
graph.add_edge(0, 1);
graph.add_edge(1, 2);
graph.add_edge(0, 2);
graph.add_edge(2, 3);
let coloring = color_greedy_by_degree(&graph);
assert_eq!(coloring, [1, 2, 0, 1]);
算法
名称 | 函数 | 使用的颜色 | 使用时间 | 评论 |
---|---|---|---|---|
贪婪(简单) | [color_greedy_naive] | 最多 | 最少 | 仅作为基线使用。 |
贪婪(按度数) | [color_greedy_by_degree] | 略少 | 最少 | 快速得到 decent 的结果。 |
DSatur | [color_greedy_dsatur] | 较少 | 较多 | 结果好但相当慢。 |
递归最大优先 | [color_rlf] | 更少 | 更多 | 最慢且时间复杂度最差,但结果最好。 |
如果你真的想要最少的颜色数,存在像回溯、SAT求解器或HEA进化方法这样的更慢的算法。上述算法仍然有助于提前确定上界。
另一方面,如果你想要更快,存在并行和分布式图着色算法。
测试
使用实例数据集(见instances/
文件夹)和简单算法找到的颜色数作为难度度量,我们得到以下结果
请参阅完整结果data/instances.tsv
。