#rubiks-cube #kociemba #cube-solver #two-phase

kewb

一个用于使用Kociemba的两阶段算法操作和解决3x3魔方的crate

7个不稳定版本 (3个重大更改)

0.4.2 2024年5月15日
0.4.1 2023年11月11日
0.3.0 2023年11月2日
0.2.1 2023年8月30日
0.1.0 2023年8月5日

#261 in 算法

MIT许可

61KB
1.5K SLoC

Kewb

Build/test crates.io

Kewb是一个库,用于使用Kociemba的两阶段算法操作和解决3x3魔方。还有一个命令行界面版本,展示了kewb的大多数功能。

请注意,这仍然是一个正在进行中的项目,实现尚未高效。求解器目前不使用对称简化、预移动或多线程搜索。

用法

有关kewb提供的API的完整列表,请参阅https://docs.rs/kewb/latest/kewb/

求解器需要一些预计算的数据,这些数据由DataTable结构表示。但是,生成它需要一些时间,因此建议将其写入磁盘或与可执行文件捆绑在一起。您可以使用write_table()函数或kewb-cli中的table命令来生成表。

use kewb::{
    error::Error,
    generators::generate_state_cross_solved,
    scramble::{scramble_from_state, scramble_from_str},
    CubieCube, DataTable, FaceCube, Solver,
};

fn main() -> Result<(), Error> {
    // Method 1: Bundling the table in the executable
    // const TABLE_BYTES = include_bytes!("./path_to_file")
    // let table = decode_table(&TABLE_BYTES)?;

    // Method 2: Reading the table from a file
    // let table = read_table("./path_to_file")?;

    // Method 3: Generating the table at runtime (slow)
    let table = DataTable::default();

    let mut solver = Solver::new(&table, 23, None);
    let scramble = scramble_from_str("R U R' U'")?; // vec![R, U, R3, U3]
    let state = CubieCube::from(&scramble);
    let solution = solver.solve(state).unwrap();

    println!("{}", solution);

    solver.clear();

    let faces = "DRBLUURLDRBLRRBFLFFUBFFDRUDURRBDFBBULDUDLUDLBUFFDBFLRL";
    let face_cube = FaceCube::try_from(faces)?;
    let state = CubieCube::try_from(&face_cube)?;
    let solution = solver.solve(state).unwrap();

    println!("{}", solution);

    solver.clear();

    let cross_solved = generate_state_cross_solved();
    let scramble = scramble_from_state(edges_solved, &mut solver)?;

    println!("{:?}", scramble);

    Ok(())
}

命令行界面

默认情况下,没有超时,这意味着求解器将返回找到的第一个解决方案。但是,通过添加超时,求解器将继续搜索,直到超时时间过去,并返回找到的最短解决方案或无解决方案。指定较低的搜索深度可以提高解决方案质量(大约21到23步),但如果深度小于20步,可能会使搜索变慢。尽管如此,已经证明所有情况都可以在20步或更少内解决。

kewb-cli help
# default values: max = 23, timeout = none, details = false
kewb-cli solve --scramble "R U R' U'" --max 22 --timeout 1 --details
kewb-cli solve -s "R U R' U'" -m 22 -t 1 -d
kewb-cli solve --facelet DRBLUURLDRBLRRBFLFFUBFFDRUDURRBDFBBULDUDLUDLBUFFDBFLRL
# default values: state = random, number = 1, preview = false
kewb-cli scramble -p
kewb-cli scramble -n 5
kewb-cli scramble f2l-solved
# generates the table used by the solver
kewb-cli table ./path_to_file

构建

注意:您必须安装rust工具链

克隆存储库并运行

cargo build --release # build in target/build/
# or
cargo install --path ./kewb-cli # install to ~/.cargo/bin/

测试

您可以通过运行来运行测试

cargo test --lib

待办事项

  • 添加文档
  • 更多CLI功能
  • 算法优化

参考资料

依赖关系

~0.9–1.5MB
~34K SLoC