6 个版本 (稳定)
1.1.0 | 2023 年 10 月 13 日 |
---|---|
1.0.2 | 2023 年 10 月 10 日 |
1.0.1 | 2023 年 10 月 5 日 |
0.1.0 | 2023 年 6 月 30 日 |
0.0.1 | 2023 年 5 月 2 日 |
671 在 算法 中
每月 41 次下载
210KB
4K SLoC
注意
此版本仍在开发中。特别是,它缺少一份描述所使用算法及其性能的 40 页正式报告。一旦允许发布,此注释将被删除。
Walky - 高度并行的 TSP 求解器(支持 MPI!)
Walky 是一个高度并行的旅行商问题(TSP)求解器。它具有以下特性
- 支持精确求解、近似求解和下界生成
- 与标准 TSPLIB-XML 格式 兼容
- 多种近似算法:最近邻算法、Christofides 算法
- 多种下界算法:最小生成树(MST)、1-tree
- 支持多线程和分布式内存,多节点并行使用 MPI
- 文档齐全,经过良好测试,高度优化
为了更好地了解该主题,强烈推荐观看 reducible 的 视频文章。
安装
要么使用 cargo(对于 MPI,请添加 --features mpi
)
cargo install walky
或者从 git 构建
git clone https://github.com/lquenti/walky
cd walky
cargo build --release (--features mpi)
对于基准测试,可以使用 benchmarking
功能。
使用方法
$ walky --help
A TSP solver written in Rust
Usage: walky <COMMAND>
Commands:
exact Find the exact best solution to a given TSP instance
approx Find an approximate solution to a given TSP instance
lower-bound Compute a lower bound cost of a TSP instance
help Print this message or the help of the given subcommand(s)
Options:
-h, --help Print help
-V, --version Print version
精确算法
示例调用(算法 v5
,多线程,示例生成)
$ walky exact v5 -p multi-threaded utils/gen_matrix_fast/results/8.xml
Best Cost: 47.85171352981164
Best Permutation: [0, 6, 1, 3, 5, 2, 7, 4]
完整使用方法
$ walky exact --help
Find the exact best solution to a given TSP instance
Usage: walky exact [OPTIONS] <ALGORITHM> <INPUT_FILE>
Arguments:
<ALGORITHM>
The Algorithm to use
Possible values:
- v0: Testing each possible (n!) solutions
- v1: Fixating the first Element, so testing ((n-1)!) solutions
- v2: Recursive Enumeration; Keep the partial sums cached
- v3: Stop if partial sum is worse than previous best
- v4: Stop if partial sum + greedy nearest neighbour graph is bigger than current optimum
- v5: As V5, but use an MST instead of NN-graph as a tighter bound
- v6: Cache MST distance once computed
<INPUT_FILE>
Path to the TSPLIB-XML file
Options:
-p, --parallelism <PARALLELISM>
Whether to solve it sequential or parallel
[default: single-threaded]
Possible values:
- single-threaded: Run in a single threaded
- multi-threaded: Run in multiple threads on a single node
-h, --help
Print help (see a summary with '-h')
-V, --version
Print version
近似算法
示例调用(算法 christofides
,多线程,示例生成)
$ walky approx christofides -p multi-threaded utils/gen_matrix_fast/results/8.xml
Christofides solution weight: 47.87647721988842
完整使用方法
$ walky approx --help
Find an approximate solution to a given TSP instance
Usage: walky approx [OPTIONS] <ALGORITHM> <INPUT_FILE>
Arguments:
<ALGORITHM>
The Algorithm to use
Possible values:
- nearest-neighbour: Starting at each vertex, always visiting the lowest possible next vertex
- christofides: The Christofides(-Serdyukov) algorithm
<INPUT_FILE>
Path to the TSPLIB-XML file
Options:
-p, --parallelism <PARALLELISM>
Whether to solve it sequential or parallel
[default: single-threaded]
Possible values:
- single-threaded: Run in a single threaded
- multi-threaded: Run in multiple threads on a single node
-l, --lower-bound <LOWER_BOUND>
Whether to also compute a lower_bound. Optional
Possible values:
- one-tree: The one tree lower bound
- mst: The MST lower bound
-h, --help
Print help (see a summary with '-h')
-V, --version
Print version
下界
示例调用(算法 1-tree
,示例生成)
$ walky lower-bound one-tree utils/gen_matrix_fast/results/8.xml
1-tree lower bound: 47.13382548327308
完整使用方法
$ walky lower-bound --help
Compute a lower bound cost of a TSP instance
Usage: walky lower-bound [OPTIONS] <ALGORITHM> <INPUT_FILE>
Arguments:
<ALGORITHM>
The Algorithm to use
Possible values:
- one-tree: The one tree lower bound
- mst: The MST lower bound
- mst-queue: The MST lower bound, computed with prims algorithm using a priority queue
<INPUT_FILE>
Path to the TSPLIB-XML file
Options:
-p, --parallelism <PARALLELISM>
Whether to solve it sequential or parallel
[default: single-threaded]
Possible values:
- single-threaded: Run in a single threaded
- multi-threaded: Run in multiple threads on a single node
-h, --help
Print help (see a summary with '-h')
-V, --version
Print version
算法
算法可以在技术报告中找到(即将上传)
测试文件生成
可以使用 utils/gen_matrix_fast/{gen,gen_big}.sh
生成测试 XML 文件。
许可证
本项目采用 MIT 许可证。
第三方依赖项
此项目包含名为 priority-queue
的crate,它采用LGPLv3和MPLv2的双重许可。您可以在以下位置找到该项目的源代码:https://github.com/garro95/priority-queue。由于MPLv2允许这样做,我们可以将此项目包含在我们的项目中:https://www.mozilla.org/en-US/MPL/2.0/FAQ/
依赖项
~9.5MB
~173K SLoC