#greedy #dsatur #rlf

启发式图着色

图顶点着色的启发式算法

1个不稳定版本

0.1.0 2022年7月11日

#1424算法

Download history 35/week @ 2024-04-02 9/week @ 2024-04-23 2/week @ 2024-06-04 15/week @ 2024-06-11 24/week @ 2024-06-25 61/week @ 2024-07-02 14/week @ 2024-07-09

每月99次下载

MIT/Apache

18KB
317

GitHub | Crates.io | Docs.rs

此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/文件夹)和简单算法找到的颜色数作为难度度量,我们得到以下结果

See data/colors.svg See data/time.svg

请参阅完整结果data/instances.tsv

无运行时依赖