{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 8-Solving Knapsack Problem with PyQUBO" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "view-in-github" }, "source": [ "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/OpenJij/OpenJijTutorial/blob/master/source/ja/008-KnapsackPyqubo.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "この節では、[Ising formulations of many NP problems](https://arxiv.org/pdf/1302.5843v3.pdf)から、5.2. Knapsack with Integer WeightsをPyQUBOを用いて解く方法について考察します。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Knapsack問題\n", "Knapsack問題は、具体的には以下のような状況の時にその最適解を求める問題であり、最も有名なNP困難な整数計画問題のひとつとして知られています。まず問題を理解することから始めてみます。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 具体例\n", "\n", "ここでは、分かりやすくするために以下のような物語を考えてみましょう。\n", "\n", "> ある探検家がある洞窟を探検していました。\n", "> しばらく洞窟の中を歩いていると、思いがけなく洞窟の中に次のように複数の宝物を見つけました。" ] }, { "attachments": { "Picture1.png": { "image/png": "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" } }, "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> しかし、探検家はあいにく手持ちの荷物の中で宝物を運べるような袋として、小さなナップサックしか持っていませんした。\n", "\n", "> このナップサックは最大2kgの荷物しか入れることができません。\n", "\n", "> 探検家はこのナップサックに入れる荷物をできるだけ高い価値になるようにしたいのですが、どの荷物を選べば最も効率的に宝物を持って帰ることができるでしょうか。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 問題の一般化\n", "\n", "この問題を一般化する際は、ナップサックに入れる荷物$N$個の集合$\\{0,1,\\cdots,\\alpha,\\cdots,N-1\\}$があり、各荷物が$\\alpha$をindexとして持っているものとして考えます。\n", "\n", "ナップサック問題では、各荷物$\\alpha$のコストのリスト$\\mathbf{c}$と重さのリスト$\\mathbf{w}$を作ることで問題の初期値を表現することができます。\n", "\n", "$$\n", "\\mathbf{c}=\\{c_0,c_1,\\cdots,c_{\\alpha},\\cdots,c_{N-1}\\}\n", "$$\n", "\n", "$$\n", "\\mathbf{w}=\\{w_0,w_1,\\cdots,w_{\\alpha},\\cdots,w_{N-1}\\}\n", "$$\n", "\n", "ここで、選んだ荷物を表すバイナリ変数$x_{\\alpha}$、ナップサックの最大容量$W$、ナップサックに入れた荷物の価格の合計を$C$とします。\n", "\n", "すると、以下の式のように選んだ荷物の合計重量$\\mathcal{W}$が$W$以下となるような制約条件(制約式(2))を満たしながら、$C$を最大化すること(目的式(1))がナップサック問題の目的となります。\n", "\n", "$$\n", "\\max C = \\sum^{N-1}_{\\alpha = 0}c_{\\alpha}x_{\\alpha} \\tag{1}\n", "$$\n", "\n", "$$\n", "\\mathrm{s.t.}\\ \\ \\mathcal{W} \\equiv \\sum^{N-1}_{\\alpha = 0}w_{\\alpha}x_{\\alpha} \\leq W \\tag{2}\n", "$$\n", "\n", "$$\n", "x_{\\alpha} \\in \\{0,1\\} \\tag{3}\n", "$$\n", "$$\n", "( \\forall \\alpha \\in \\{0,1,2,\\cdots,N-1\\} )\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## QUBO行列への変換方法\n", "\n", "QUBO行列では、ペナルティ法として等式しか扱うことができません。そこで、QUBO行列を表現するためには、式(3)で定義したように一般的に使用されるバイナリ変数$x_{\\alpha}$に加え、不等式(2)を等式制約にするためのスラック変数$y$を定義します。\n", "\n", "ここではまず、スラック変数とは何か、整数をバイナリ変数で表現する方法について説明してから、スラック変数を用いたQUBO行列の生成方法について説明します。" ] }, { "attachments": { "one-hot-encoding-2.png": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABbgAAADyCAYAAACPp6OPAAAAAXNSR0IArs4c6QAAAHhlWElmTU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUAAAABAAAARgEoAAMAAAABAAIAAIdpAAQAAAABAAAATgAAAAAAAACQAAAAAQAAAJAAAAABAAOgAQADAAAAAQABAACgAgAEAAAAAQAABbigAwAEAAAAAQAAAPIAAAAAIgmKhwAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAQABJREFUeAHt3QeclNW5+PFn+y67CywsZUE6iIBgRcQGlhgTY0+MiaaanvyvuSY3MeXe3BRTb+I1uWkmMcbEGGussSvYEFFQEJDe29LZZfuy//MMzvDW2ZndmXnfmfkdPuu873nbeb/ncXbnzHnPESEhgAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAgiEWaBAC9fV1TXcvFxkfg6an7Xmh4RAEAKV5qJjzQ9xGIQ+14wKEIdRCV6DFCAOg9Tn2lEB4jAqwWuQAsRhkPpcOypAHEYleA1SgDgMUp9rRwWIw6gEr0EKRONwe0FBwQNakGgD95fN8k1BloxrI4AAAggggAACCCCAAAIIIIAAAggggAACCCCQgMA+08Bdo/sVv7Oz9piVlvaDsu3A+neyeEEgswLlJZVS13c0cZhZdq7mECAOHSCsBiJAHAbCzkUdAsShA4TVQASIw0DYuahDgDh0gLAaiABxGAg7F3UIEIcOEFYDEYjGobl4pD1bCxFt4F6lK5v3rZFfv/A1XSQhkHGB8YOmyRfP/ClxmHF5LmgVIA6tGiwHJUAcBiXPda0CxKFVg+WgBIjDoOS5rlWAOLRqsByUwLjaqfKls37G5+WgKoDrRgSIQwIhDALRODRlWR0tT2F0gVcEEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBLJJgAbubKotyooAAggggAACCCCAAAIIIIAAAggggAACCCAQE6CBO0bBAgIIIIAAAggggAACCCCAAAIIIIAAAggggEA2CdDAnU21RVkRQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEYgI0cMcoWEAAAQQQQAABBBBAAAEEEEAAAQQQQAABBBDIJgEauLOptigrAggggAACCCCAAAIIIIAAAggggAACCCCAQEyABu4YBQsIIIAAAggggAACCCCAAAIIIIAAAggggAAC2SRAA3c21RZlRQABBBBAAAEEEEAAAQQQQAABBBBAAAEEEIgJ0MAdo2ABAQQQQAABBBBAAAEEEEAAAQQQQAABBBBAIJsEaODOptqirAgggAACCCCAAAIIIIAAAggggAACCCCAAAIxARq4YxQsIIAAAggggAACCCCAAAIIIIAAAggggAACCGSTAA3c2VRblBUBBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAgJkADd4yCBQQQQAABBBBAAAEEEEAAAQQQQAABBBBAAIFsEqCBO5tqi7IigAACCCCAAAIIIIAAAggggAACCCCAAAIIxARo4I5RsIAAAggggAACCCCAAAIIIIAAAggggAACCCCQTQI0cGdTbVFWBBBAAAEEEEAAAQQQQAABBBBAAAEEEEAAgZgADdwxChYQQAABBBBAAAEEEEAAAQQQQAABBBBAAAEEskmABu5sqi3KigACCCCAAAIIIIAAAggggAACCCCAAAIIIBAToIE7RsECAggggAACCCCAAAIIIIAAAggggAACCCCAQDYJ0MCdTbVFWRFAAAEEEEAAAQQQQAABBBBAAAEEEEAAAQRiAsWxJRZsAmXFFaI/JYWlUlBQKJ1dndLW0SIH2/bb9ktmpU9ptZQWlUtxYbF0dXVJR1eHtLY3SUtHUzKnYV8EEEAAAQQQQAABBBBAAAEEEEAAAQQQQAABI0ADt0cYXDL103LW+Muk0DRsO1Nj6365Z9EvZfHWl5ybfNcHVtbJp0/7ngypHuG5z7x1j8ndi2723EYmAggggAACCCCAAAIIIIAAAggggAACCCCAgLeAuwXXe7+8yh3ad5Rn47YiVJX1kytPuE5KisoSNnn3MVf7Nm7rSerM9UgIIIAAAggggAACCCCAAAIIIIAAAggggAACyQnQwO3htWjzXI/cI1mV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XDlrcgLEYXJe7J0eAeIwPa6cNTmBaByao3YUFBQM1aOL3zlFub4WFhRKWUlk8Z1sXhDIvABxmHlzrugWIA7dJuRkXoA4zLw5V3QLEIduE3IyL0AcZt6cK7oFiEO3CTmZFyAOM2/OFd0CxKHbhJxABMqiV402cP/NZKwxP83mZ2t0I68IZFhAv10Zbn6IwwzDczmbAHFo42AlIAHiMCB4LmsTIA5tHKwEJEAcBgTPZW0CxKGNg5WABIjDgOC5rE2AOLRxsBKQQDQOdwd0fS6LAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIZEzg/wPiTHo7DWVQGQAAAABJRU5ErkJggg==" } }, "cell_type": "markdown", "metadata": {}, "source": [ "### バイナリ変数による整数表現\n", "\n", "#### One-hot encoding\n", "\n", "\n", "\n", "QUBO行列によって整数を表現するためには、バイナリ変数によって整数を表現できるようにしなければなりません。その方法として、One-hot encodingと呼ばれる方法を採用すると、以下のように$1 \\leq Y \\leq W$を満たす整数$Y$を表現することができます。\n", "\n", "$$\n", "Y = \\sum^{W}_{i = 1}iy_i \\tag{4}\n", "$$\n", "\n", "$$\n", "y_i \\in \\{0,1\\}\n", "$$\n", "$$\n", "( \\forall i \\in \\{1,2,3,\\cdots,W\\} )\n", "$$\n", "\n", "One-hot encodingを用いることで、整数$Y$を$W$個のバイナリ変数を用いて定義できることがわかります。\n", "\n", "
\n", "\n", "
\n", "\n", "ただし、整数$Y$に上限値$M$が定められている場合には注意しなければならないことがあります。それは、One-hot encodingにはバイナリ変数のうち、ひとつだけが$y_i=1$でその他が$y_i=0$にならなければならないという制約が必ず必要となることです。\n", "\n", "この制約がないと、整数$Y$が上限値$W$よりも大きい数を許すことになってしまいます。" ] }, { "attachments": { "log-encoding-2.png": { "image/png": "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AQQQQAABBBBoGgEqME2TVSQUAQQQQAABBBBAAAEEqMBQBhBAAAEEEEAAAQQQQKBpBKjANE1WkVAEEEAAAQQQQAABBBCgAkMZQAABBBBAAAEEEEAAgaYRoALTNFlFQhFAAAEEEEAAAQQQQIAKDGUAAQQQQAABBBBAAAEEmkaACkzTZBUJRQABBBBAAAEEEEAAASowlAEEEEAAAQQQQAABBBBoGgEqME2TVSQUAQQQQAABBBBAAAEEqMBQBhBAAAEEEEAAAQQQQKBpBKjANE1WkVAEEEAAAQQQQAABBBCgAkMZQAABBBBAAAEEEEAAgaYRoALTNFlFQhFAAAEEEEAAAQQQQIAKDGUAAQQQQAABBBBAAAEEmkaACkzTZBUJRQABBBBAAAEEEEAAgfhGgg0VmUhEJBpDBYHGCEQ31qcph43x56obBCiHlAQ/CFAO/ZALpIFySBnwg0ChHKpaSiE5qsYiks/n/0l9XFmI5BMBBBBAAAEEEEAAAQQQ8JHA2kgkMlqnp/AGZlAt59VfVv0NqD8CAo0Q0K//2tUf5bAR+lyzIEA5LEjw2UgBymEj9bl2QYByWJDgs5EChXKYbmQiuDYCCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCDgT4H/D6ZdIYsVn/3BAAAAAElFTkSuQmCC" } }, "cell_type": "markdown", "metadata": {}, "source": [ "#### Log encoding\n", "\n", "\n", "\n", "上記でOne-hot encodingを用いることで整数$Y$を$W$個のバイナリ変数によって定義できることを示しました。\n", "\n", "しかし、バイナリ変数を2進数のように使うことで、整数$X$を$\\lfloor \\log_2 (W-1)\\rfloor + 1$個のバイナリ変数に減らすことができます。これがLog encodingと呼ばれる方法で、以下のように$0 \\leq Y \\leq W-1$を満たす整数$Y$を表現することができます。\n", "\n", "$$\n", "Y = \\sum^{\\lfloor \\log_2 (W-1)\\rfloor}_{i = 0} 2^{i}y_i \\tag{5}\n", "$$\n", "\n", "$$\n", "y_i \\in \\{0,1\\}\n", "$$\n", "$$\n", "( \\forall i \\in \\{0,1,2,\\cdots,\\lfloor \\log_2 (W-1)\\rfloor \\} )\n", "$$\n", "\n", "このように表現することで、例えば$10$という整数であっても$\\{y_0,y_1,y_2,y_3\\}\\{0,1,0,1\\}$のように4つのバイナリ変数のみを定義すれば整数$Y$を表現することができるため、特に大規模な問題ではバイナリ変数を大幅に減らすことができることがわかります。\n", "\n", "
\n", "\n", "
\n", "\n", "ただしこのLog encodingでは、表現できる整数の最大値が$2^{\\lfloor \\log_2 (W-1)\\rfloor+1}$となることに気をつける必要があります。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### One-hot encodingにより総重量を表現した制約項(2)の定義\n", "\n", "[Ising formulations of many NP problems](https://arxiv.org/pdf/1302.5843v3.pdf)では、One-hot encodingを用いて$1 \\leq Y \\leq W$を満たす$Y$を以下のように定義し、選択した荷物の合計重量$\\mathcal{W}$を表現しています。\n", "\n", "$$\n", "\\mathcal{W} = Y = \\sum^{W}_{n = 1}ny_n \\tag{6}\n", "$$\n", "\n", "この$Y$を用いることで、荷物の合計重量$\\mathcal{W}$との等式を表現することができるようになります。\n", "\n", "$$\n", "W \\geq \\mathcal{W} = Y \\tag{7}\n", "$$\n", "\n", "\n", "$$\n", "\\sum^{N-1}_{\\alpha = 0}w_{\\alpha}x_{\\alpha} = \\sum^{W}_{n = 1}ny_n \\tag{8}\n", "$$\n", "\n", "$$\n", "0 = \\sum^{W}_{n = 1}ny_n - \\sum^{N-1}_{\\alpha = 0}w_{\\alpha}x_{\\alpha} \\tag{9}\n", "$$\n", "\n", "したがって式(9)を満たしたとき、選択する荷物の合計重量がナップサックの最大容量以下でなければならないという制約式(2)を満たしたことと同義になります。そのため、\n", "\n", "$$\n", "H_{A1} = A\\left(\\sum^{W}_{n = 1}ny_n - \\sum^{N-1}_{\\alpha = 0}w_{\\alpha}x_{\\alpha}\\right)^2 \\tag{9}\n", "$$\n", "\n", "とハミルトニアンを定めることで、エネルギーが最小となった際にこの制約を満たすようなスピン状態を得ることができます。\n", "\n", "ただし、One-hot encodingではひとつのスピン状態だけが$y_i=1$となり、ほかが$y_i=0$となるようにしなければなりません。したがって、\n", "\n", "$$\n", "H_{A0} = A\\left( 1 - \\sum_{n=1}^{W} y_i \\right)^2 \\tag{10}\n", "$$\n", "\n", "という制約を加えることで、ハミルトニアンの制約項全体$H_A$を定義する必要があります。\n", "\n", "$$\n", "H_A=H_{A0}+H_{A1}\n", "$$\n", "\n", "\n", "$$\n", "H_{A} = A\\left( 1 - \\sum_{n=1}^{W} y_i \\right)^2 + A\\left(\\sum^{W}_{n = 1}ny_n - \\sum^{N-1}_{\\alpha = 0}w_{\\alpha}x_{\\alpha}\\right)^2 \\tag{11} \n", "$$\n", "\n", "One-hot encodingを用いた場合、ハミルトニアンは$W$個のスピンによって整数を表現することになります。\n", "\n", "#### One-hot encodingを用いた場合の欠点\n", "\n", "ハミルトニアンを定義するにあたって、スピンの数が大きくなることは最適化を難しくします。\n", "\n", "また、One-hot encodingを用いると、上記のように制約が2つ必要となります。これは一方を満たすと一方を満たさなくなるようなスピン状態を生みやすくなり、制約が冗長であると言わざるを得ません。\n", "\n", "しかし、Log encodingを用いることでこれらの問題点を解決することができます。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Log encodingによるスラック変数を用いた制約項(2)の定義\n", "\n", "#### スラック変数\n", "\n", "- 参考([数理計画用語集-スラック変数](http://www.msi.co.jp/nuopt/glossary/term_ae6d88ed7539c1112a070758e57339e1cdfa81da.html))\n", "\n", "ここで、まずスラック変数について少し説明します。\n", "\n", "スラック変数は、不等式制約を等式制約に変換するために用いられる変数のことです。\n", "\n", "例えば、$f(x)$が以下のような不等式制約があったとします。\n", "\n", "$$\n", "f(x) \\leq b \\tag{12}\n", "$$\n", "\n", "この不等式(4)を等式制約にするためにスラック変数$y \\geq 0$を導入すると、以下のように非負制約として書き直すことができます。\n", "\n", "$$\n", "f(x) + y = b \n", "$$\n", "$$\n", "(y \\geq 0) \\tag{13}\n", "$$\n", "\n", "#### Log encodingによるスラック変数を用いる\n", "\n", "Log encodingを用いると、 One-hot encodingに比べて少ないバイナリ変数$\\lfloor \\log_2 (W-1)\\rfloor+1$個で整数を表現することができます。\n", "\n", "まず、確認として不等式制約は以下の式で表されました。\n", "\n", "$$\n", "\\mathcal{W} \\equiv \\sum^{N-1}_{\\alpha = 0}w_{\\alpha}x_{\\alpha} \\leq W \\tag{14}\n", "$$\n", "\n", "ここで荷物がひとつ以上選択され、総重量が1以上であることを仮定します。すると、スラック変数$Y$を$0\\leq Y \\leq W-1$を満たすとして定義することができます。\n", "\n", "上記不等式はこのスラック変数$Y$を用いると、以下のような等式制約に変換することができることがわかります。\n", "\n", "$$\n", "\\mathcal{W} + Y = W\n", "$$\n", "\n", "$$\n", "0 = W - \\mathcal{W} - Y \\tag{14}\n", "$$\n", "\n", "この等式制約(14)は、先ほどと同様に荷物の合計重量$\\mathcal{W}$と$Y$との関係式となっていることがわかります。\n", "\n", "ここで、スラック変数$Y$を以下のように具体的にします。\n", "\n", "$$\n", "Y \\equiv \\sum^{\\lfloor \\log_2 (W-1)\\rfloor}_{n = 0} 2^{n}y_n \\tag{15}\n", "$$\n", "\n", "式()に$\\mathcal{W}$と$Y$の定義を代入すると、\n", "\n", "$$\n", "0 = W - \\sum^{N-1}_{\\alpha = 0}w_{\\alpha}x_{\\alpha} - \\sum^{\\lfloor \\log_2 (W-1)\\rfloor}_{n = 0} 2^{n}y_n \\tag{16}\n", "$$\n", "\n", "のようになります。これを満たすとき、制約式(2)が成り立つことになります。\n", "\n", "したがってハミルトニアンによる制約項は、\n", "\n", "$$\n", "H_A = A \\left( W - \\sum^{N-1}_{\\alpha = 0}w_{\\alpha}x_{\\alpha} - \\sum^{\\lfloor \\log_2 (W-1)\\rfloor}_{n = 0} 2^{n}y_n \\right)^2 \\tag{17}\n", "$$\n", "\n", "のように書き直すことができます。\n", "\n", "#### この方法を用いた際の利点\n", "\n", "この方法を用いると、既に述べたようにOne-hot encodingに比べて少ないバイナリ変数$(\\lfloor \\log_2 (W-1)\\rfloor+1)$個で整数を表現することができる以外にも、One-hot encodingのように追加制約を必要としません。\n", "\n", "これは、変数$Y$の最大値が$2^{\\lfloor \\log_2 (W-1)\\rfloor+1}$と決まっているからです。\n", "\n", "また、確かにLog encodingによって荷物の合計重量を定める際は変数$Y$の最大値が$2^{\\lfloor \\log_2 (W-1)\\rfloor+1}$であることに気をつけなければなりません。\n", "\n", "しかし、上記方法ではスラック変数を用いた表現になっているため、荷物の合計重量の最大値が$W$を超えることを心配する必要がありません。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 目的項(1)の定義\n", "\n", "もう一度確認しておくと、目的項(1)はナップサックに入れた荷物の価格の合計を最大化するためのものです。\n", "\n", "したがって、ハミルトニアンは単純に以下のように定義すれば、エネルギーが最小となったときのスピン状態は価格の合計を最大化した最適解となるはずです。\n", "\n", "$$\n", "H_B = - B\\sum^{N-1}_{\\alpha = 0} c_{\\alpha}x_{\\alpha} \\tag{18}\n", "$$\n", "\n", "ただし、定数A,Bは目的項$H_B$によって制約項$H_A$の制約を違反してはならないので、$0 < B \\max(c\\alpha) < A$とする必要があります。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## PyQUBOへの実装" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### PyQUBOのIntegerクラス\n", "\n", "PyQUBOの[Documentation](https://pyqubo.readthedocs.io/en/latest/reference/integer.html)では、バイナリ変数を整数に変換するためのクラスについて説明されています。\n", "\n", "Log encodingの整数をそのまま扱うことができる便利なメソッドLogEncIntegerがあるので、今回は上記で定義したスラック変数をこれを用いて定義することとします。\n", "\n", "LogEncIntegerの使い方は以下のようになっていて、整数のように使うことができます。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "y = LogEncInteger(\"ラベルの名前\", 最小値, 最大値)\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "LogEncInteger()では、最大値upperと最小値lowerを指定しますが、必ずしもupperが最大となることを保証するものではなく、以下の定義を参照してみると、最大値は$2^{\\lfloor \\log_2 (\\mathrm{upper}-\\mathrm{lower})\\rfloor+1}$となることを理解しておく必要があります。(引用:[Source code for pyqubo.integer.log_encoded_integer](https://pyqubo.readthedocs.io/en/latest/_modules/pyqubo/integer/log_encoded_integer.html#LogEncInteger))" ] }, { "cell_type": "markdown", "metadata": { "scrolled": false }, "source": [ "```python\n", "class LogEncInteger(Integer):\n", " #\n", " # omission\n", " #\n", " def __init__(self, label, lower, upper):\n", " assert upper > lower, \"upper value should be larger than lower value\"\n", " assert isinstance(lower, int)\n", " assert isinstance(upper, int)\n", "\n", " self.lower = lower\n", " self.upper = upper\n", " self._num_variables = int(np.log2(upper - lower))+1\n", " self.array = Array.create(label, shape=self._num_variables, vartype='BINARY')\n", " self.label = label\n", " self._express = lower + sum(x*2**i for i, x in enumerate(self.array))\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### QUBO行列の生成\n", "\n", "ここでは、上記具体例で示した探検家の例を、実際にQUBO行列にしてPyQUBOを用いて解いてみます。\n", "\n", "まず、ナップサックの容量と宝物のリストをそれぞれ定義します。" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "W = 20\n", "c = {0:5, 1:7, 2:2, 3:1, 4:4, 5:3}\n", "w = {0:8, 1:10, 2:6, 3:4, 4:5, 5:3}\n", "N = len(w)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "次に、バイナリ変数を定義します。スラック変数yに対しては、先ほどのLogEncInteger()を使います。" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from pyqubo import Array, LogEncInteger\n", "\n", "x = Array.create('x', shape=(N), vartype='BINARY')\n", "y = LogEncInteger(\"y\", (0, W))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "これらを用いて、ハミルトニアンをそれぞれ定義します。\n", "\n", "$$\n", "H_A = A \\left( W - \\sum^{N-1}_{\\alpha = 0}w_{\\alpha}x_{\\alpha} - Y \\right)^2\n", "$$\n", "\n", "$$\n", "H_B = - B\\sum^{N-1}_{\\alpha = 0} c_{\\alpha}x_{\\alpha}\n", "$$\n", "\n", "スラック変数yはLogEncInteger()を用いると整数と同様に利用することができるので、単純に以下のようになります。ただし、定数A,Bを$0 < B \\max(c\\alpha) < A$を満たすように先に定義しておきます。" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "from pyqubo import Constraint\n", "\n", "key1 = max(c, key = lambda k: c[k])\n", "B = 40\n", "A = 10 * B * c[key1]\n", "\n", "HA = Constraint(\n", " A * ( W - sum( w[a] * x[a] for a in range(N) ) - y )**2\n", " , label='HA'\n", ")\n", "\n", "HB = - B * sum( c[a] * x[a] for a in range(N) )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 実行結果\n", "\n", "以上の式をPyQUBOに解かせると、次のような結果になります。" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[Inputs]\n", "\n", "W (ナップサックの容量) : 2.0kg\n", "N (宝物の数): 6\n", "\n", "weight list\n", "{0: 8, 1: 10, 2: 6, 3: 4, 4: 5, 5: 3}\n", "\n", "cost list\n", "{0: 5, 1: 7, 2: 2, 3: 1, 4: 4, 5: 3}\n", "\n", "A : 2800\n", "B : 40\n", "\n", "[Results]\n", "\n", "decoded_sample.sample:\n", "{'y[4]': 0, 'x[0]': 0, 'x[1]': 1, 'x[2]': 0, 'x[3]': 0, 'x[4]': 1, 'x[5]': 1, 'y[2]': 0, 'y[1]': 1, 'y[0]': 0, 'y[3]': 0}\n", "\n", "x (選ばれた宝物) :\n", "宝物B\n", "宝物E\n", "宝物F\n", "\n", "スラック変数Y = 2\n", "\n", "broken\n", "{}\n", "合計の重さ : 1.8kg\n", "合計の価格 : $14,000\n" ] } ], "source": [ "from pyqubo import solve_qubo\n", "import dimod\n", "import math\n", "\n", "print(\"[Inputs]\")\n", "print()\n", "print(\"W (ナップサックの容量) : \"+str(W/10)+\"kg\")\n", "print(\"N (宝物の数): \"+str(N))\n", "print()\n", "print(\"weight list\")\n", "print(w)\n", "print()\n", "print(\"cost list\")\n", "print(c)\n", "print()\n", "print(\"A : \"+str(A))\n", "print(\"B : \"+str(B))\n", "\n", "H = HA + HB\n", "Q = H\n", "model = Q.compile()\n", "q, offset = model.to_qubo()\n", "\n", "sampleset = dimod.ExactSolver().sample_qubo(q)\n", "decoded_sample = model.decode_sample(sampleset.first.sample, vartype=\"BINARY\")\n", "print()\n", "print(\"[Results]\")\n", "print()\n", "print(\"decoded_sample.sample:\")\n", "print(decoded_sample.sample)\n", "print()\n", "print(\"x (選ばれた宝物) :\")\n", "\n", "treasures = ['A','B','C','D','E','F','G']\n", "weight = 0\n", "cost = 0\n", "\n", "for k in range(N):\n", " if decoded_sample.array('x', k) != 0:\n", " print(\"宝物\"+treasures[k])\n", " weight += w[k]\n", " cost += c[k]\n", " \n", "\n", "sol_y = sum(2**k * v for k, v in [(elem, decoded_sample.array('y', elem)) for elem in range(math.ceil(math.log2(W)))])\n", "\n", "print()\n", "print(\"スラック変数Y = {}\".format(sol_y))\n", "print()\n", "print(\"broken\")\n", "print(decoded_sample.constraints(only_broken=True))\n", "print(\"合計の重さ : \"+str(weight/10)+\"kg\")\n", "print(\"合計の価格 : $\"+str(cost)+\",000\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> 結果、宝物B、E、Fをナップサックに入れたとき、重量オーバーにならずかつ最大の合計価格となることがわかりました。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## まとめ\n", "\n", "Knapsack問題をQUBO行列に変換して、PyQUBOを用いて解く方法について説明しました。\n", "\n", "その際に、整数をバイナリ変数により表現する方法について複数あります。\n", "\n", "ここではOne-hot encodingとLog encodingを扱い、Log encodingはスピンを最小限にしながらも余分な制約条件を必要としない点においては優れていることを紹介しました。\n", "\n", "それぞれの整数表現について知っておくことで、適材適所で最適な方法を選ぶことができると思います。" ] } ], "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.9.3" } }, "nbformat": 4, "nbformat_minor": 4 }