跳到主要内容

入门指南

安装

要安装 AlphaCube,请打开终端并运行以下命令:

pip install alphacube

使用

基本用法

在 Python 中使用 AlphaCube 非常简单,如下所示:

import alphacube

# 加载训练好的深度神经网络
alphacube.load(model_id="small") # 默认模型

# 使用给定的打乱公式求解魔方
result = alphacube.solve(
scramble="D U F2 L2 U' B2 F2 D L2 U R' F' D R' F' U L D' F' D R2",
beam_width=1024,
)
print(result)
输出
{
'solutions': [
"D L D2 R' U2 D B' D' U2 B U2 B' U' B2 D B2 D' B2 F2 U2 F2"
],
'num_nodes': 19744,
'time': 1.4068585219999659
}

提高解法质量

如果你想获得更短的解法,只需增加 beam_width 参数:

alphacube.load()  # model_id="small"
result = alphacube.solve(
scramble="D U F2 L2 U' B2 F2 D L2 U R' F' D R' F' U L D' F' D R2",
beam_width=65536,
)
print(result)
输出
{
'solutions': [
"D' R' D2 F' L2 F' U B F D L D' L B D2 R2 F2 R2 F'",
"D2 L2 R' D' B D2 B' D B2 R2 U2 L' U L' D' U2 R' F2 R'"
],
'num_nodes': 968984,
'time': 45.690575091997744
}

允许一些额外步数

你可能不仅想获得最短的解法,还想获得稍微冗余一些的解法。这样,你可以降低忽略优秀解法的风险。

alphacube.load()  # model_id="small"
result = alphacube.solve(
scramble="D U F2 L2 U' B2 F2 D L2 U R' F' D R' F' U L D' F' D R2",
beam_width=65536,
extra_depths=1
)
print(result)
输出
{
'solutions': [
"D' R' D2 F' L2 F' U B F D L D' L B D2 R2 F2 R2 F'",
"D2 L2 R' D' B D2 B' D B2 R2 U2 L' U L' D' U2 R' F2 R'",
"D R F2 L' U2 R2 U2 R2 B2 U' F B2 D' F' D' R2 F2 U F2 L2",
"L' D' R' D2 L B' U F2 U R' U' F B' R2 B R B2 F D2 B",
"R' F L2 D R2 U' B' L' U2 F2 U L U B2 U2 R2 D' U B2 R2",
"L' U' F' R' U D B2 L' B' R' B U2 B2 L2 D' R2 U' D R2 U2"
],
'num_nodes': 1100056,
'time': 92.809575091997744
}

应用人体工程学偏好

人体工程学偏好允许你以数值方式指定特定步骤的期望程度,这些步骤感觉更快、更容易执行。要应用人体工程学偏好,请在 solve 方法中提供一个 ergonomic_bias 字典。每个步骤(例如 "U"、"U'"、"U2")都被分配一个分数,其中较高的分数表示更符合人体工程学的步骤。

ergonomic_bias = {
"U": 0.9, "U'": 0.9, "U2": 0.8,
"R": 0.8, "R'": 0.8, "R2": 0.75,
"L": 0.55, "L'": 0.4, "L2": 0.3,
"F": 0.7, "F'": 0.6, "F2": 0.6,
"D": 0.3, "D'": 0.3, "D2": 0.2,
"B": 0.05, "B'": 0.05, "B2": 0.01,
"u": 0.45, "u'": 0.45, "u2": 0.4,
"r": 0.3, "r'": 0.3, "r2": 0.25,
"l": 0.2, "l'": 0.2, "l2": 0.15,
"f": 0.35, "f'": 0.3, "f2": 0.25,
"d": 0.15, "d'": 0.15, "d2": 0.1,
"b": 0.03, "b'": 0.03, "b2": 0.01
}

result = alphacube.solve(
scramble="D U F2 L2 U' B2 F2 D L2 U R' F' D R' F' U L D' F' D R2",
beam_width=65536,
ergonomic_bias=ergonomic_bias
)
print(result)
输出
{
'solutions': [
"u' U' f' R2 U2 R' L' F' R D2 f2 R2 U2 R U L' U R L",
"u' U' f' R2 U2 R' L' F' R D2 f2 R2 U2 R d F' U f F",
"u' U' f' R2 U2 R' L' F' R u2 F2 R2 D2 R u f' l u U"
],
'num_nodes': 1078054,
'time': 56.13087955299852
}

GPU 加速

如果你有 GPU,我们强烈建议你选择最大的模型以获得最佳性能:

alphacube.load(model_id="large")
result = alphacube.solve(
scramble="D U F2 L2 U' B2 F2 D L2 U R' F' D R' F' U L D' F' D R2",
beam_width=65536,
)
print(result)
输出
{
'solutions': ["D F L' F' U2 B2 U F' L R2 B2 U D' F2 U2 R D'"],
'num_nodes': 903448,
'time': 20.46845487099995
}

详细模式

此外,你可以调用 alphacube.set_verbose() 来跟踪进度。它将在终端上显示当前的搜索深度。

模型与权衡

AlphaCube 提供了 EfficientCube 论文中的三个最大模型:"small"、"base" 和 "large"。

尽管你可能期望 "large" 模型表现最好("base" 模型表现更好)因为它们具有更高的准确性,但在没有 GPU 的情况下,实际上并非如此。

事实上,在没有 GPU 的情况下,"small" 模型成为 CPU 运行时的最佳选择。这是因为 CPU 在计算深度神经网络时本身会花费大量时间。"small" 模型在达到一定优化水平时证明是最节省时间的。

在 CPU 上计算量和解法质量之间的权衡

尽管在预测下一步时,较小的模型不如较大的模型准确,但较小的模型处理一批状态的速度要快得多。因此,如果你没有 GPU,在相同的时间范围内,选择 "small" 模型并使用足够宽的搜索宽度通常会产生最佳解法。

另一方面,如下图所示,当在 GPU 上部署时,最大的模型("large")表现出最高的时间效率。

在 GPU 上计算量和解法质量之间的权衡

命令行选项

如果你更喜欢从命令行界面(CLI)使用 AlphaCube,你可以这样做:

alphacube \
--model_id large \
--scramble "F U2 L2 B2 F U L2 U R2 D2 L' B L2 B' R2 U2" \
--beam_width 100000 \
--extra_depths 3 \
--verbose

使用缩写标志,

alphacube \
-m large \
-s "F U2 L2 B2 F U L2 U R2 D2 L' B L2 B' R2 U2" \
-bw 100000 \
-ex 3 \
-v

请在 API 参考 > CLI 中找到更多详细信息。

注意: 请注意,CLI 选项涉及为每个请求加载(和卸载)指定的模型。因此,这个 CLI 选项最好用于一次性执行该包。