新手教程-使用真机-云平台或者SDK#

用例描述#

通过旅行商问题(TravelingSalesmanProblem,TSP)展示从建模、提交Qubo矩阵到云平台、从云平台获取计算结果的全流程

方式一:通过云平台上传QUBO矩阵计算#

代码建模并生成qubo矩阵#

 1import numpy as np
 2import pandas as pd
 3import kaiwu as kw
 4
 5
 6def is_edge_used(var_x, var_u, var_v):
 7    """
 8    Determine whether the edge (u, v) is used in the path.
 9
10    Args:
11        var_x (ndarray): Decision variable matrix.
12
13        var_u (int): Start node.
14
15        var_v (int): End node.
16
17    Returns:
18        ndarray: Decision variable corresponding to the edge (u, v).
19    """
20    return kw.core.quicksum(
21        [var_x[var_u, j] * var_x[var_v, j + 1] for j in range(-1, n - 1)]
22    )
23
24
25if __name__ == "__main__":
26    # Import distance matrix
27    w = np.array([[0, 1, 2], [1, 0, 0], [2, 0, 0]])
28    # Get the number of nodes
29    n = w.shape[0]
30
31    # Create qubo variable matrix
32    x = kw.core.ndarray((n, n), "x", kw.core.Binary)
33
34    # Get sets of edge and non-edge pairs
35    edges = [(u, v) for u in range(n) for v in range(n) if w[u, v] != 0]
36    no_edges = [(u, v) for u in range(n) for v in range(n) if w[u, v] == 0]
37
38    qubo_model = kw.core.QuboModel()
39    # TSP path cost
40    qubo_model.set_objective(
41        kw.core.quicksum([w[u, v] * is_edge_used(x, u, v) for u, v in edges])
42    )
43
44    # Node constraint: Each node must belong to exactly one position
45    qubo_model.add_constraint(x.sum(axis=0) == 1, "sequence_cons", penalty=5.0)
46
47    # Position constraint: Each position can have only one node
48    qubo_model.add_constraint(x.sum(axis=1) == 1, "node_cons", penalty=5.0)
49
50    # Edge constraint: Pairs without edges cannot appear in the path
51    qubo_model.add_constraint(
52        kw.core.quicksum([is_edge_used(x, u, v) for u, v in no_edges]),
53        "connect_cons",
54        penalty=20,
55    )
56
57    qubo_mat = qubo_model.get_matrix()
58    pd.DataFrame(qubo_mat).to_csv("tsp.csv", index=False, header=False)

登录云平台上传矩阵#

  1. 登录专用量子云计算平台后进入控制台,选择真机后点击新建任务

    ../../_images/new_task.png
  2. 进入任务配置页面后,填写任务名称、上传矩阵,确认后点击下一步

    ../../_images/new_task1.png
  3. 进入确认配置页面,确认任务和真机信息后点击确定按钮

    ../../_images/new_task2.png
  4. 进入提交任务页面,显示提交成功

    ../../_images/new_task3.png
  5. 返回控制台,任务正在校验中

    ../../_images/new_task4.jpg
  6. 校验成功后任务进入排队中状态

    ../../_images/new_task5.jpg
  7. 任务完成后点击详情进入结果详情页面

    ../../_images/new_task6.png
  8. 查看结果详情(qubo解向量、qubo value演化曲线、任务执行时间等)

    ../../_images/new_task7.png

方式二:直接使用SDK调用真机#

下面是同样一个TSP的问题,使用SDK直接调用真机求解的例子。 由于量子计算机有精度限制,例子中用SDK自带的PrecisionReducer进行精度适配。 想了解更多的关于精度的知识,

参见

 1import numpy as np
 2import kaiwu as kw
 3
 4from kaiwu.cim import TaskMode
 5from kaiwu.common import CheckpointManager as ckpt
 6
 7
 8# Define edges using conditional functions
 9def is_edge_used(var_x, var_u, var_v):
10    """
11    Determine whether the edge (u, v) is used in the path.
12
13    Args:
14        var_x (ndarray): Decision variable matrix.
15
16        var_u (int): Start node.
17
18        var_v (int): End node.
19
20    Returns:
21        ndarray: Decision variable corresponding to the edge (u, v).
22    """
23    return kw.core.quicksum(
24        [var_x[var_u, j] * var_x[var_v, j + 1] for j in range(-1, n - 1)]
25    )
26
27
28if __name__ == "__main__":
29    # Set the save path for intermediate files
30    kw.common.CheckpointManager.save_dir = "/tmp"
31    # Define distance matrix
32    w = np.array(
33        [
34            [0, 0, 1, 1, 0],
35            [0, 0, 1, 0, 1],
36            [1, 1, 0, 0, 1],
37            [1, 0, 0, 0, 1],
38            [0, 1, 1, 1, 0],
39        ]
40    )
41
42    n = w.shape[0]  # Number of nodes
43
44    # Create a QUBO variable matrix (n x n)
45    x = kw.core.ndarray((n, n), "x", kw.core.Binary)
46
47    # Generate the set of edges and the set of non-edges
48    edges = [(u, v) for u in range(n) for v in range(n) if w[u, v] != 0]
49    no_edges = [(u, v) for u in range(n) for v in range(n) if w[u, v] == 0]
50
51    # Initialize the QUBO model
52    qubo_model = kw.core.QuboModel()
53
54    # Set the objective function: minimize path cost
55    path_cost = kw.core.quicksum([w[u, v] * is_edge_used(x, u, v) for u, v in edges])
56    qubo_model.set_objective(path_cost)
57
58    # Add constraints
59    # Node constraints: Each node must occupy one position
60    qubo_model.add_constraint(x.sum(axis=0) == 1, "node_cons", penalty=5.0)
61
62    # Location constraint: Each location must have at least one node.
63    qubo_model.add_constraint(x.sum(axis=1) == 1, "pos_cons", penalty=5.0)
64
65    # Edge constraint: Non-connecting edges must not appear
66    qubo_model.add_constraint(
67        kw.core.quicksum([is_edge_used(x, u, v) for u, v in no_edges]),
68        "edge_cons",
69        penalty=5,
70    )
71
72    # Configure the solver
73    ckpt.save_dir = "./tmp"
74    optimizer = kw.cim.CIMOptimizer(task_name="tsp", task_mode=TaskMode.OPTIMIZATION)
75    optimizer = kw.preprocess.PrecisionReducer(optimizer, 8)
76    sol_dict, qubo_val = optimizer.solve_qubo(qubo_model)
77
78    if sol_dict is not None:
79        # Verification Results
80        unsatisfied, res_dict = qubo_model.verify_constraint(sol_dict)
81        print(f"Number of unsatisfied constraints: {unsatisfied}")
82        print(f"constraint value: {res_dict}")
83
84        # Calculate path cost
85        path_cost = kw.core.get_val(qubo_model.objective, sol_dict)
86        print(f"Actual path cost: {path_cost}")
87    else:
88        print("Try again later")