{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"collapsed_sections":["9zppgpzQNJk2"],"authorship_tag":"ABX9TyO6IcDgXRF4RbmcP2Ac/XUI"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["# Simulated Annealing Tutorial ーHow to formulateー\n","This notebook explains the concept of formulation for combinatorial optimization.\n","\n","To tackle this topic, we will examine the number partitioning problem as a representative example.\n","\n","Let's implement a solution using SA!"],"metadata":{"id":"sQ-e-VhcSygM"}},{"cell_type":"markdown","source":["## Preparation"],"metadata":{"id":"qKlFVtKN8eCP"}},{"cell_type":"code","source":["!pip install openjij\n","!pip install pyqubo"],"metadata":{"id":"tlQ6vJGPTAl6","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1771333630894,"user_tz":-540,"elapsed":9185,"user":{"displayName":"沖澤孝之介","userId":"02718127576258174876"}},"outputId":"7be9932c-ba06-4c68-c7e0-4103226bdb81"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["Requirement already satisfied: openjij in /usr/local/lib/python3.12/dist-packages (0.11.6)\n","Requirement already satisfied: numpy<2.4.0,>=1.19.3 in /usr/local/lib/python3.12/dist-packages (from openjij) (2.0.2)\n","Requirement already satisfied: dimod<0.13.0,>=0.9.11 in /usr/local/lib/python3.12/dist-packages (from openjij) (0.12.21)\n","Requirement already satisfied: jij-cimod<1.8.0,>=1.7.0 in /usr/local/lib/python3.12/dist-packages (from openjij) (1.7.3)\n","Requirement already satisfied: scipy<1.16,>=1.5.4 in /usr/local/lib/python3.12/dist-packages (from jij-cimod<1.8.0,>=1.7.0->openjij) (1.15.3)\n","Requirement already satisfied: pyqubo in /usr/local/lib/python3.12/dist-packages (1.5.0)\n","Requirement already satisfied: numpy>=1.17.3 in /usr/local/lib/python3.12/dist-packages (from pyqubo) (2.0.2)\n","Requirement already satisfied: dimod<0.13,>=0.9.14 in /usr/local/lib/python3.12/dist-packages (from pyqubo) (0.12.21)\n","Requirement already satisfied: dwave-neal>=0.5.7 in /usr/local/lib/python3.12/dist-packages (from pyqubo) (0.6.0)\n","Requirement already satisfied: Deprecated>=1.2.12 in /usr/local/lib/python3.12/dist-packages (from pyqubo) (1.3.1)\n","Requirement already satisfied: six>=1.15.0 in /usr/local/lib/python3.12/dist-packages (from pyqubo) (1.17.0)\n","Requirement already satisfied: wrapt<3,>=1.10 in /usr/local/lib/python3.12/dist-packages (from Deprecated>=1.2.12->pyqubo) (2.1.1)\n","Requirement already satisfied: dwave-samplers<2.0.0,>=1.0.0 in /usr/local/lib/python3.12/dist-packages (from dwave-neal>=0.5.7->pyqubo) (1.7.0)\n","Requirement already satisfied: networkx>=3.0 in /usr/local/lib/python3.12/dist-packages (from dwave-samplers<2.0.0,>=1.0.0->dwave-neal>=0.5.7->pyqubo) (3.6.1)\n"]}]},{"cell_type":"code","source":["import numpy as np"],"metadata":{"id":"qNor_vi1TDcp"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["import openjij as oj"],"metadata":{"id":"48rYrxfmTRip"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["import matplotlib.pyplot as plt"],"metadata":{"id":"0ajpdRIYlk20"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["from pyqubo import Array"],"metadata":{"id":"T54EGkSQfDMJ"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["## Define the problem"],"metadata":{"id":"VPd-4sQ184zY"}},{"cell_type":"markdown","source":["Number Partitioning Problem is defined as below:\n","\n","---\n","Given a list of positive integers: $$A = [a_1, a_2, \\dots, a_N].$$\n","Find a partition into two sets such that the difference between the sums of the numbers in each set is minimized.\n","\n","---"],"metadata":{"id":"kDs8uPp-87s7"}},{"cell_type":"code","source":["N = 15 #problem size"],"metadata":{"id":"LRYp04278Zuc"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["a_low = 1 #minimum integer of the problem\n","a_high = N #maximum integer of the problem\n","A = np.random.randint(low=a_low, high=a_high, size=N)\n","A_sum = np.sum(A)"],"metadata":{"id":"oJdnRfH6AZU5"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["print(f\"{A=}\")\n","print(f\"{A_sum=}\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"KG6-jGHKcdAV","executionInfo":{"status":"ok","timestamp":1771334373748,"user_tz":-540,"elapsed":5,"user":{"displayName":"沖澤孝之介","userId":"02718127576258174876"}},"outputId":"4220ad04-a20a-485e-aff7-e3d0af3bed1d"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["A=array([ 5, 14, 13, 3, 3, 11, 4, 2, 2, 14, 12, 11, 3, 1, 14])\n","A_sum=np.int64(112)\n"]}]},{"cell_type":"markdown","source":["## Formulate"],"metadata":{"id":"jPCPoWZE8mA7"}},{"cell_type":"markdown","source":["To formulate combinatorial optimization problems, we first need to clarify what we want to know.\n","\n","We should split $A$ into $group_1$ and $group_2$ and we want to know the optimum partition.\n","\n","So, we introduce $\\vec{x}=(x_1,\\dots, x_N)$ as\n","$$\n","x_i = \\begin{cases}\n"," 1 & (a_i\\text{ is selected for group 1}) \\\\\n"," 0 & (a_i\\text{ is selected for group 2}).\n"," \\end{cases}\n","$$\n","\n","$$group_1 \\subset \\left\\{1, \\dots, N\\right\\}, group_2 = \\left\\{1, \\dots, N\\right\\} - group_1$$\n","\n","\n","Next, we determine the objective of the optimization.\n","Specifically, it's helpful to consider what you want to maximize or minimize.\n","\n","This problem want to minimize the difference between the sums of the numbers in each set.\n","\n","Therefore, objective function can be defined as\n","\n","$${\\text{min}} \\,\\,\\,\\lvert \\sum_{i \\in C } a_i - \\sum_{i \\notin group_1 } a_i \\rvert.$$\n","\n","Expressing the above equation in terms of $\\vec{x}$, the desired $\\vec{x}^*$ is as follows:\n","\n","\\begin{align}\n","\\vec{x}^*\n","&=\\underset{\\vec{x}}{\\text{argmin}} \\,\\,\\,\\lvert \\sum_{i=1}^N a_ix_i - \\sum_{i=1}^N a_i(1-x_i) \\rvert \\\\\n","&=\\underset{\\vec{x}}{\\text{argmin}} \\,\\,\\,(\\sum_{i=1}^N a_ix_i - \\sum_{i=1}^N a_i(1-x_i) )^2\n","\\end{align}\n","\n","Once you've gotten this far, all that's left is to convert it into a form that can be solved using SA. You can easily do this by referring to our sample code or asking ChatGPT.\n","\n","This time, we shall convert to QUBO format using the pyqubo library."],"metadata":{"id":"BnLnXrzTgl7_"}},{"cell_type":"code","source":["# variable values\n","x = Array.create('',shape=N, vartype='BINARY')\n","\n","# objective function\n","H = (sum(A[i]*x[i] for i in range (N)) - sum(A[i]*(1-x[i]) for i in range (N)))**2\n","\n","# compile to a model\n","model = H.compile()\n","qubo_dict, offset = model.to_qubo()"],"metadata":{"id":"DevENDdle7JV"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["print(qubo_dict)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"dvW8AwMVuxJy","executionInfo":{"status":"ok","timestamp":1771334454552,"user_tz":-540,"elapsed":15,"user":{"displayName":"沖澤孝之介","userId":"02718127576258174876"}},"outputId":"55917825-9973-4a0f-a9dd-9a11517b8f60"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["{('[10]', '[2]'): 1248.0, ('[9]', '[1]'): 1568.0, ('[9]', '[7]'): 224.0, ('[7]', '[4]'): 48.0, ('[10]', '[6]'): 384.0, ('[8]', '[2]'): 208.0, ('[10]', '[4]'): 288.0, ('[10]', '[9]'): 1344.0, ('[7]', '[0]'): 80.0, ('[0]', '[0]'): -2140.0, ('[10]', '[10]'): -4800.0, ('[8]', '[5]'): 176.0, ('[8]', '[8]'): -880.0, ('[13]', '[5]'): 88.0, ('[1]', '[0]'): 560.0, ('[13]', '[3]'): 24.0, ('[8]', '[3]'): 48.0, ('[13]', '[6]'): 32.0, ('[14]', '[2]'): 1456.0, ('[13]', '[11]'): 88.0, ('[5]', '[0]'): 440.0, ('[9]', '[6]'): 448.0, ('[11]', '[0]'): 440.0, ('[9]', '[8]'): 224.0, ('[5]', '[1]'): 1232.0, ('[11]', '[8]'): 176.0, ('[13]', '[10]'): 96.0, ('[13]', '[9]'): 112.0, ('[8]', '[1]'): 224.0, ('[10]', '[7]'): 192.0, ('[13]', '[13]'): -444.0, ('[11]', '[7]'): 176.0, ('[12]', '[5]'): 264.0, ('[11]', '[3]'): 264.0, ('[5]', '[3]'): 264.0, ('[14]', '[12]'): 336.0, ('[12]', '[9]'): 336.0, ('[12]', '[12]'): -1308.0, ('[12]', '[11]'): 264.0, ('[4]', '[3]'): 72.0, ('[7]', '[5]'): 176.0, ('[7]', '[2]'): 208.0, ('[7]', '[1]'): 224.0, ('[3]', '[2]'): 312.0, ('[7]', '[3]'): 48.0, ('[4]', '[2]'): 312.0, ('[9]', '[9]'): -5488.0, ('[14]', '[3]'): 336.0, ('[2]', '[1]'): 1456.0, ('[12]', '[4]'): 72.0, ('[9]', '[5]'): 1232.0, ('[14]', '[9]'): 1568.0, ('[6]', '[0]'): 160.0, ('[14]', '[4]'): 336.0, ('[13]', '[0]'): 40.0, ('[4]', '[4]'): -1308.0, ('[14]', '[11]'): 1232.0, ('[10]', '[8]'): 192.0, ('[12]', '[2]'): 312.0, ('[5]', '[4]'): 264.0, ('[4]', '[1]'): 336.0, ('[14]', '[10]'): 1344.0, ('[9]', '[3]'): 336.0, ('[3]', '[0]'): 120.0, ('[8]', '[6]'): 64.0, ('[4]', '[0]'): 120.0, ('[8]', '[7]'): 32.0, ('[14]', '[13]'): 112.0, ('[14]', '[0]'): 560.0, ('[6]', '[5]'): 352.0, ('[12]', '[1]'): 336.0, ('[11]', '[1]'): 1232.0, ('[12]', '[7]'): 48.0, ('[13]', '[7]'): 16.0, ('[5]', '[2]'): 1144.0, ('[6]', '[3]'): 96.0, ('[6]', '[6]'): -1728.0, ('[14]', '[1]'): 1568.0, ('[3]', '[1]'): 336.0, ('[11]', '[2]'): 1144.0, ('[12]', '[10]'): 288.0, ('[5]', '[5]'): -4444.0, ('[6]', '[4]'): 96.0, ('[11]', '[11]'): -4444.0, ('[12]', '[0]'): 120.0, ('[11]', '[10]'): 1056.0, ('[12]', '[8]'): 48.0, ('[9]', '[0]'): 560.0, ('[9]', '[4]'): 336.0, ('[11]', '[6]'): 352.0, ('[13]', '[1]'): 112.0, ('[14]', '[7]'): 224.0, ('[7]', '[7]'): -880.0, ('[9]', '[2]'): 1456.0, ('[11]', '[9]'): 1232.0, ('[13]', '[12]'): 24.0, ('[6]', '[1]'): 448.0, ('[12]', '[6]'): 96.0, ('[8]', '[4]'): 48.0, ('[1]', '[1]'): -5488.0, ('[8]', '[0]'): 80.0, ('[10]', '[3]'): 288.0, ('[13]', '[8]'): 16.0, ('[14]', '[8]'): 224.0, ('[3]', '[3]'): -1308.0, ('[6]', '[2]'): 416.0, ('[13]', '[2]'): 104.0, ('[11]', '[4]'): 264.0, ('[10]', '[0]'): 480.0, ('[12]', '[3]'): 72.0, ('[10]', '[5]'): 1056.0, ('[10]', '[1]'): 1344.0, ('[14]', '[6]'): 448.0, ('[2]', '[2]'): -5148.0, ('[2]', '[0]'): 520.0, ('[7]', '[6]'): 64.0, ('[11]', '[5]'): 968.0, ('[14]', '[5]'): 1232.0, ('[13]', '[4]'): 24.0, ('[14]', '[14]'): -5488.0}\n"]}]},{"cell_type":"code","source":["import re\n","# Show QUBO heatmap\n","QUBO = np.zeros((N,N))\n","for (x_i,x_j) in qubo_dict.keys():\n"," i = int(re.findall(r'\\d+', x_i)[0])\n"," j = int(re.findall(r'\\d+', x_j)[0])\n"," QUBO[i][j] = qubo_dict[(x_i,x_j)]\n","\n","plt.imshow(QUBO)\n","plt.colorbar()\n","plt.title('pyqubo matrix')\n","plt.show()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":452},"id":"B0YjJaUpmIm6","executionInfo":{"status":"ok","timestamp":1771334456626,"user_tz":-540,"elapsed":210,"user":{"displayName":"沖澤孝之介","userId":"02718127576258174876"}},"outputId":"408841cc-4464-4b3d-f938-71b7efa253eb"},"execution_count":null,"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"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\n"},"metadata":{}}]},{"cell_type":"markdown","source":["## (Extra:do not have to do it)Convert to QUBO format"],"metadata":{"id":"lgM1uggymClq"}},{"cell_type":"markdown","source":["Calculate the objective function as follows:\n","\n","\\begin{align}\n","\\vec{x}^*\n","&=\\underset{\\vec{x}}{\\text{argmin}} \\,\\,\\,\\lvert \\sum_{i=1}^N a_ix_i - \\sum_{i=1}^N a_i(1-x_i) \\rvert \\\\\n","&=\\underset{\\vec{x}}{\\text{argmin}} \\,\\,\\,(\\sum_{i=1}^N a_ix_i - \\sum_{i=1}^N a_i(1-x_i) )^2 \\\\\n","&=\\underset{\\vec{x}}{\\text{argmin}} \\,\\,\\,(2\\sum_{i=1}^N a_ix_i - \\sum_{i=1}^N a_i)^2 \\\\\n","&=\\underset{\\vec{x}}{\\text{argmin}} \\,\\,\\,(4(\\sum_{i=1}^N a_ix_i)^2 - 4\\sum_{i=1}^N\\sum_{j=1}^N a_ia_jx_i+(\\sum_{i=1}^N a_i)^2) \\\\\n","&=\\underset{\\vec{x}}{\\text{argmin}} \\,\\,\\,(4\\sum_{i=1}^N \\sum_{j=1}^N a_ia_jx_ix_j - 4\\sum_{i=1}^N a_i (\\sum_{j=1}^N a_j)x_i)\n","\\end{align}\n","\n","Therefore, QUBO can be constructed."],"metadata":{"id":"9zppgpzQNJk2"}},{"cell_type":"code","source":["QUBO = np.zeros((N,N))\n","\n","for i in range(N):\n"," for j in range(N):\n"," QUBO[i][j] = 4*A[i]*A[j]\n"," if i==j:\n"," QUBO[i][j] -= 4*A[i]*A_sum"],"metadata":{"id":"oW3OCJhPBBtH"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["# Show QUBO heatmap\n","plt.imshow(QUBO)\n","plt.colorbar()\n","plt.title('QUBO matrix')\n","plt.show()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":452},"id":"r_7MDBuPuNF7","executionInfo":{"status":"ok","timestamp":1771334671096,"user_tz":-540,"elapsed":316,"user":{"displayName":"沖澤孝之介","userId":"02718127576258174876"}},"outputId":"9fdf0161-2de7-412d-c83d-cc713961924c"},"execution_count":null,"outputs":[{"output_type":"display_data","data":{"text/plain":["
"],"image/png":"iVBORw0KGgoAAAANSUhEUgAAAgQAAAGzCAYAAABQJQ/GAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAQexJREFUeJzt3XtcVXW+//H3BuUiAeWNS6Ji49FUvKTloGV64kiOmcw8stQyNSfLg3kdb6l4LVLL0PRodqbUGU3rVNb4a1SGLGtETZExmzSdyJg8YJ1RtmJc3Hv9/jB27kQE91rAwtfz8VgP3Wt91/f7WWw2fPh+v+u7HIZhGAIAANc1v5oOAAAA1DwSAgAAQEIAAABICAAAgEgIAACASAgAAIBICAAAgEgIAACASAgAAIBICABUwOFwaO7cuTUdBoBqQEIA2/j888/1yCOP6Oabb1ZgYKCio6P1yCOP6O9///tlZefOnSuHw6Hvv/++3Lo6dOig3r17e15//fXXcjgcXltYWJg6d+6sFStWyOVyXVZHYWGhFixYoI4dO6pBgwYKDw/XXXfdpfXr16u2rQi+e/duzZ07V2fOnKnpUADUUvVqOgCgMt5++20NGTJEDRs21KhRoxQbG6uvv/5av//97/U///M/2rx5swYOHOhzO0OGDNGvfvUrSVJBQYHef/99PfXUUzpx4oSWLFniKZefn6977rlHX3zxhQYPHqyxY8eqqKhIb731loYPH673339fGzZskL+/v88xmWH37t2aN2+eRowYoRtvvLHS5/3www+qV48fE8B1wQBquePHjxsNGjQw2rZta5w6dcrr2HfffWe0bdvWuOGGG4yvvvrKs3/OnDmGJOO7774rt8727dsbd999t+d1Tk6OIclYsmSJVzm3223cfvvtRnR0tNf+xMREw8/Pz3j33Xcvq/t3v/udIcl47rnnqnqpllmyZIkhycjJyblqWZfLZfzwww/WBwWgVmHIALXekiVLdP78ea1Zs0ZNmjTxOta4cWO9/PLLOnfunNdf8GZxOByKiIjw+it5z5492r59u0aMGKH777//snNSU1PVunVrLVq0SD/88EOF9bds2VL33XefPvzwQ3Xr1k3BwcGKi4vThx9+KOliz0hcXJyCgoLUtWtXHTx40Ov8Q4cOacSIEWrVqpWCgoIUGRmpxx57TP/3f//nKTN37lxNmTJFkhQbG+sZEvn666891zh27Fht2LBB7du3V2BgoLZt2+Y5VjaH4IcfflDbtm3Vtm1br+v617/+paioKPXo0aPcoRUA9kBCgFrvT3/6k1q2bKm77rqr3OO9evVSy5Yt9ac//cnnts6fP6/vv/9e33//vb766iutXLlS27Zt0/Dhw73ikaRHH3203Drq1aunoUOH6vTp0/rrX/961TaPHz+uoUOHasCAAUpNTdXp06c1YMAAbdiwQRMnTtQjjzyiefPm6R//+IcefPBBud1uz7np6en66quvNHLkSL300ksaPHiwNm3apF/96leeeQy/+c1vNGTIEEnSiy++qD/84Q/6wx/+4JVcffDBB5o4caIeeughLVu2TC1btrwszuDgYK1bt07Hjx/XzJkzPfuTk5NVUFCgtWvX1pohEgDXoKa7KICKnDlzxpBkDBw4sMJy999/vyHJcDqdhmFc+5BBeduYMWMMt9vtKZuUlGRIMk6fPn3FeN5++21DkrF8+fIK427RooUhydi9e7dn3/bt2w1JRnBwsHHixAnP/pdfftmQZOzcudOz7/z585fV+frrrxuSjF27dnn2VTRkIMnw8/MzPv/883KPzZkzx2vfjBkzDD8/P2PXrl3Gm2++aUgy0tLSKrxOALUfs4VQq509e1aSFBoaWmG5suNnz569atmKjB49WoMGDZIkOZ1OffDBB1q1apUCAwP14osvVjqmsmNOp/OqbbZr107x8fGe1927d5ck/fu//7uaN29+2f6vvvrKc4dEcHCw53hRUZHOnTunX/7yl5KkrKysK/aq/Nzdd9+tdu3aVars3LlztXXrVg0fPlznzp3T3XffrXHjxlXqXAC1FwkBarVLf9FX5OzZs3I4HGrcuHGl63Y4HJfta926tRISEjyvf/Ob38jhcCgtLU2PPfaY4uLivGK60oz9yiYykrx+6UtSeHi4JCkmJqbc/adPn/bs+9e//qV58+Zp06ZNOnXqlFf5goKCq7ZdJjY2ttJlAwIC9Oqrr+r2229XUFCQXnvttXK/lgDshTkEqNXCw8MVHR2tQ4cOVVju0KFDatasmQICAiRJQUFBknTFSX3nz5/3lLmae+65R5K0a9cuSdKtt97qabOieCRV6q/uK427X2m/cckaBw8++KBeeeUVPfnkk3r77be1Y8cOz4TAS+caXM2lPQ2VsX37dkkXeyWOHTtWpXMB1E4kBKj1BgwYoJycHH3yySflHv/444/19ddfe7r6JalFixaSpKNHj15W/vz588rNzfWUuZoLFy5Iks6dOydJuu+++yRJ69evL7e8y+XSxo0bddNNN6lnz56VauNanD59WhkZGZo+fbrmzZunX//61/qP//gPtWrV6rKyZv4Ff+jQIc2fP18jR45Uly5d9Nvf/rZKvREAaicSAtR6v/vd79SgQQM98cQTXrfTSRe7zJ988kmFhYVp7Nixnv333HOPAgICtGrVqsv+Ul6zZo0uXLigfv36Var9srsKOnXqJEnq0aOHEhIS9Nprr2nr1q2XlZ85c6a+/PJLTZ06tcp/eVdFWQ+C8bNVEdPS0i4rGxISIkk+r1RYWlqqESNGKDo6WsuWLdPatWuVn5+viRMn+lQvgJrHHALUer/4xS+0fv16DRkyRHFxcZetVHj69Glt2rTJaxy8adOmSklJ0axZs9SrVy/df//9atCggXbv3q3XX39dffv21YABAy5rKysrS3/84x8lXZwHkJGRobfeeks9evRQ3759PeXWr1+ve+65RwMHDtTQoUN11113qbi4WG+//bY+/PBDPfTQQ557/60SFhamXr16afHixSotLdXNN9+sHTt2KCcn57KyXbt2lXQxWRk8eLDq16+vAQMGeBKFylq4cKGys7OVkZGh0NBQdezY0fN1fuCBBzyrPAKwoZq+zQGorM8++8wYOnSoERkZafj5+RmSjKCgoHJvlyvzxz/+0fjlL39phISEGIGBgUbbtm2NefPmGUVFRV7lyrvtsF69ekarVq2MKVOmGGfPnr2s7rNnzxpz58412rdvbwQHBxuhoaFGz549jbVr13rdpliRFi1aGP37979svyQjOTm53BgvXU3xn//8p/HrX//auPHGG43w8HBj0KBBxsmTJ8u9XXDBggXGzTff7Pnald2CWF5bl8ZRVs+BAweMevXqGU899ZRXmQsXLnhWc6zoVkwAtZvDMGrZU1iASlq/fr1GjBihRx555Irj+QCAymHIALb16KOP6n//9381ffp0NWvWTM8++2xNhwQAtkUPAQAA4C4DAABAQgAAAERCAAAAREIAAABUC+8ycLvdOnnypEJDQ3lgCgDYkGEYOnv2rKKjo+XnZ93fnUVFRSopKfG5noCAgEo/26Quq3UJwcmTJy97yhsAwH5y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w54yixcv1vLly7V69Wrt3btXISEhSkxMVFFRUZViNn0OQVRUlNq1a+e179Zbb9Vbb71VbvnAwEAFBtr/Mb4AAJS59957de+993pet2rVSkePHtWqVav0/PPPS5I2bNigkpISvfrqqwoICFD79u2VnZ2tpUuXavTo0ZKkZcuW6d5779WUKVMkSQsWLFB6erpWrFih1atXyzAMpaWladasWRo4cKAkaf369YqIiNCWLVs0ePDgSsdseg9Bz549dfToUa99X375pVq0aGF2UwCA613Z44992aTL5rIVFxebHmpBQYEaNmzoeZ2ZmalevXopICDAsy8xMVFHjx7V6dOnPWUSEhK86klMTFRmZqYkKScnR3l5eV5lwsPD1b17d0+ZyjI9IZg4caL27NmjZ599VsePH9fGjRu1Zs0aJScnm90UAOA6V/a0Q182SYqJifGaz5aammpqnMePH9dLL72kJ554wrMvLy9PERERXuXKXufl5VVY5tLjl55XXpnKMj0huP322/XOO+/o9ddfV4cOHbRgwQKlpaXp4YcfNrspAABMkZub6zWfbcaMGeWWmz59uhwOR4XbkSNHvM759ttvde+992rQoEF6/PHHq+NyroklzzK47777dN9991lRNQAAPzFpYaKwsDCFhYVdtfjkyZM1YsSICsu0atXK8/+TJ0+qT58+6tGjh9dkQUmKjIxUfn6+176y15GRkRWWufR42b6oqCivMp07d77q9VyKhxsBAOzrknkA13x+FTRp0kRNmjSpVNlvv/1Wffr0UdeuXfXaa6/Jz8+7Uz4+Pl4zZ85UaWmp6tevL0lKT09XmzZtPKv7xsfHKyMjQxMmTPCcl56ervj4eEkXF/6LjIxURkaGJwFwOp3au3evxowZU6Vr4+FGAACY7Ntvv1Xv3r3VvHlzPf/88/ruu++Ul5fnNa4/dOhQBQQEaNSoUfr888+1efNmLVu2TJMmTfKUGT9+vLZt26YXXnhBR44c0dy5c7V//36NHTtWkuRwODRhwgQtXLhQ7733nj777DM9+uijio6OVlJSUpVipocAAGBbDuPi5sv5VkhPT9fx48d1/PhxNWvWzOuY8eNMxvDwcO3YsUPJycnq2rWrGjdurJSUFM8th5LUo0cPbdy4UbNmzdLTTz+t1q1ba8uWLerQoYOnzNSpU1VYWKjRo0frzJkzuvPOO7Vt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\n"},"metadata":{}}]},{"cell_type":"markdown","source":["## Solve the problem with SA"],"metadata":{"id":"Lr9wjCOr8vzU"}},{"cell_type":"code","source":["# Conduct Simulated Annealing\n","num_reads = 300\n","num_sweeps = 1000\n","sampler = oj.SASampler()\n","sampleset = sampler.sample_qubo(QUBO, num_reads=num_reads, num_sweeps=num_sweeps)"],"metadata":{"id":"PZ3CfPVLltGx"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["print(sampleset.first.sample)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"m_XLcK0nu71R","executionInfo":{"status":"ok","timestamp":1771334678635,"user_tz":-540,"elapsed":9,"user":{"displayName":"沖澤孝之介","userId":"02718127576258174876"}},"outputId":"9407f94d-0735-4d1c-c2e1-d562e381c7dc"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["{0: np.int8(0), 1: np.int8(1), 2: np.int8(0), 3: np.int8(0), 4: np.int8(1), 5: np.int8(0), 6: np.int8(0), 7: np.int8(1), 8: np.int8(0), 9: np.int8(0), 10: np.int8(1), 11: np.int8(1), 12: np.int8(0), 13: np.int8(0), 14: np.int8(1)}\n"]}]},{"cell_type":"code","source":["# Obtain the solution of minimum objective value\n","x_star = np.array([sampleset.first.sample[i] for i in range(N)])"],"metadata":{"id":"S7QUt-9jt3Ji"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["Finally, let's check the results."],"metadata":{"id":"x8Az5gnFMjwy"}},{"cell_type":"code","source":["# See the result\n","print(f\"{x_star=}\")\n","print(f\"A : {A}\")\n","print(f\"A_sum : {A_sum.item()}\")\n","print(f\"group_1 sum : {np.sum(A @ x_star)}\")\n","print(f\"group_2 sum : {np.sum(A @ (1-x_star))}\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"pY_U-tJ1wjLp","executionInfo":{"status":"ok","timestamp":1771334680846,"user_tz":-540,"elapsed":8,"user":{"displayName":"沖澤孝之介","userId":"02718127576258174876"}},"outputId":"1e7aaf8e-8cc6-4378-e138-b7364baccc33"},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["x_star=array([0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1], dtype=int8)\n","A : [ 5 14 13 3 3 11 4 2 2 14 12 11 3 1 14]\n","A_sum : 112\n","group_1 sum : 56\n","group_2 sum : 56\n"]}]},{"cell_type":"code","source":[],"metadata":{"id":"URnsFJJjywd_"},"execution_count":null,"outputs":[]}]}