新手教程-使用真机-云平台或者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
8import kaiwu.core._binary_expression
9
10
11def is_edge_used(var_x, var_u, var_v):
12 """
13 Determine whether the edge (u, v) is used in the path.
14
15 Args:
16 var_x (ndarray): Decision variable matrix.
17
18 var_u (int): Start node.
19
20 var_v (int): End node.
21
22 Returns:
23 ndarray: Decision variable corresponding to the edge (u, v).
24 """
25 return kaiwu.core.quicksum([var_x[var_u, j] * var_x[var_v, j + 1] for j in range(-1, n - 1)])
26
27
28if __name__ == '__main__':
29 # Import distance matrix
30 w = np.array([[0, 1, 2],
31 [1, 0, 0],
32 [2, 0, 0]])
33 # Get the number of nodes
34 n = w.shape[0]
35
36 # Create qubo variable matrix
37 x = kaiwu.core.ndarray((n, n), "x", kaiwu.core.Binary)
38
39 # Get sets of edge and non-edge pairs
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_model = kw.qubo.QuboModel()
44 # TSP path cost
45 qubo_model.set_objective(
46 kaiwu.core.quicksum([w[u, v] * is_edge_used(x, u, v) for u, v in edges]))
47
48 # Node constraint: Each node must belong to exactly one position
49 qubo_model.add_constraint((x.sum(axis=0) - 1) ** 2 == 0, "sequence_cons", penalty=5.0)
50
51 # Position constraint: Each position can have only one node
52 qubo_model.add_constraint((x.sum(axis=1) - 1) ** 2 == 0, "node_cons", penalty=5.0)
53
54 # Edge constraint: Pairs without edges cannot appear in the path
55 qubo_model.add_constraint(kaiwu.core.quicksum([is_edge_used(x, u, v) for u, v in no_edges]) == 0,
56 "connect_cons", penalty=20)
57
58 qubo_mat = qubo_model.get_matrix()
59 pd.DataFrame(qubo_mat).to_csv("tsp.csv", index=False, header=False)
登录云平台上传矩阵#
登录光量子云计算平台后进入控制台,选择真机后点击新建任务
进入任务配置页面后,填写任务名称、上传矩阵,确认后点击下一步
进入确认配置页面,确认任务和真机信息后点击确定按钮
进入提交任务页面,显示提交成功
返回控制台,任务正在校验中
校验成功后任务进入排队中状态
任务完成后点击详情进入结果详情页面
查看结果详情(qubo解向量、qubo value演化曲线、任务执行时间等)
方式二:直接使用SDK调用真机#
下面是同样一个TSP的问题,使用SDK直接调用真机求解的例子。 由于量子计算机有精度限制,例子中用SDK自带的PrecisionReducer进行精度适配。 想了解更多的关于精度的知识,
See also
1"""
2TSP调用真机示例
3"""
4import kaiwu as kw
5import numpy as np
6from kaiwu.common import CheckpointManager as ckpt
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.core.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 kw.common.CheckpointManager.save_dir = '/tmp'
29 # 定义距离矩阵
30 w = np.array([[0, 0, 1, 1, 0],
31 [0, 0, 1, 0, 1],
32 [1, 1, 0, 0, 1],
33 [1, 0, 0, 0, 1],
34 [0, 1, 1, 1, 0]])
35
36 n = w.shape[0] # 节点数量
37
38 # 创建 QUBO 变量矩阵 (n x n)
39 x = kw.core.ndarray((n, n), "x", kw.core.Binary)
40
41 # 生成边集合和非边集合
42 edges = [(u, v) for u in range(n) for v in range(n) if w[u, v] != 0]
43 no_edges = [(u, v) for u in range(n) for v in range(n) if w[u, v] == 0]
44
45 # 初始化 QUBO 模型
46 qubo_model = kw.qubo.QuboModel()
47
48 # 设置目标函数:最小化路径成本
49 path_cost = kw.core.quicksum([w[u, v] * is_edge_used(x, u, v) for u, v in edges])
50 qubo_model.set_objective(path_cost)
51
52 # 添加约束条件
53 # 节点约束:每个节点必须占据一个位置
54 qubo_model.add_constraint((x.sum(axis=0) - 1) ** 2 == 0, "node_cons", penalty=5.0)
55
56 # 位置约束:每个位置必须有一个节点
57 qubo_model.add_constraint((x.sum(axis=1) - 1) ** 2 == 0, "pos_cons", penalty=5.0)
58
59 # 边约束:非连接边不得出现
60 qubo_model.add_constraint(
61 kw.core.quicksum([is_edge_used(x, u, v) for u, v in no_edges])==0,
62 "edge_cons", penalty=5
63 )
64
65 # 配置求解器
66 ckpt.save_dir = './tmp'
67 optimizer = kw.cim.CIMOptimizer(task_name_prefix="tsp")
68 optimizer = kw.cim.PrecisionReducer(optimizer, 8) # 8位精度
69 solver = kw.solver.SimpleSolver(optimizer)
70
71 # 求解问题
72 sol_dict, qubo_val = solver.solve_qubo(qubo_model)
73
74 if sol_dict is not None:
75 # 验证结果
76 unsatisfied, res_dict = qubo_model.verify_constraint(sol_dict)
77 print(f"未满足约束数: {unsatisfied}")
78 print(f"约束项值: {res_dict}")
79
80 # 计算路径成本
81 path_cost = kw.core.get_val(qubo_model.objective, sol_dict)
82 print(f"实际路径成本: {path_cost}")
83 else:
84 print("稍后再试")