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

用例描述#

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

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

代码建模并生成qubo矩阵#

 1# pylint: disable=<R0801>
 2"""
 3TSP问题调用真机求解
 4"""
 5import numpy as np
 6import pandas as pd
 7import kaiwu as kw
 8
 9
10def is_edge_used(var_x, var_u, var_v):
11    """
12    Determine whether the edge (u, v) is used in the path.
13
14    Args:
15        var_x (ndarray): Decision variable matrix.
16
17        var_u (int): Start node.
18
19        var_v (int): End node.
20
21    Returns:
22        ndarray: Decision variable corresponding to the edge (u, v).
23    """
24    return kw.qubo.quicksum([var_x[var_u, j] * var_x[var_v, j + 1] for j in range(-1, n - 1)])
25
26
27if __name__ == '__main__':
28    # Import distance matrix
29    w = np.array([[0, 1, 2],
30                  [1, 0, 0],
31                  [2, 0, 0]])
32    # Get the number of nodes
33    n = w.shape[0]
34
35    # Create qubo variable matrix
36    x = kw.qubo.ndarray((n, n), "x", kw.qubo.Binary)
37
38    # Get sets of edge and non-edge pairs
39    edges = [(u, v) for u in range(n) for v in range(n) if w[u, v] != 0]
40    no_edges = [(u, v) for u in range(n) for v in range(n) if w[u, v] == 0]
41
42    qubo_model = kw.qubo.QuboModel()
43    # TSP path cost
44    qubo_model.set_objective(kw.qubo.quicksum([w[u, v] * is_edge_used(x, u, v) for u, v in edges]))
45
46    # Node constraint: Each node must belong to exactly one position
47    qubo_model.add_constraint(x.sum(axis=0) == 1, "sequence_cons", penalty=5.0)
48
49    # Position constraint: Each position can have only one node
50    qubo_model.add_constraint(x.sum(axis=1) == 1, "node_cons", penalty=5.0)
51
52    # Edge constraint: Pairs without edges cannot appear in the path
53    qubo_model.add_constraint(kw.qubo.quicksum([is_edge_used(x, u, v) for u, v in no_edges]),
54        "connect_cons", penalty=20.0)
55
56    qubo_mat = qubo_model.get_matrix()
57    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进行精度适配。 想了解更多的关于精度的知识,

See also

 1"""
 2TSP调用真机示例
 3"""
 4import kaiwu as kw
 5import numpy as np
 6
 7
 8# 定义边使用判断函数
 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.qubo.quicksum([var_x[var_u, j] * var_x[var_v, j + 1] for j in range(-1, n - 1)])
24
25
26if __name__ == "__main__":
27    # 定义距离矩阵
28    w = np.array([[0, 0, 1, 1, 0],
29                  [0, 0, 1, 0, 1],
30                  [1, 1, 0, 0, 1],
31                  [1, 0, 0, 0, 1],
32                  [0, 1, 1, 1, 0]])
33
34    n = w.shape[0]  # 节点数量
35
36    # 创建 QUBO 变量矩阵 (n x n)
37    x = kw.qubo.ndarray((n, n), "x", kw.qubo.Binary)
38
39    # 生成边集合和非边集合
40    edges = [(u, v) for u in range(n) for v in range(n) if w[u, v] != 0]
41    no_edges = [(u, v) for u in range(n) for v in range(n) if w[u, v] == 0]
42
43    # 初始化 QUBO 模型
44    qubo_model = kw.qubo.QuboModel()
45
46    # 设置目标函数:最小化路径成本
47    path_cost = kw.qubo.quicksum([w[u, v] * is_edge_used(x, u, v) for u, v in edges])
48    qubo_model.set_objective(path_cost)
49
50    # 添加约束条件
51    # 节点约束:每个节点必须占据一个位置
52    qubo_model.add_constraint(x.sum(axis=0) == 1, "node_cons", penalty=5.0)
53
54    # 位置约束:每个位置必须有一个节点
55    qubo_model.add_constraint(x.sum(axis=1) == 1, "pos_cons", penalty=5.0)
56
57    # 边约束:非连接边不得出现
58    qubo_model.add_constraint(
59        kw.qubo.quicksum([is_edge_used(x, u, v) for u, v in no_edges]),
60        "edge_cons", penalty=5.0
61    )
62
63    # 配置求解器
64    optimizer = kw.cim.CIMOptimizer(user_id="123124141", sdk_code="46sdgvsdgrreewrw", task_name="tsp")
65    optimizer = kw.cim.PrecisionReducer(optimizer, 8)  # 8位精度
66    solver = kw.solver.SimpleSolver(optimizer)
67
68    # 求解问题
69    sol_dict, qubo_val = solver.solve_qubo(qubo_model)
70
71    # 验证结果
72    unsatisfied, res_dict = qubo_model.verify_constraint(sol_dict)
73    print(f"未满足约束数: {unsatisfied}")
74    print(f"约束项值: {res_dict}")
75
76    # 计算路径成本
77    path_cost = kw.core.get_val(qubo_model.objective, sol_dict)
78    print(f"实际路径成本: {path_cost}")