File size: 3,686 Bytes
b570cf2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import torch
import numpy as np
import heapq
import os
from config import Config
from model.DNN import DNN
from model.Cube import Cube, TARGET_STATE
from vis import generate_rubiks_html
import time

from solver_utils import *

def generate_html(initial_state, solution_path):
    # 颜色映射 (0=白, 1=红, 2=绿, 3=黄, 4=橙, 5=蓝)
    COLOR_MAP = {
        0: "white",
        1: "red",
        2: "green",
        3: "yellow",
        4: "orange",
        5: "blue"
    }

    # 面顺序和索引范围
    FACE_ORDER = {
        'U': list(range(0, 9)),    # 顶面
        'R': list(range(9, 18)),   # 右面
        'F': list(range(18, 27)),  # 前面
        'D': list(range(27, 36)),  # 底面
        'L': list(range(36, 45)),  # 左面
        'B': list(range(45, 54))   # 后面
    }

    # 将初始状态转换为generate_rubiks_html需要的格式
    initial_state_dict = {}
    for face, indices in FACE_ORDER.items():
        initial_state_dict[face] = [COLOR_MAP[initial_state[i]] for i in indices]

    # 生成每一步的状态
    moves = []
    for state in solution_path:
        move_state = {}
        for face, indices in FACE_ORDER.items():
            move_state[face] = [COLOR_MAP[state[i]] for i in indices]
        moves.append(move_state)
        
    # 调用generate_rubiks_html生成网页
    output_file = "rubiks_solution.html"
    generate_rubiks_html(initial_state_dict, FACE_ORDER, moves, output_file)
    print(f"已生成解决方案网页: {output_file}")


def main():
    # 加载配置
    config = Config()
    args = config.parse_args()

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

    # 加载模型
    model = load_model(args.model_path, device=device)

    # 创建Cube对象
    cube = Cube()

    # 初始状态为目标状态
    initial_state = TARGET_STATE.copy()
    state_path = []

    if args.actions:
        # 使用用户指定的动作序列
        print(f"使用指定的动作序列: {args.actions}")
        shuffle_actions = args.actions.split()
        # 验证动作是否有效
        valid_actions = set(cube.moves.keys())
        invalid_actions = [action for action in shuffle_actions if action not in valid_actions]
        if invalid_actions:
            raise ValueError(f"无效的动作: {invalid_actions},有效的动作是: {valid_actions}")
    else:
        # 随机生成动作序列
        print("随机打乱魔方100次...")
        all_actions = list(cube.moves.keys())
        shuffle_actions = np.random.choice(all_actions, size=100, replace=True)

    # 应用动作序列
    for action in shuffle_actions:
        initial_state = cube.apply_action(initial_state, action)
        state_path.append(initial_state.copy())

    print("开始A*搜索...")

    # 执行A*搜索
    start_time = time.time()
    action_path, solution_state_path = a_star_search(initial_state, model, cube)
    end_time = time.time()
    solving_time = end_time - start_time

    # 保存为可视化结果
    if solution_state_path:
        # 合并打乱路径和解决方案路径以展示完整过程
        # full_state_path = state_path # + solution_state_path[1:]
        generate_html(initial_state.copy(), solution_state_path)
        # generate_html(initial_state, solution_state_path[1:])
        print(f"找到解决方案,路径长度: {len(solution_state_path)}")
        print(f"求解时间: {solving_time:.4f} 秒")  # 打印求解时间
        print("打乱路径:", shuffle_actions)
        if action_path:
            print("解决方案路径:", action_path)
    else:
        print("未找到解决方案")

if __name__ == '__main__':
    main()