PUBO_CN.ipynb 20.1 KB
Notebook
Newer Older
Q
Quleaf 已提交
1 2 3 4
{
 "cells": [
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
5
   "metadata": {},
Q
Quleaf 已提交
6 7 8 9
   "source": [
    "# MBQC 模型下求解多项式组合优化问题\n",
    "\n",
    "<em> Copyright (c) 2021 Institute for Quantum Computing, Baidu Inc. All Rights Reserved. </em>"
Q
Quleaf 已提交
10
   ]
Q
Quleaf 已提交
11 12 13
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
14
   "metadata": {},
Q
Quleaf 已提交
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
   "source": [
    "在[基于测量的量子近似优化算法](QAOA_CN.ipynb)中,我们介绍了多项式无约束布尔优化问题(polynomial unconstrained boolean optimization problem, PUBO),并提出了**基于测量的量子近似优化算法(MB-QAOA)** 对该类问题的求解方式,感兴趣的读者可以参阅前面的内容。这里我们给出两个示例作为 MB-QAOA 的实战演示:一个具体的 PUBO 问题和一个最大割问题。\n",
    "\n",
    "## 示例:PUBO 问题\n",
    "\n",
    "我们首先简单回顾一下什么是 PUBO 问题。给定一个变量为 $x = \\{x_1,\\cdots,x_n\\}$ 的 $n$ 元多项式,\n",
    "\n",
    "$$\n",
    "C(x) = \\sum_{\\lambda \\in \\Lambda } \\alpha_{\\lambda} \\prod_{j \\in \\lambda} x_j,\\tag{1}\n",
    "$$\n",
    "\n",
    "其中每个变量 $x_i \\in \\{0,1\\}$,$\\prod_{j \\in \\lambda} x_j$ 为一个单项式,$\\lambda \\subseteq [n]:= \\{1, 2, ..., n\\}$ 为一个指标集,$\\Lambda$ 为指标集的集合,$\\alpha_\\lambda$ 为每个单项式对应的实系数。在 PUBO 问题中,$C(x)$ 称为目标多项式。PUBO 问题就是寻找一组最优解 $x^* = \\{x_1^*, x_2^*, ..., x_n^*\\} $ 使得目标多项式的取值最大,即\n",
    "\n",
    "$$\n",
    "x^* =\\underset{x}{\\text{argmax}} \\ C(x).\\tag{2}\n",
    "$$\n",
    "\n",
    "代码实现上,我们规定输入多项式的标准形式为一个列表,列表中的第一个元素为多项式的最大变量数,列表的第二个元素为一个字典,字典的键为每个单项式涉及的变量(常数则为 ‘cons’),变量之间用逗号隔开,值为该单项式的系数。比如,我们希望输入一个三元多项式 $x_1 + x_2 - x_3 + x_1 x_2 - x_1 x_2 x_3 + 0.5$,应输入如下代码:"
Q
Quleaf 已提交
33
   ]
Q
Quleaf 已提交
34 35 36 37
  },
  {
   "cell_type": "code",
   "execution_count": null,
Q
Quleaf 已提交
38 39
   "metadata": {},
   "outputs": [],
Q
Quleaf 已提交
40 41 42 43 44 45 46
   "source": [
    "# 变量数\n",
    "var_num = 3\n",
    "# 以字典格式存储多项式的各个单项式\n",
    "poly_dict = {'x_1': 1, 'x_2': 1, 'x_3': -1, 'x_1,x_2': 1, 'x_1,x_2,x_3': -1, 'cons':0.5}\n",
    "# 构造符合约定的多项式\n",
    "polynomial = [var_num, poly_dict]"
Q
Quleaf 已提交
47
   ]
Q
Quleaf 已提交
48 49 50
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
51
   "metadata": {},
Q
Quleaf 已提交
52 53 54 55 56 57 58 59 60 61 62 63 64
   "source": [
    "**注意:** 由于我们考虑的变量为布尔值,所以每个单项式中变量指数最大为 1,即输入的多项式字典的键中,每个变量最多出现一次。例如:{'x_1,x_1,x_2': 1} 为不符合规范的输入。我们同样约定自变量的下角标从 \"1\" 开始,与数学习惯相一致。并且为了统一输入规范,自变量需要连续编号,不能出现输入多项式为 $x_1x_2 + x_6$ 的情况,应该改为 $x_1x_2 + x_3$,否则我们会以报错的形式提醒输入不符合规范。\n",
    "\n",
    "代码实现上,我们在 `pubo` 中定义了 `is_poly_valid` 函数,用于检查输入多项式的合法性。如果合法,将会打印 \"The polynomial is valid.\" 字样,否则会报错。\n",
    "\n",
    "```python\n",
    "from paddle_quantum.mbqc.QAOA.pubo import is_poly_valid\n",
    "```\n",
    "我们同样定义了一个函数 `random_poly` 根据变量个数随机生成一个布尔型多项式。\n",
    "```python\n",
    "from paddle_quantum.mbqc.QAOA.pubo import random_poly\n",
    "```\n",
    "**注意:** 随机生成的多项式并不一定是合法的!因此我们需要在计算之前检查多项式的合法性。"
Q
Quleaf 已提交
65
   ]
Q
Quleaf 已提交
66 67 68
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
69
   "metadata": {},
Q
Quleaf 已提交
70 71
   "source": [
    "### 求解 PUBO 问题的代码实现"
Q
Quleaf 已提交
72
   ]
Q
Quleaf 已提交
73 74 75 76
  },
  {
   "cell_type": "code",
   "execution_count": null,
Q
Quleaf 已提交
77 78
   "metadata": {},
   "outputs": [],
Q
Quleaf 已提交
79 80 81 82 83 84 85 86 87 88 89
   "source": [
    "# 引入记时模块\n",
    "from time import perf_counter\n",
    "# 引入符号计算模块\n",
    "from sympy import symbols\n",
    "#引入 paddle 相关模块\n",
    "from paddle import seed, optimizer\n",
    "# 引入 pubo 模块\n",
    "from paddle_quantum.mbqc.QAOA.pubo import dict_to_symbol, is_poly_valid, brute_force_search\n",
    "# 引入 qaoa 模块 \n",
    "from paddle_quantum.mbqc.QAOA.qaoa import MBQC_QAOA_Net, get_solution_string"
Q
Quleaf 已提交
90
   ]
Q
Quleaf 已提交
91 92 93
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
94
   "metadata": {},
Q
Quleaf 已提交
95 96
   "source": [
    "利用 MB-QAOA 算法,我们可以定义 PUBO 主函数 ``mbqc_pubo``,输入目标函数和 QAOA 算法深度,最终返回最优解对应的比特串。在主函数中,**最核心的是 MBQC_QAOA_Net 类**,其集成了 MB-QAOA 以及优化网络,感兴趣的读者可以返回到 [基于测量的量子近似优化算法](QAOA_CN.ipynb) 中查看,这里我们直接调用。"
Q
Quleaf 已提交
97
   ]
Q
Quleaf 已提交
98 99 100 101
  },
  {
   "cell_type": "code",
   "execution_count": null,
Q
Quleaf 已提交
102 103
   "metadata": {},
   "outputs": [],
Q
Quleaf 已提交
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
   "source": [
    "# 定义 MBQC 模型求解 PUBO 问题的主函数\n",
    "def mbqc_pubo(OBJ_POLY, DEPTH, SEED, LR, ITR, EPOCH, SHOTS=1024):\n",
    "    \n",
    "    # 将字典类型的目标多项式转化为 sympy 能处理的符号多项式\n",
    "    obj_poly = dict_to_symbol(OBJ_POLY)\n",
    "    var_num, poly_symbol = obj_poly\n",
    "\n",
    "    # 打印当前 QAOA 算法电路深度\n",
    "    print(\"QAOA 算法深度为:\", DEPTH)\n",
    "\n",
    "    # 开始计时器\n",
    "    start_time = perf_counter()\n",
    "    \n",
    "    # 初始化一个 MB-QAOA 训练网络\n",
    "    seed(SEED)\n",
    "    mbqc_net = MBQC_QAOA_Net(DEPTH)\n",
    "    \n",
    "    # 选择 Adams 优化器\n",
    "    opt = optimizer.Adam(learning_rate=LR, parameters=mbqc_net.parameters())\n",
    "\n",
    "    # 开始训练\n",
    "    for epoch in range(EPOCH):\n",
    "        # 每次迭代后更新训练参数\n",
    "        for itr in range(1, ITR + 1):\n",
    "            # 用网络进行训练并返回损失函数值和当前输出量子态\n",
    "            loss, vector_out = mbqc_net(poly=obj_poly)\n",
    "            # 根据损失函数值优化参数\n",
    "            loss.backward()\n",
    "            opt.minimize(loss)\n",
    "            opt.clear_grad()\n",
    "            if itr % 10 == 0:\n",
    "                print(\"iter:\", itr, \"  loss_MBQC:\", \"%.4f\" % loss.numpy())\n",
    "                \n",
    "    # 停止计时器并打印训练用时\n",
    "    end_time = perf_counter()\n",
    "    print(\"MBQC 运行时间为: \", end_time - start_time)\n",
    "\n",
    "    # 打印优化后的训练参数 gamma, beta\n",
    "    print(\"最优参数 gamma 为: \", mbqc_net.gamma.numpy())\n",
    "    print(\"最优参数 beta 为: \", mbqc_net.beta.numpy())\n",
    "\n",
    "    # 解码原问题的答案\n",
    "    solution_str = get_solution_string(vector_out, SHOTS)\n",
    "\n",
    "    # 将最优解带回目标函数,求出对应的最优值\n",
    "    relation = {symbols('x_' + str(j + 1)): int(solution_str[j]) for j in range(var_num)}\n",
    "    value = poly_symbol.evalf(subs=relation)\n",
    "    \n",
    "    # 返回最优解和最优值\n",
    "    opt = [solution_str, value]\n",
    "    return opt"
Q
Quleaf 已提交
156
   ]
Q
Quleaf 已提交
157 158 159
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
160
   "metadata": {},
Q
Quleaf 已提交
161 162 163 164 165 166
   "source": [
    "为了检验训练结果的正确性,我们在 `pubo` 中定义了 `brute_force_search` 函数,用遍历的方法在解空间里暴力搜索 PUBO 问题的解,方便与 MBQC 模型训练得到的解进行对比。\n",
    "\n",
    "```python\n",
    "from paddle_quantum.mbqc.QAOA.pubo import brute_force_search\n",
    "```"
Q
Quleaf 已提交
167
   ]
Q
Quleaf 已提交
168 169 170
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
171
   "metadata": {},
Q
Quleaf 已提交
172 173 174 175
   "source": [
    "### Main 函数\n",
    "\n",
    "主函数定义后,我们就可以输入参数运行啦!"
Q
Quleaf 已提交
176
   ]
Q
Quleaf 已提交
177 178 179 180
  },
  {
   "cell_type": "code",
   "execution_count": null,
Q
Quleaf 已提交
181 182 183 184
   "metadata": {
    "tags": []
   },
   "outputs": [],
Q
Quleaf 已提交
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
   "source": [
    "# 定义主函数\n",
    "def main():\n",
    "    \n",
    "    # 以上面的例子 x_1 + x_2 - x_3 + x_1*x_2 -x_1*x_2*x_3 + 0.5 为例,求解 PUBO 问题\n",
    "    var_num = 3  \n",
    "    poly_dict = {'x_1': 1, 'x_2': 1, 'x_3': -1, 'x_1,x_2': 1, 'x_1,x_2,x_3': -1, 'cons':0.5}\n",
    "    polynomial = [var_num, poly_dict]\n",
    "    \n",
    "    # 打印输入的多项式\n",
    "    print(\"输入的多项式为:\", polynomial)\n",
    "    \n",
    "    # 我们也可以随机生成一个目标多项式\n",
    "    # polynomial = random_poly(var_num)\n",
    "\n",
    "    # 检查输入多项式的合法性\n",
    "    is_poly_valid(polynomial)\n",
    "\n",
    "    # 进行训练并返回最优结果\n",
    "    mbqc_result = mbqc_pubo(\n",
    "        OBJ_POLY=polynomial,  # 目标多项式函数\n",
    "        DEPTH=6,  # QAOA 算法电路深度\n",
    "        SEED=1024,  # 随机种子\n",
    "        LR=0.1,  # 学习率\n",
    "        ITR=120,  # 训练迭代次数\n",
    "        EPOCH=1  # 迭代周期\n",
    "    )\n",
    "\n",
    "    # 打印 MBQC 模型训练出来的最优结果\n",
    "    print(\"MBQC 模型得到的最优解为:\", mbqc_result[0])\n",
    "    print(\"MBQC 模型得到的最优值为:\", mbqc_result[1])\n",
    "    \n",
    "    # 通过暴力搜索计算 PUBO 问题的最优结果并打印\n",
    "    brute_result = brute_force_search(polynomial)\n",
    "    print(\"暴力搜索得到的最优解为:\", brute_result[0])\n",
    "    print(\"暴力搜索得到的最优值为:\", brute_result[1])\n",
    "    \n",
    "    # 将两种结果进行比较\n",
    "    print(\"MBQC 模型和暴力搜索的差值为:\", mbqc_result[1] - brute_result[1])\n",
    "\n",
    "\n",
    "if __name__ == '__main__':\n",
    "    main()"
Q
Quleaf 已提交
228
   ]
Q
Quleaf 已提交
229 230 231
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
232 233 234
   "metadata": {
    "tags": []
   },
Q
Quleaf 已提交
235 236 237 238 239 240 241 242 243 244
   "source": [
    "## 示例:最大割问题\n",
    "\n",
    "### 图与割\n",
    "\n",
    "最大割问题(MaxCut Problem)是图论中常见的一个组合优化问题,在统计物理学和电路设计中都有重要应用。\n",
    "\n",
    "在图论中,一个图由 $G = (V, E)$ 表示,其中 $V$ 为图的点集合,$E$ 为边集合。例如一个正方形就可以由 $G = (V,E)$ 其中 $V = [1,2,3,4]$, $E = [(1,2),(2,3),(3,4),(1,4)]$ 来表示。\n",
    "\n",
    "代码上,我们可以用 `maxcut` 中的 `plot_graph` 画出给定的图。"
Q
Quleaf 已提交
245
   ]
Q
Quleaf 已提交
246 247 248 249
  },
  {
   "cell_type": "code",
   "execution_count": null,
Q
Quleaf 已提交
250 251 252 253
   "metadata": {
    "tags": []
   },
   "outputs": [],
Q
Quleaf 已提交
254 255 256 257 258 259
   "source": [
    "from paddle_quantum.mbqc.QAOA.maxcut import plot_graph\n",
    "V = [1,2,3,4]\n",
    "E = [(1,2),(2,3),(3,4),(1,4)]\n",
    "G = [V, E] \n",
    "plot_graph(G,\"A square\")"
Q
Quleaf 已提交
260
   ]
Q
Quleaf 已提交
261 262 263
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
264
   "metadata": {},
Q
Quleaf 已提交
265 266 267 268
   "source": [
    "一个图的割是指将该图的顶点集 $V$ 分割成两个互不相交的子集合 $S_0$ 和 $S_1$ 的一种划分。如果图中边的两个顶点被划分到不同集合中,那么记录得一分,总得分则定义为这个割的大小。最大割问题就是要找到一个割使得该割的大小最大。\n",
    "\n",
    "比如对应如上所述正方形图 $G$, 其中一个最大割就是将点 $1$ 和 $3$ 分为同一个集合 $S_0$ 中,点 $2$ 和 $4$ 分到另一个集合 $S_1$ 中。  "
Q
Quleaf 已提交
269
   ]
Q
Quleaf 已提交
270 271 272
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
273
   "metadata": {},
Q
Quleaf 已提交
274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295
   "source": [
    "### 转化为 PUBO 问题\n",
    "\n",
    "最大割问题其实可以转化为一个 PUBO 问题。假设待分割的图 $G = (V, E)$ 有 $n=|V|$ 个顶点和 $m =|E|$ 条边,那么我们可以将最大割问题等价为拥有 $n$ 个自变量的组合优化问题。每个变量 $x_v$ 对应图 $G$ 中的一个顶点 $v \\in V$,其取值 $x_v \\in \\{0,1\\}$,分别对应于顶点属于集合 $S_0$ 或 $S_1$,因此 $x = \\{x_1,\\cdots,x_n\\}$ 的每一种取值方式都对应一个割。由于最大割问题中有效计数的边为那些顶点属于不同集合的边,即顶点 $u$ 和 $v$ 对应的变量取值不同 $x_u \\neq x_v$ 才会被记一分。所以对于给定的割 $x$,其对应的割的大小为\n",
    "\n",
    "$$\n",
    "C(x) = \\sum_{(u,v) \\in E} (x_u \\oplus x_v),\\tag{3}\n",
    "$$\n",
    "\n",
    "其中 $\\oplus$ 为异或运算。那么最大割问题等价于求解 $ \\underset{x}{\\max} \\ C(x)$。进一步,上述函数 $C(x)$ 可以写成多项式形式\n",
    "\n",
    "$$\n",
    "C(x) = \\sum_{(u, v) \\in E} (x_u + x_v - 2 x_u x_v),\\tag{4}\n",
    "$$\n",
    "\n",
    "从而最大割问题等价于一个 $n$ 元 $2$ 次多项式的 PUBO 问题。我们希望找到最优解 $x^{*}$ 使得目标多项式最大,\n",
    "\n",
    "$$\n",
    "x^* = \\underset{x}{\\text{argmax}} \\ \\left( \\sum_{(u, v) \\in E} (x_u + x_v - 2 x_u x_v) \\right).\\tag{5}\n",
    "$$\n",
    "\n",
    "在 `maxcut` 当中,我们定义了 `graph_to_poly` 函数,可以输入待分割的图,返回等价的 PUBO 问题的目标多项式。"
Q
Quleaf 已提交
296
   ]
Q
Quleaf 已提交
297 298 299 300
  },
  {
   "cell_type": "code",
   "execution_count": null,
Q
Quleaf 已提交
301 302
   "metadata": {},
   "outputs": [],
Q
Quleaf 已提交
303 304 305 306 307 308 309 310 311 312 313 314 315
   "source": [
    "# 引入 maxcut 模块\n",
    "from paddle_quantum.mbqc.QAOA.maxcut import graph_to_poly\n",
    "\n",
    "# 输入点和边的信息\n",
    "V = [1,2,3,4]\n",
    "E = [(1,2),(2,3),(3,4),(1,4)]\n",
    "# 构造待分割的图\n",
    "G = [V, E] \n",
    "\n",
    "# 将图转化为对应 PUBO 问题的目标多项式\n",
    "poly = graph_to_poly(G)\n",
    "print(\"与图等价的目标多项式为:\\n\", poly)"
Q
Quleaf 已提交
316
   ]
Q
Quleaf 已提交
317 318 319
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
320
   "metadata": {},
Q
Quleaf 已提交
321 322 323 324
   "source": [
    "### 求解最大割问题的代码实现\n",
    "\n",
    "得到等价的目标多项式之后,我们便可以仿照 PUBO 的流程,把最大割问题作为 PUBO 问题来求解。具体代码如下:"
Q
Quleaf 已提交
325
   ]
Q
Quleaf 已提交
326 327 328 329
  },
  {
   "cell_type": "code",
   "execution_count": null,
Q
Quleaf 已提交
330 331
   "metadata": {},
   "outputs": [],
Q
Quleaf 已提交
332 333 334 335 336 337 338 339 340
   "source": [
    "# 引入符号运算模块\n",
    "from sympy import symbols\n",
    "# 引入 paddle 模块\n",
    "from paddle import seed, optimizer\n",
    "# 引入 qaoa 模块\n",
    "from paddle_quantum.mbqc.QAOA.qaoa import MBQC_QAOA_Net, get_solution_string\n",
    "# 引入 maxcut 模块\n",
    "from paddle_quantum.mbqc.QAOA. maxcut import plot_graph, graph_to_poly, plot_solution"
Q
Quleaf 已提交
341
   ]
Q
Quleaf 已提交
342 343 344
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
345
   "metadata": {},
Q
Quleaf 已提交
346 347
   "source": [
    "利用 MB-QAOA 算法,我们可以定义 MaxCut 主函数,将图输入到 MB-QAOA 算法中,最终返回求得的解并画出割的方式。"
Q
Quleaf 已提交
348
   ]
Q
Quleaf 已提交
349 350 351 352
  },
  {
   "cell_type": "code",
   "execution_count": null,
Q
Quleaf 已提交
353 354
   "metadata": {},
   "outputs": [],
Q
Quleaf 已提交
355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409
   "source": [
    "# 定义 MaxCut 主函数\n",
    "def mbqc_maxcut(GRAPH, DEPTH, SEED, LR, ITR, EPOCH, SHOTS=1024):\n",
    "    \n",
    "    # 打印待分割的图\n",
    "    plot_graph(graph=GRAPH, title=\"Graph to be cut\")\n",
    "\n",
    "    # 找到图对应的目标多项式\n",
    "    polynomial = graph_to_poly(GRAPH)\n",
    "    print(\"与图等价的目标多项式为:\", polynomial[1])\n",
    "\n",
    "    # 开始算法的记时\n",
    "    start_time = perf_counter()\n",
    "\n",
    "    # 实例化一个 MB-QAOA 训练网络\n",
    "    seed(SEED)\n",
    "    mbqc_net = MBQC_QAOA_Net(DEPTH)\n",
    "    # 选择 Adams 优化器\n",
    "    opt = optimizer.Adam(learning_rate=LR, parameters=mbqc_net.parameters())\n",
    "\n",
    "    # 开始训练\n",
    "    for epoch in range(EPOCH):\n",
    "        # 每次迭代后更新训练参数\n",
    "        for itr in range(1, ITR + 1):\n",
    "            # 训练参数并返回损失函数值和当前输出量子态\n",
    "            loss, state_out = mbqc_net(poly=polynomial)\n",
    "            # 根据损失函数值优化训练参数\n",
    "            loss.backward()\n",
    "            opt.minimize(loss)\n",
    "            opt.clear_grad()\n",
    "            if itr % 10 == 0:\n",
    "                print(\"iter:\", itr, \"  loss_MBQC:\", \"%.4f\" % loss.numpy())\n",
    "\n",
    "    # 停止算法的记时并打印用时\n",
    "    end_time = perf_counter()\n",
    "    print(\"MBQC 运行时间为:\", end_time - start_time)\n",
    "    \n",
    "    # 打印训练得到的最优参数\n",
    "    print(\"最优参数 gamma 为: \", mbqc_net.gamma.numpy())\n",
    "    print(\"最优参数 beta 为:\", mbqc_net.beta.numpy())\n",
    "\n",
    "    # 从量子态中解码问题的答案\n",
    "    mbqc_solution = get_solution_string(state_out, SHOTS)\n",
    "    # 绘制割的方式\n",
    "    plot_solution(GRAPH, mbqc_solution)\n",
    "\n",
    "    # 将最优解带入目标函数,求得对应最优值,并返回\n",
    "    var_num, poly_symbol = polynomial\n",
    "    relation = {symbols('x_' + str(j + 1)): int(mbqc_solution[j]) for j in range(var_num)}\n",
    "    \n",
    "    mbqc_value = int(poly_symbol.evalf(subs=relation))\n",
    "    mbqc_opt = [mbqc_solution, mbqc_value]\n",
    "\n",
    "    # 返回最优解和对应的最优值\n",
    "    return mbqc_opt"
Q
Quleaf 已提交
410
   ]
Q
Quleaf 已提交
411 412 413
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
414
   "metadata": {},
Q
Quleaf 已提交
415 416 417 418
   "source": [
    "### Main 函数\n",
    "\n",
    "主函数定义后,我们就可以输入参数运行啦!"
Q
Quleaf 已提交
419
   ]
Q
Quleaf 已提交
420 421 422 423
  },
  {
   "cell_type": "code",
   "execution_count": null,
Q
Quleaf 已提交
424 425 426 427
   "metadata": {
    "tags": []
   },
   "outputs": [],
Q
Quleaf 已提交
428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451
   "source": [
    "def main():\n",
    "    # 以正方形的 MaxCut 问题为例,输入节点和边信息\n",
    "    V = [1, 2, 3, 4]\n",
    "    E = [(1, 2), (2, 3), (3, 4), (4, 1)]\n",
    "    G = [V, E]\n",
    "    \n",
    "    # 进行训练并返回最优结果\n",
    "    mbqc_result = mbqc_maxcut(\n",
    "        GRAPH=G,  #  待分割的图\n",
    "        DEPTH=6,  # QAOA 算法电路深度\n",
    "        SEED=1024,  # 随机种子\n",
    "        LR=0.1,  # 学习率\n",
    "        ITR=120,  # 训练迭代次数\n",
    "        EPOCH=1,  # 迭代周期\n",
    "        SHOTS=1024  # 解码答案时的采样数\n",
    "    )\n",
    "\n",
    "    # 打印训练的最优结果\n",
    "    print(\"最优解为:\", mbqc_result[0])\n",
    "    print(\"最优值为: \", mbqc_result[1])\n",
    "\n",
    "if __name__ == '__main__':\n",
    "    main()"
Q
Quleaf 已提交
452
   ]
Q
Quleaf 已提交
453 454 455
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
456
   "metadata": {},
Q
Quleaf 已提交
457
   "source": [
Q
Quleaf 已提交
458 459
    "至此,我们完成了本教程的两个完整示例。MB-QAOA 算法实现预示着 MBQC 模型在量子机器学习领域强大的潜力。很显然,MBQC 模型所能够处理的算法不仅有 QAOA,我们非常期待 MBQC 这种非同寻常的计算方式能在某些特殊情境下展现出无与伦比的优势!"
   ]
Q
Quleaf 已提交
460 461 462
  },
  {
   "cell_type": "markdown",
Q
Quleaf 已提交
463 464 465
   "metadata": {
    "tags": []
   },
Q
Quleaf 已提交
466 467 468 469 470 471
   "source": [
    "---\n",
    "\n",
    "## 参考文献\n",
    "\n",
    "[1] Farhi, Edward, et al. \"A quantum approximate optimization algorithm.\" [arXiv preprint arXiv:1411.4028 (2014).](https://arxiv.org/abs/1411.4028)"
Q
Quleaf 已提交
472
   ]
Q
Quleaf 已提交
473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.10"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": false,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
Q
Quleaf 已提交
538
}