{
 "nbformat": 4,
 "nbformat_minor": 5,
 "metadata": {
  "colab": {
   "provenance": []
  },
  "kernelspec": {
   "name": "python3",
   "display_name": "Python 3"
  },
  "language_info": {
   "name": "python"
  }
 },
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "title"
   },
   "source": "# 🏭 MRP / Sonlu Çizelgeleme – D-Wave & Alternatifler\n## IBM Gate QC Yerine Quantum Annealing (Hızlı Yol)\n\n**Problem:** IBM gerçek QC’de QAOA job’ları kuyruk + çok iterasyon yüzünden saatlerce bekleyebiliyor / bitmiyor.\n\n**Bu notebook’un yaklaşımı:**\n1. Aynı üretim senaryosu (iş emirleri / makine atama)\n2. Problemi **QUBO / Ising** olarak kur\n3. **Yerel simulated annealing** (`neal`) → saniyeler içinde sonuç\n4. Opsiyonel **D-Wave Leap** cloud sampler (API token ile)\n5. Photonic / gate-model notları (neden şimdilik ikincil)\n\n| Platform | Tip | MRP/QUBO için | Colab’da |\n|----------|-----|---------------|----------|\n| IBM Quantum | Gate (QAOA) | Mümkün ama yavaş / kuyruk | Zor (bekleme) |\n| **D-Wave** | Quantum Annealing | **QUBO için doğal** | Token ile veya yerel `neal` |\n| Photonic | Gate / Gaussian | Araştırma; genel QUBO zayıf | Çoğunlukla simülasyon |\n",
   "id": "title"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "s1"
   },
   "source": "## 1. Kurulum\n",
   "id": "s1"
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "id": "setup",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1786331792546,
     "user_tz": -180,
     "elapsed": 13147,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "e80b87fe-216b-4027-e0d2-b715bf3ec0d9"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Python: 3.12.13\n",
      "✅ Kurulum tamam.\n"
     ]
    }
   ],
   "source": "import sys\nprint(f\"Python: {sys.version.split()[0]}\")\n\n!pip install -q --upgrade pip\n!pip install -q dimod dwave-neal numpy pandas matplotlib\n# D-Wave cloud (opsiyonel – token yoksa atlanır)\n!pip install -q dwave-ocean-sdk || true\n\nprint(\"✅ Kurulum tamam.\")\n",
   "id": "setup"
  },
  {
   "cell_type": "code",
   "source": "from neal import SimulatedAnnealingSampler",
   "metadata": {
    "id": "qKY6QvuurDLO",
    "executionInfo": {
     "status": "ok",
     "timestamp": 1786331807255,
     "user_tz": -180,
     "elapsed": 68,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    }
   },
   "id": "qKY6QvuurDLO",
   "execution_count": 4,
   "outputs": []
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "id": "imports",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1786331812715,
     "user_tz": -180,
     "elapsed": 13,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "5749b345-3d20-41f6-f1e1-5bdcbc2cfbf9"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "✅ dimod + neal hazır (yerel annealing).\n"
     ]
    }
   ],
   "source": "import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as mpatches\nfrom itertools import product\nimport dimod\nfrom neal import SimulatedAnnealingSampler\n\nprint(\"✅ dimod + neal hazır (yerel annealing).\")\n",
   "id": "imports"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "s2"
   },
   "source": "## 2. Neden IBM’de Takılıyor, D-Wave Daha Uygun?\n\n### Gate model (IBM + QAOA)\n- Her optimizasyon adımı = yeni circuit job\n- COBYLA 30–50 iterasyon → 30–50 kuyruk beklemesi\n- Transpile + gürültü + az shot → kalite düşük, süre uzun\n\n### Quantum Annealing (D-Wave)\n- Problem **doğrudan QUBO** olarak gömülür\n- Tek (veya az) anneal çağrısı → binlerce sample\n- Çizelgeleme / atama / MRP alt problemleri literatürde annealing ile sık denenir\n\n### Photonic\n- Sürekli değişken / Gaussian boson sampling güçlü alanlar\n- Genel amaçlı endüstriyel QUBO için henüz IBM/D-Wave kadar pratik değil\n- Eğitimde PennyLane photonic simülatörü mümkün; gerçek donanım erişimi sınırlı\n",
   "id": "s2"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "s3"
   },
   "source": "## 3. Üretim Senaryosu (MRP çıktısı → iş emirleri)\n\nKüçük ama anlamlı örnek: 3 job, 3 makine – önce **makine atama + yük dengeleme** QUBO’su\n(tam time-indexed JSS çok değişken üretir; annealing’de de embedding şişer).\n",
   "id": "s3"
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "id": "scenario",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 159
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1786331821248,
     "user_tz": -180,
     "elapsed": 59,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "0c029e17-de18-454d-e554-88ea0e8e0438"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "İşlem süreleri (saat):\n"
     ]
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "  M1 M2 M3\n",
       "A  2  3  4\n",
       "B  3  2  3\n",
       "C  4  3  2"
      ],
      "text/html": [
       "\n",
       "  <div id=\"df-8bd5ee49-e6da-4a4f-97e1-cbb7c9c91eca\" class=\"colab-df-container\">\n",
       "    <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>M1</th>\n",
       "      <th>M2</th>\n",
       "      <th>M3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>A</th>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>B</th>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>C</th>\n",
       "      <td>4</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "    <div class=\"colab-df-buttons\">\n",
       "\n",
       "  <div class=\"colab-df-container\">\n",
       "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-8bd5ee49-e6da-4a4f-97e1-cbb7c9c91eca')\"\n",
       "            title=\"Convert this dataframe to an interactive table.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
       "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "\n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    .colab-df-buttons div {\n",
       "      margin-bottom: 4px;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "    <script>\n",
       "      const buttonEl =\n",
       "        document.querySelector('#df-8bd5ee49-e6da-4a4f-97e1-cbb7c9c91eca button.colab-df-convert');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      async function convertToInteractive(key) {\n",
       "        const element = document.querySelector('#df-8bd5ee49-e6da-4a4f-97e1-cbb7c9c91eca');\n",
       "        const dataTable =\n",
       "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                    [key], {});\n",
       "        if (!dataTable) return;\n",
       "\n",
       "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "          + ' to learn more about interactive tables.';\n",
       "        element.innerHTML = '';\n",
       "        dataTable['output_type'] = 'display_data';\n",
       "        await google.colab.output.renderOutput(dataTable, element);\n",
       "        const docLink = document.createElement('div');\n",
       "        docLink.innerHTML = docLinkHtml;\n",
       "        element.appendChild(docLink);\n",
       "      }\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "\n",
       "  <div id=\"id_ecb9328e-5e17-4208-8dba-86c648779fc9\">\n",
       "    <style>\n",
       "      .colab-df-generate {\n",
       "        background-color: #E8F0FE;\n",
       "        border: none;\n",
       "        border-radius: 50%;\n",
       "        cursor: pointer;\n",
       "        display: none;\n",
       "        fill: #1967D2;\n",
       "        height: 32px;\n",
       "        padding: 0 0 0 0;\n",
       "        width: 32px;\n",
       "      }\n",
       "\n",
       "      .colab-df-generate:hover {\n",
       "        background-color: #E2EBFA;\n",
       "        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "        fill: #174EA6;\n",
       "      }\n",
       "\n",
       "      [theme=dark] .colab-df-generate {\n",
       "        background-color: #3B4455;\n",
       "        fill: #D2E3FC;\n",
       "      }\n",
       "\n",
       "      [theme=dark] .colab-df-generate:hover {\n",
       "        background-color: #434B5C;\n",
       "        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "        fill: #FFFFFF;\n",
       "      }\n",
       "    </style>\n",
       "    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('df_pt')\"\n",
       "            title=\"Generate code using this dataframe.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
       "       width=\"24px\">\n",
       "    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "    <script>\n",
       "      (() => {\n",
       "      const buttonEl =\n",
       "        document.querySelector('#id_ecb9328e-5e17-4208-8dba-86c648779fc9 button.colab-df-generate');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      buttonEl.onclick = () => {\n",
       "        google.colab.notebook.generateWithVariable('df_pt');\n",
       "      }\n",
       "      })();\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "    </div>\n",
       "  </div>\n"
      ],
      "application/vnd.google.colaboratory.intrinsic+json": {
       "type": "dataframe",
       "variable_name": "df_pt",
       "summary": "{\n  \"name\": \"df_pt\",\n  \"rows\": 3,\n  \"fields\": [\n    {\n      \"column\": \"M1\",\n      \"properties\": {\n        \"dtype\": \"date\",\n        \"min\": 2,\n        \"max\": 4,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          2,\n          3,\n          4\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"M2\",\n      \"properties\": {\n        \"dtype\": \"date\",\n        \"min\": 2,\n        \"max\": 3,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          2,\n          3\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"M3\",\n      \"properties\": {\n        \"dtype\": \"date\",\n        \"min\": 2,\n        \"max\": 4,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          4,\n          3\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
      }
     },
     "metadata": {}
    }
   ],
   "source": "# Job -> makine süreleri (satır: job, sütun: makine)\n# None = o makinede yapılamaz\njobs = [\"A\", \"B\", \"C\"]\nmachines = [\"M1\", \"M2\", \"M3\"]\n\n# Süre matrisi (saat)\nptime = {\n    (\"A\", \"M1\"): 2, (\"A\", \"M2\"): 3, (\"A\", \"M3\"): 4,\n    (\"B\", \"M1\"): 3, (\"B\", \"M2\"): 2, (\"B\", \"M3\"): 3,\n    (\"C\", \"M1\"): 4, (\"C\", \"M2\"): 3, (\"C\", \"M3\"): 2,\n}\n\nprint(\"İşlem süreleri (saat):\")\ndf_pt = pd.DataFrame(index=jobs, columns=machines)\nfor (j, m), t in ptime.items():\n    df_pt.loc[j, m] = t\ndisplay(df_pt)\n\n# Her job tam 1 makineye atanacak; amaç: makine yüklerini dengele + toplam süre\n",
   "id": "scenario"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "s4"
   },
   "source": "## 4. QUBO Formülasyonu (dimod)\n\n**Değişken:** $x_{j,m} \\in \\{0,1\\}$ → job $j$ makine $m$’de.\n\n**Kısıt:** Her job tam bir makine → $\\sum_m x_{j,m} = 1$\n\n**Amaç (basit):**\n- Toplam işlem süresi\n- Makine yük kareleri (dengesizlik cezası)\n\nBu, sonlu kapasiteye giden **atama katmanı**; tam Gantt için sonuç üzerine liste çizelgeleme uygulanır.\n",
   "id": "s4"
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "id": "bqm",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1786331825953,
     "user_tz": -180,
     "elapsed": 51,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "54f0bcf9-9081-4a67-c399-386887d2302d"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Değişken sayısı: 9\n",
      "Etkileşim (quadratic) sayısı: 18\n",
      "Örnek lineer terimler: {'x_A_M1': np.float64(-16.0), 'x_A_M2': np.float64(-12.5), 'x_A_M3': np.float64(-8.0), 'x_B_M1': np.float64(-12.5), 'x_B_M2': np.float64(-16.0)}\n"
     ]
    }
   ],
   "source": "def build_assignment_bqm(jobs, machines, ptime, lagrange=10.0, balance=1.0):\n    \"\"\"Binary Quadratic Model – makine atama.\"\"\"\n    bqm = dimod.BinaryQuadraticModel(dimod.BINARY)\n\n    # Değişken isimleri\n    def v(j, m):\n        return f\"x_{j}_{m}\"\n\n    # Amaç: süre + yük dengesi (yük = sum_j ptime * x_jm)\n    # balance * sum_m load_m^2  +  sum ptime * x\n    # load_m^2 = sum_j sum_k p_jm p_km x_jm x_km\n    for j, m in product(jobs, machines):\n        t = ptime[(j, m)]\n        bqm.add_variable(v(j, m), t)  # lineer süre\n\n    for m in machines:\n        for j1, j2 in product(jobs, jobs):\n            t1, t2 = ptime[(j1, m)], ptime[(j2, m)]\n            if j1 == j2:\n                # x^2 = x for binary → lineere ek\n                bqm.add_variable(v(j1, m), balance * t1 * t2)\n            else:\n                bqm.add_interaction(v(j1, m), v(j2, m), balance * t1 * t2)\n\n    # Kısıt: her job tam 1 makine (ceza yöntemi)\n    # (sum_m x_jm - 1)^2 = sum_m x + 2 sum_{m<m'} x_m x_m' - 2 sum x + 1\n    for j in jobs:\n        vars_j = [v(j, m) for m in machines]\n        # (sum x - 1)^2\n        for m in machines:\n            bqm.add_variable(v(j, m), lagrange * (1 - 2))  # x terimi: +1 -2 from expand\n        # düzeltme: (sum x_i - 1)^2 = sum x_i^2 + 2 sum i<k x_i x_k - 2 sum x_i + 1\n        # x_i^2 = x_i → lineer katsayı: lagrange*(1-2)= -lagrange, sabit +lagrange\n        # Yeniden net yazalım:\n    # BQM'i sıfırdan temiz kur\n    bqm = dimod.BinaryQuadraticModel(dimod.BINARY)\n\n    for j, m in product(jobs, machines):\n        bqm.add_variable(v(j, m), 0.0)\n\n    # Süre\n    for j, m in product(jobs, machines):\n        bqm.add_linear(v(j, m), float(ptime[(j, m)]))\n\n    # Yük dengesi: balance * sum_m (sum_j t_jm x_jm)^2\n    for m in machines:\n        for j1 in jobs:\n            for j2 in jobs:\n                coef = balance * ptime[(j1, m)] * ptime[(j2, m)]\n                if j1 == j2:\n                    bqm.add_linear(v(j1, m), coef)\n                elif j1 < j2:\n                    bqm.add_quadratic(v(j1, m), v(j2, m), 2 * coef)\n\n    # Her job tam 1 makine: lagrange * (sum_m x_jm - 1)^2\n    for j in jobs:\n        for m in machines:\n            bqm.add_linear(v(j, m), lagrange * (1 - 2))\n        for i, m1 in enumerate(machines):\n            for m2 in machines[i+1:]:\n                bqm.add_quadratic(v(j, m1), v(j, m2), 2 * lagrange)\n        bqm.offset += lagrange  # (+1)^2 sabiti\n\n    return bqm\n\nbqm = build_assignment_bqm(jobs, machines, ptime, lagrange=20.0, balance=0.5)\nprint(f\"Değişken sayısı: {len(bqm.variables)}\")\nprint(f\"Etkileşim (quadratic) sayısı: {len(bqm.quadratic)}\")\nprint(\"Örnek lineer terimler:\", dict(list(bqm.linear.items())[:5]))\n",
   "id": "bqm"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "s5"
   },
   "source": "## 5. Yerel Çözüm: Simulated Annealing (`neal`)\n\nToken gerekmez, saniyeler sürer, eğitim ve pipeline doğrulama için idealdir.\nD-Wave donanımına giden **aynı BQM** kullanılır.\n",
   "id": "s5"
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "id": "neal_solve",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1786331831683,
     "user_tz": -180,
     "elapsed": 92,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "e18e5ac9-33c8-4367-caaf-c518a7898ada"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "=== Yerel Simulated Annealing ===\n",
      "  x_A_M1 x_A_M2 x_A_M3 x_B_M1 x_B_M2 x_B_M3 x_C_M1 x_C_M2 x_C_M3 energy num_oc.\n",
      "0      1      0      0      0      1      0      0      0      1   12.0       1\n",
      "1      1      0      0      0      1      0      0      0      1   12.0       1\n",
      "2      1      0      0      0      1      0      0      0      1   12.0       1\n",
      "3      1      0      0      0      1      0      0      0      1   12.0       1\n",
      "4      1      0      0      0      1      0      0      0      1   12.0       1\n",
      "['BINARY', 5 rows, 5 samples, 9 variables]\n",
      "\n",
      "En iyi enerji: 12.0000\n",
      "Atama:\n",
      "  Job A → M1 (süre 2 h)\n",
      "  Job B → M2 (süre 2 h)\n",
      "  Job C → M3 (süre 2 h)\n",
      "Makine yükleri: {'M1': 2, 'M2': 2, 'M3': 2}\n",
      "Makespan (atama alt sınırı / paralel yük max): 2\n"
     ]
    }
   ],
   "source": "sampler_local = SimulatedAnnealingSampler()\nsampleset = sampler_local.sample(bqm, num_reads=200, seed=42)\n\nprint(\"=== Yerel Simulated Annealing ===\")\nprint(sampleset.truncate(5))\n\nbest = sampleset.first\nprint(f\"\\nEn iyi enerji: {best.energy:.4f}\")\nprint(\"Atama:\")\nassignment = {}\nfor j in jobs:\n    for m in machines:\n        key = f\"x_{j}_{m}\"\n        if best.sample.get(key, 0) == 1:\n            assignment[j] = m\n            print(f\"  Job {j} → {m} (süre {ptime[(j, m)]} h)\")\n\n# Makine yükleri\nloads = {m: 0 for m in machines}\nfor j, m in assignment.items():\n    loads[m] += ptime[(j, m)]\nprint(\"Makine yükleri:\", loads)\nprint(\"Makespan (atama alt sınırı / paralel yük max):\", max(loads.values()) if loads else None)\n",
   "id": "neal_solve"
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "id": "gantt",
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 516
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1786331838399,
     "user_tz": -180,
     "elapsed": 417,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "c7594def-ee8d-4921-cb01-e11ed84c302e"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "=== Liste çizelge (SPT on machines) ===\n"
     ]
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "  job machine  start  duration  end\n",
       "0   A      M1      0         2    2\n",
       "1   B      M2      0         2    2\n",
       "2   C      M3      0         2    2"
      ],
      "text/html": [
       "\n",
       "  <div id=\"df-388d85d7-f65d-4ff0-a0d5-568c5d20ee50\" class=\"colab-df-container\">\n",
       "    <div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>job</th>\n",
       "      <th>machine</th>\n",
       "      <th>start</th>\n",
       "      <th>duration</th>\n",
       "      <th>end</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A</td>\n",
       "      <td>M1</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>B</td>\n",
       "      <td>M2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>C</td>\n",
       "      <td>M3</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>\n",
       "    <div class=\"colab-df-buttons\">\n",
       "\n",
       "  <div class=\"colab-df-container\">\n",
       "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-388d85d7-f65d-4ff0-a0d5-568c5d20ee50')\"\n",
       "            title=\"Convert this dataframe to an interactive table.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
       "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "\n",
       "  <style>\n",
       "    .colab-df-container {\n",
       "      display:flex;\n",
       "      gap: 12px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert {\n",
       "      background-color: #E8F0FE;\n",
       "      border: none;\n",
       "      border-radius: 50%;\n",
       "      cursor: pointer;\n",
       "      display: none;\n",
       "      fill: #1967D2;\n",
       "      height: 32px;\n",
       "      padding: 0 0 0 0;\n",
       "      width: 32px;\n",
       "    }\n",
       "\n",
       "    .colab-df-convert:hover {\n",
       "      background-color: #E2EBFA;\n",
       "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "      fill: #174EA6;\n",
       "    }\n",
       "\n",
       "    .colab-df-buttons div {\n",
       "      margin-bottom: 4px;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert {\n",
       "      background-color: #3B4455;\n",
       "      fill: #D2E3FC;\n",
       "    }\n",
       "\n",
       "    [theme=dark] .colab-df-convert:hover {\n",
       "      background-color: #434B5C;\n",
       "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "      fill: #FFFFFF;\n",
       "    }\n",
       "  </style>\n",
       "\n",
       "    <script>\n",
       "      const buttonEl =\n",
       "        document.querySelector('#df-388d85d7-f65d-4ff0-a0d5-568c5d20ee50 button.colab-df-convert');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      async function convertToInteractive(key) {\n",
       "        const element = document.querySelector('#df-388d85d7-f65d-4ff0-a0d5-568c5d20ee50');\n",
       "        const dataTable =\n",
       "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
       "                                                    [key], {});\n",
       "        if (!dataTable) return;\n",
       "\n",
       "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
       "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
       "          + ' to learn more about interactive tables.';\n",
       "        element.innerHTML = '';\n",
       "        dataTable['output_type'] = 'display_data';\n",
       "        await google.colab.output.renderOutput(dataTable, element);\n",
       "        const docLink = document.createElement('div');\n",
       "        docLink.innerHTML = docLinkHtml;\n",
       "        element.appendChild(docLink);\n",
       "      }\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "\n",
       "  <div id=\"id_41632d11-1b75-4089-80ea-6684dd5eff57\">\n",
       "    <style>\n",
       "      .colab-df-generate {\n",
       "        background-color: #E8F0FE;\n",
       "        border: none;\n",
       "        border-radius: 50%;\n",
       "        cursor: pointer;\n",
       "        display: none;\n",
       "        fill: #1967D2;\n",
       "        height: 32px;\n",
       "        padding: 0 0 0 0;\n",
       "        width: 32px;\n",
       "      }\n",
       "\n",
       "      .colab-df-generate:hover {\n",
       "        background-color: #E2EBFA;\n",
       "        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
       "        fill: #174EA6;\n",
       "      }\n",
       "\n",
       "      [theme=dark] .colab-df-generate {\n",
       "        background-color: #3B4455;\n",
       "        fill: #D2E3FC;\n",
       "      }\n",
       "\n",
       "      [theme=dark] .colab-df-generate:hover {\n",
       "        background-color: #434B5C;\n",
       "        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
       "        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
       "        fill: #FFFFFF;\n",
       "      }\n",
       "    </style>\n",
       "    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('sched_df')\"\n",
       "            title=\"Generate code using this dataframe.\"\n",
       "            style=\"display:none;\">\n",
       "\n",
       "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
       "       width=\"24px\">\n",
       "    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
       "  </svg>\n",
       "    </button>\n",
       "    <script>\n",
       "      (() => {\n",
       "      const buttonEl =\n",
       "        document.querySelector('#id_41632d11-1b75-4089-80ea-6684dd5eff57 button.colab-df-generate');\n",
       "      buttonEl.style.display =\n",
       "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
       "\n",
       "      buttonEl.onclick = () => {\n",
       "        google.colab.notebook.generateWithVariable('sched_df');\n",
       "      }\n",
       "      })();\n",
       "    </script>\n",
       "  </div>\n",
       "\n",
       "    </div>\n",
       "  </div>\n"
      ],
      "application/vnd.google.colaboratory.intrinsic+json": {
       "type": "dataframe",
       "variable_name": "sched_df",
       "summary": "{\n  \"name\": \"sched_df\",\n  \"rows\": 3,\n  \"fields\": [\n    {\n      \"column\": \"job\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"A\",\n          \"B\",\n          \"C\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"machine\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"M1\",\n          \"M2\",\n          \"M3\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"start\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 0,\n        \"max\": 0,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"duration\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 2,\n        \"max\": 2,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          2\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"end\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 2,\n        \"max\": 2,\n        \"num_unique_values\": 1,\n        \"samples\": [\n          2\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
      }
     },
     "metadata": {}
    },
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "Makespan: 2 saat\n"
     ]
    },
    {
     "output_type": "display_data",
     "data": {
      "text/plain": [
       "<Figure size 1000x350 with 1 Axes>"
      ],
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAFUCAYAAAA57l+/AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAARllJREFUeJzt3Xd4FOX+/vF7k7DpBUggCSQhdAGpCtIMKBgwcMRGEZQAKiroQQ8Wjj+aHAXbsSI2JIhCQEVUpIhCQIqIIgqKKEhRIEBoaYS05/cH3+xhTQJpkyXwfl3XXmRnnpn5bJ6dDffOzDM2Y4wRAAAAAACocG6uLgAAAAAAgIsVoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwBQ6Ww2myZNmuTqMoBSS0pKks1m0549e1xdiiZNmiSbzaaUlBRXlwIAOAdCN4CLXkJCgmw2m+Ph5eWl8PBwxcbG6uWXX1ZaWtp51/Htt9/KZrPphRdeKDTvhhtukM1m06xZswrNu/rqq1WnTp0KeR3ldfz4cXl4eGjBggWuLqVCZWZmatKkSUpKSnJ1KReMzz77TDExMapVq5Z8fHxUv3599e/fX8uWLXO02bNnj9N+4e7ursjISN14443asmWLJCk+Pt6pTXGP+Pj489b0008/adiwYYqOjpaXl5f8/PzUunVrPfLII/rjjz8s+k2cca73yJIlSyz7AqhevXqy2Wzq0aNHkfPfeustx+/wu+++s6SGS92vv/6qRx55RK1bt5a/v7/CwsIUFxfH7xtApfJwdQEAUFmeeOIJRUdHKycnR8nJyUpKStKYMWP03//+V59++qlatmxZ7LJt27aVj4+P1q5dqwcffNBp3vr16+Xh4aF169Zp2LBhjunZ2dnatGmT+vbta9lrKo3ly5fLZrPpuuuuc3UpFSozM1OTJ0+WJHXr1s21xVwAnnvuOT388MOKiYnRuHHj5OPjo507d+rLL79UYmKievXq5dR+0KBBuv7665WXl6ft27drxowZWrp0qb755huNHDnSKTDu3r1bEyZM0N13362uXbs6pjdo0OCcNb311lu69957FRwcrMGDB6tp06bKzc3Vtm3b9O677+rFF1/UqVOn5O7uXrG/jP9zrvfIkiVLNH36dMuCt5eXl1atWqXk5GSFhoY6zXv//ffl5eWlrKwsS7YN6e2339bMmTN1880367777tPJkyf1xhtv6KqrrtKyZcuK/UIEACoSoRvAJaN379664oorHM/HjRunlStXqk+fPvrHP/6h7du3y9vbu8hlPTw81KFDB61bt85p+o4dO5SSkqLbbrtNa9eudZr3/fffKysrS126dKn4F1MGS5YsUefOnRUUFOTqUnAee/bsUXR0tFatWlWqLxJyc3M1ZcoU9ezZU1988UWh+YcPHy40rW3bthoyZIjjeefOnfWPf/xDM2bM0BtvvKGOHTs65n333XeaMGGCOnbs6LTMuaxfv1733nuvOnfurMWLF8vf399p/vPPP68nn3yypC+xyuncubM2bdqk+fPn65///Kdj+l9//aWvv/5aN954oz766CMXVnhxGzRokCZNmiQ/Pz/HtOHDh+uyyy7TpEmTCN0AKgWnlwO4pF1zzTUaP3689u7dq/fee++cbbt06aJDhw5p586djmnr1q1TQECA7r77bkcAP3tewXKS9MknnyguLk7h4eHy9PRUgwYNNGXKFOXl5TmWGT16tPz8/JSZmVlo+4MGDVJoaKhT+6VLl6pr167y9fWVv7+/4uLi9PPPPxdaNj8/X8uWLVNcXJxjms1m0+jRo7Vo0SK1aNFCnp6eat68udMpyAX279+v4cOHq3bt2o5277zzjlOb7OxsTZgwQe3atVNgYKB8fX3VtWtXrVq16py/1+KUZH179uxRSEiIJGny5MmOU3ULjlr+9NNPio+PV/369eXl5aXQ0FANHz5cR48eddpWwbWxv/32m4YMGaLAwECFhIRo/PjxMsbozz//1A033KCAgACFhobq+eeft/S1l1VKSopSU1PVuXPnIufXqlXrvOu45pprJJ05ql0RCvrl/fffLxS4pTNHgqdMmeJ0lPvrr7/WrbfeqsjISHl6eioiIkIPPvigTp065bRsfHy8/Pz8tH//fvXr109+fn4KCQnR2LFjHfvJud4j8fHxmj59uiQ5nS5fkby8vHTTTTdp7ty5TtPnzZun6tWrKzY2ttAyJX3fFmXv3r1q2LChWrRooUOHDkmSTpw4oTFjxigiIkKenp5q2LChnn76aeXn5zstm5iYqHbt2snf318BAQG6/PLL9dJLLznmF1yqs2bNGo0cOVI1a9ZUQECA7rjjDh0/ftxpXSX5vJPOnHnQokUL/fLLL+revbt8fHxUp04dPfPMM+d9rSXRrl07p8AtSTVr1lTXrl21ffv2CtkGAJwPoRvAJe/222+XpCKPDJ6tIDyffUR73bp1uuqqq9ShQwdVq1ZN69evd5rn7++vVq1aSTrzH1Y/Pz899NBDeumll9SuXTtNmDBBjz32mGOZAQMGKCMjQ59//rnTtjMzM/XZZ5/plltucYSTOXPmKC4uTn5+fnr66ac1fvx4/fLLL+rSpUuhQZ42bdqkI0eO6Prrr3eavnbtWt13330aOHCgnnnmGWVlZenmm292+s/9oUOHdNVVV+nLL7/U6NGj9dJLL6lhw4YaMWKEXnzxRUe71NRUvf322+rWrZuefvppTZo0SUeOHFFsbKzjGuHSKMn6QkJCNGPGDEnSjTfeqDlz5mjOnDm66aabJEkrVqzQH3/8oWHDhumVV17RwIEDlZiYqOuvv17GmELbHDBggPLz8zVt2jR16NBB//nPf/Tiiy+qZ8+eqlOnjp5++mk1bNhQY8eO1Zo1ayx77WVVq1YteXt767PPPtOxY8fKtI5du3ZJOhNMyiszM1MrV65Ut27dVLdu3RIv98EHHygzM1P33nuvXnnlFcXGxuqVV17RHXfcUahtXl6eYmNjVbNmTT333HOKiYnR888/rzfffFPSud8jI0eOVM+ePSXJMX3OnDnlft1/d9ttt+nbb791/G4lae7cubrllltUrVq1Qu1L+74tsGvXLl199dXy9/dXUlKSateurczMTMXExOi9997THXfcoZdfflmdO3fWuHHj9NBDDzltc9CgQapevbqefvppTZs2Td26dSt0do905svB7du3a9KkSbrjjjv0/vvvq1+/fk61leTzrsDx48fVq1cvtWrVSs8//7yaNm2qRx99VEuXLnVql5KSUqLH6dOnz90hkpKTkxUcHHzedgBQIQwAXORmzZplJJlNmzYV2yYwMNC0adPmnOtJTU017u7uZsSIEY5pTZo0MZMnTzbGGNO+fXvz8MMPO+aFhISYnj17Op5nZmYWWufIkSONj4+PycrKMsYYk5+fb+rUqWNuvvlmp3YLFiwwksyaNWuMMcakpaWZoKAgc9dddzm1S05ONoGBgYWmjx8/3kRFRTlNk2TsdrvZuXOnY9qPP/5oJJlXXnnFMW3EiBEmLCzMpKSkOC0/cOBAExgY6Hhdubm55vTp005tjh8/bmrXrm2GDx9eaNsTJ04s9Ps4W0nXd+TIkWLXV9TvfN68eU6/S2OMmThxopFk7r77bqft161b19hsNjNt2jSnGry9vc3QoUNLXWtJ7d6920gyq1atKvWyEyZMMJKMr6+v6d27t3nyySfN999/X+w2Jk+ebI4cOWKSk5NNUlKSadOmjZFkPvroo0LLbNq0yUgys2bNKlEtBe+nMWPGFJp39OhRc+TIEcfj7N9fUf02depUY7PZzN69ex3Thg4daiSZJ554wqltmzZtTLt27RzPz/UeGTVqlCnNf4dWrVplJJndu3eft21UVJSJi4szubm5JjQ01EyZMsUYY8wvv/xiJJnVq1cX+flU2vftkSNHzPbt2014eLi58sorzbFjxxxtpkyZYnx9fc1vv/3mtL7HHnvMuLu7m3379hljjPnnP/9pAgICTG5ubrGvp6DWdu3amezsbMf0Z555xkgyn3zyyTlfw98/74wxJiYmxkgy7777rmPa6dOnTWhoaKHPQUklepzv/blmzRpjs9nM+PHjz9kOACoKR7oBQJKfn995RzH39/dXy5YtHUe6U1JStGPHDnXq1EnSmWs3C44K/fbbbzpy5IjT9dxnXy+elpamlJQUde3aVZmZmfr1118lnTnF9dZbb9WSJUuUnp7uaD9//nzVqVPHsb4VK1boxIkTGjRokNMRHnd3d3Xo0KHQac1LlixxOrW8QI8ePZwGwWrZsqUCAgIco0kbY/TRRx+pb9++MsY4bSs2NlYnT57U5s2bJUnu7u6y2+2SzpzOfuzYMeXm5uqKK65wtCmNiljf2b/zrKwspaSk6KqrrpKkItdx5513Om3/iiuukDFGI0aMcEwPCgpSkyZNnEbcLm+t6enpTr/bglN1T5486TT95MmT513X5MmTNXfuXLVp00bLly/X448/rnbt2qlt27ZFnk47ceJEhYSEKDQ0VN26ddOuXbv09NNPO84WKI/U1FRJKnR6ryTVr19fISEhjsenn37qmHd2v2VkZCglJUWdOnWSMUY//PBDoXXdc889Ts+7du1q+YjopeHu7q7+/ftr3rx5ks4MoBYREeE0GN3ZSvu+3bZtm2JiYlSvXj19+eWXql69umPeBx98oK5du6p69epO76UePXooLy/PccZGUFCQMjIytGLFivO+nrvvvtvpCP29994rDw8PLVmypMjXUNznXQE/Pz+nMQLsdrvat29fqA9XrFhRokdRp+wXOHz4sG677TZFR0frkUceOe9rBYCKwEBqAKAzoafgetdTp04VCjcFow536dJFr7zyilJSUrR+/Xq5u7s7/jPcqVMnvfbaazp9+nSh67kl6eeff9b/+3//TytXrnSEkQJnb2/AgAF68cUX9emnn+q2225Tenq6lixZopEjRzquN/39998l/e/6278LCAhw/JycnKzNmzfriSeeKNQuMjKy0LTq1as7Qt+RI0d04sQJvfnmm47Tdf/u7MG5Zs+ereeff16//vqrcnJyHNOjo6OLXPZ8yru+Y8eOafLkyUpMTCw0iFhRAfbvv4/AwEB5eXkVOg01MDCw0PW15al19OjRmj17dqHp/fr1c3oeExNTolujDRo0SIMGDVJqaqo2btyohIQEzZ07V3379tW2bdvk5eXlaHv33Xfr1ltvlZubm4KCgtS8eXN5enqedxslUXAN99lfIBX45JNPlJOTox9//FFjx451mrdv3z5NmDBBn376aaFrhf/eb15eXo5rtguc/R6+UNx22216+eWX9eOPP2ru3LkaOHBgsdePl/Z927dvX9WuXVvLly8v9AXH77//rp9++qnQ76hAwfrvu+8+LViwQL1791adOnV03XXXqX///oVGu5ekRo0aOT338/NTWFiY02UtJf28k6S6desW+l1Ur15dP/30k9O08g56lpGRoT59+igtLU1r164t8ssgALACoRvAJe+vv/7SyZMn1bBhQ0lnjiqffesvSY5rFQtC97p167R+/Xpdfvnljv+4derUSadPn9amTZu0du1aeXh4OAL5iRMnFBMTo4CAAD3xxBNq0KCBvLy8tHnzZj366KNOAxpdddVVqlevnhYsWKDbbrtNn332mU6dOqUBAwY42hS0nzNnTqHbEElnRlsvsHTpUnl5eal79+6F2hV3i6aC11uwnSFDhmjo0KFFti241dp7772n+Ph49evXTw8//LBq1aold3d3TZ061ela1pKqiPX1799f69ev18MPP6zWrVvLz89P+fn56tWrV6FBpKSifx/n+x1VRK2PPPKI05G+Q4cOaciQIXruueccYwJIcjqCWRIBAQHq2bOnevbsqWrVqmn27NnauHGjYmJiHG0aNWpk2QjODRs2lIeHh7Zt21ZoXkENZ79XpTPXaPfs2VPHjh3To48+qqZNm8rX11f79+9XfHx8oX6z6jZjFa1Dhw5q0KCBxowZo927d+u2224rtm1p37c333yzZs+erffff18jR450mpefn6+ePXsWe1S3cePGks6MB7BlyxYtX75cS5cu1dKlSzVr1izdcccdRX4hdC6l+byTSraPSWe+QCyJwMDAQneiyM7O1k033aSffvpJy5cvV4sWLUrxigCgfAjdAC55BQMnFZySGBsbW+wplmcPprZhwwanUaLDw8MVFRWldevWad26dWrTpo18fHwkSUlJSTp69KgWLlyoq6++2rFMcSNE9+/fXy+99JJSU1M1f/581atXzxHgpf/dF7lWrVrnDUyff/65unfvXuzt0M4lJCRE/v7+ysvLO+92PvzwQ9WvX18LFy50Omo1ceLEUm+3NOsr7mjh8ePH9dVXX2ny5MmaMGGCY3rBWQIVqbyvvVmzZmrWrJnjecERw3bt2lXYvcevuOIKzZ49WwcPHqyQ9ZWEr6+vunXrptWrV2v//v2qU6fOeZfZunWrfvvtN82ePdtp4LSSnPZcnHONSF7Ro5Wfy6BBg/Sf//xHl112mVq3bl1km7K8b5999ll5eHjovvvuk7+/v1Ogb9CggdLT00v0xYrdblffvn3Vt29f5efn67777tMbb7yh8ePHO76ULKjl7C/x0tPTdfDgQcdAjaX9vCupsLCwErWbNWuW4uPjHc/z8/N1xx136KuvvtKCBQucvnQCgMpA6AZwSVu5cqWmTJmi6OhoDR48WNKZ/9gV95+78PBwRUdH66uvvtIvv/yi++67z2l+p06dtGjRIu3YsUMPPvigY3rBkZyzj9xkZ2frtddeK3I7AwYM0DPPPKPZs2dr2bJlTvf3lc58MRAQEKCnnnpK3bt3LzQC8pEjRxQSEqKcnBytWLFCU6dOLeFvxJm7u7tuvvlmzZ07V9u2bSt0dKhgO39/jQVBZuPGjdqwYUORp7GXZNslWV/BFxsnTpwodvmznT3iekWp6NdeVpmZmfrxxx+d7q1doGAk6CZNmlRaPZI0YcIEdevWTUOGDNFnn31W6JTev/dPUf1mjHG6dVVpFfcekc58MVAwz+p72N95552OcReKU5b3rc1m05tvvqm0tDQNHTpUfn5++sc//iHpzBd4kyZN0vLlywtd63zixAn5+fnJw8NDR48edRqx3s3NzXEWy99HA3/zzTc1bNgwx+fOjBkzlJubq969exf7Gs71eVdSJf3ipXnz5k7P77//fs2fP19vvPFGhYxVAAClRegGcMlYunSpfv31V+Xm5urQoUNauXKlVqxYoaioKH366adO17meS5cuXRxHx/9+P+ROnTo5Bks6+3ruTp06qXr16ho6dKgeeOAB2Ww2zZkzp9jb/7Rt21YNGzbU448/rtOnTzudWi6dOW14xowZuv3229W2bVsNHDhQISEh2rdvnz7//HN17txZr776qtauXavU1NQiB1ErqWnTpmnVqlXq0KGD7rrrLjVr1kzHjh3T5s2b9eWXXzpuTdWnTx8tXLhQN954o+Li4rR79269/vrratasWZHX9J5PSdfn7e2tZs2aaf78+WrcuLFq1KihFi1aqEWLFrr66qv1zDPPKCcnR3Xq1NEXX3xRYfefLkutVsvMzFSnTp101VVXqVevXoqIiNCJEye0aNEiff311+rXr5/atGlTafVIZwY1e/XVV3X//ferUaNGGjx4sJo2bars7Gz99ttvev/992W32x2XSTRt2lQNGjTQ2LFjtX//fgUEBOijjz4q1zXa53qPtGvXTpL0wAMPKDY2Vu7u7ho4cGCFvPa/i4qKctxDvjgBAQFlet+6ubnpvffeU79+/dS/f38tWbJE11xzjR5++GF9+umn6tOnj+Lj49WuXTtlZGRo69at+vDDD7Vnzx4FBwfrzjvv1LFjx3TNNdeobt262rt3r1555RW1bt1al112mdO2srOzde2116p///7asWOHXnvtNXXp0sUR9Ev7eVdSZbkM4sUXX9Rrr72mjh07ysfHR++9957T/BtvvNHxxQsAWKZyB0sHgMpXcJubgofdbjehoaGmZ8+e5qWXXjKpqamlWt8bb7xhJJk6deoUmrd582bHdg4dOuQ0b926deaqq64y3t7eJjw83DzyyCNm+fLlxd4a6vHHHzeSTMOGDYutZdWqVSY2NtYEBgYaLy8v06BBAxMfH2++++47Y4wxY8eONc2aNStyWUlm1KhRhaZHRUU53Q7LGGMOHTpkRo0aZSIiIky1atVMaGioufbaa82bb77paJOfn2+eeuopExUVZTw9PU2bNm3M4sWLzdChQ4u8Xdn5bhlWmvWtX7/etGvXztjtdqd1//XXX+bGG280QUFBJjAw0Nx6663m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add0AwAAAABwqSF0AwAAAABgEUI3AAAAAAAWIXQDAAAAAGARQjcAAAAAABYhdAMAAAAAYBFCNwAAAAAAFiF0AwAAAABgEUI3AAAAAAAWIXQDAAAnt99+u5566imX1pCdna169erpu+++c2kdAACUF6EbAIBSSkpKks1mK/bRvXt3V5dYZj/++KOWLFmiBx54oNK2OWnSJLVu3dppmt1u19ixY/Xoo49WWh0AAFiB0A0AQCl16tRJBw8eLPR44403ZLPZdN9997m6xDJ75ZVXdOutt8rPz8/VpWjw4MFau3atfv75Z1eXAgBAmRG6AQAoJbvdrtDQUKfH8ePHNXbsWP373//WrbfeKknKy8vTiBEjFB0dLW9vbzVp0kQvvfSS07ri4+PVr18/PfXUU6pdu7aCgoL0xBNPKDc3Vw8//LBq1KihunXratasWU7LPfroo2rcuLF8fHxUv359jR8/Xjk5OY75BUeP58yZo3r16ikwMFADBw5UWlpasa8rLy9PH374ofr27es0/bXXXlOjRo3k5eWl2rVr65ZbbnHMW7Zsmbp06aKgoCDVrFlTffr00a5du0pca0JCgiZPnqwff/zRcaZAQkKCJKl69erq3LmzEhMTS9gzAABceDxcXQAAAFXdiRMndMMNN6hbt26aMmWKY3p+fr7q1q2rDz74QDVr1tT69et19913KywsTP3793e0W7lyperWras1a9Zo3bp1GjFihNavX6+rr75aGzdu1Pz58zVy5Ej17NlTdevWlST5+/srISFB4eHh2rp1q+666y75+/vrkUcecax3165dWrRokRYvXqzjx4+rf//+mjZtmp588skiX8dPP/2kkydP6oorrnBM++677/TAAw9ozpw56tSpk44dO6avv/7aMT8jI0MPPfSQWrZsqfT0dE2YMEE33nijtmzZIjc3t/PWOmDAAG3btk3Lli3Tl19+KUkKDAx0rL99+/ZO2wMAoKqxGWOMq4sAAKCqys/PV58+fbRnzx5t3LhR/v7+52w/evRoJScn68MPP5R05kh3UlKS/vjjD0dIbdq0qWrVqqU1a9ZIOnMEOjAwUG+//bYGDhxY5Hqfe+45JSYmOgYemzRpkp599lklJyc7anrkkUe0Zs0affPNN0WuY9GiRbrllluUk5Mjm80mSVq4cKGGDRumv/7667yvTZJSUlIUEhKirVu3qkWLFiWuddGiRdqyZUuhti+//LJeeOEF7d69+7zbBgDgQsSRbgAAyuHf//63NmzYoG+//bbIUDp9+nS988472rdvn06dOqXs7OxCg4Y1b97cEbglqXbt2k6B1d3dXTVr1tThw4cd0+bPn6+XX35Zu3btUnp6unJzcxUQEOC03nr16jnVFBYW5rSOvzt16pQ8PT0dgVuSevbsqaioKNWvX1+9evVSr169dOONN8rHx0eS9Pvvv2vChAnauHGjUlJSlJ+fL0nat2+f4zWUpNbieHt7KzMzs0RtAQC4EHFNNwAAZZSYmOg4atuoUaMi548dO1YjRozQF198oS1btmjYsGHKzs52aletWjWn5zabrchpBYF2w4YNGjx4sK6//notXrxYP/zwgx5//PESrbdgHUUJDg5WZmam03r8/f21efNmzZs3T2FhYZowYYJatWqlEydOSJL69u2rY8eO6a233tLGjRu1ceNGSXKso6S1FufYsWMKCQkpUVsAAC5EHOkGAKAMtmzZohEjRmjatGmKjY0tss26devUqVMnp9HM/z7IWFmsX79eUVFRevzxxx3T9u7dW+71FhyB/+WXX5yOxnt4eKhHjx7q0aOHJk6cqKCgIK1cuVIxMTHasWOH3nrrLXXt2lWStHbt2lLXarfblZeXV2RN27ZtU5s2bcr92gAAcBVCNwAApZSSkqJ+/fqpW7duGjJkiJKTk53mu7u7KyQkRI0aNdK7776r5cuXKzo6WnPmzNGmTZsUHR1dru03atRI+/btU2Jioq688kp9/vnn+vjjj8u1TkkKCQlR27ZttXbtWkfoXrx4sf744w9dffXVql69upYsWaL8/Hw1adJE1atXV82aNfXmm28qLCxM+/bt02OPPVbqWuvVq6fdu3dry5Ytqlu3rvz9/eXp6SlJ+vrrr50GpwMAoKrh9HIAAErp888/1969e7VkyRKFhYUVelx55ZWSpJEjR+qmm27SgAED1KFDBx09erRC7uH9j3/8Qw8++KBGjx6t1q1ba/369Ro/fny51ytJd955p95//33H86CgIC1cuFDXXHONLrvsMr3++uuaN2+e4zr0xMREff/992rRooUefPBBPfvss6Wu9eabb1avXr3UvXt3hYSEaN68eZLOnJp+8uRJp1uUAQBQ1TB6OQAAcDh16pSaNGmi+fPnq2PHji6tZcCAAWrVqpX+/e9/u7QOAADKgyPdAADAwdvbW++++65SUlJcWkd2drYuv/xyPfjggy6tAwCA8uJINwAAAAAAFuFINwAAAAAAFiF0AwAAAABgEUI3AAAAAAAWIXQDAAAAAGARQjcAAAAAABYhdAMAAAAAYBFCNwAAAAAAFiF0AwAAAABgEUI3AAAAAAAW+f81jrUfCQmOrAAAAABJRU5ErkJggg==\n"
     },
     "metadata": {}
    }
   ],
   "source": "# Basit Gantt: her makinede atanan işler sırayla (SPT)\nschedule_rows = []\nfor m in machines:\n    jobs_on_m = [(j, ptime[(j, m)]) for j, mc in assignment.items() if mc == m]\n    jobs_on_m.sort(key=lambda x: x[1])  # SPT\n    t = 0\n    for j, dur in jobs_on_m:\n        schedule_rows.append({\"job\": j, \"machine\": m, \"start\": t, \"duration\": dur, \"end\": t + dur})\n        t += dur\n\nsched_df = pd.DataFrame(schedule_rows)\nprint(\"=== Liste çizelge (SPT on machines) ===\")\ndisplay(sched_df)\nmakespan = sched_df[\"end\"].max() if len(sched_df) else 0\nprint(f\"Makespan: {makespan} saat\")\n\ncolors = {\"A\": \"#3498db\", \"B\": \"#e74c3c\", \"C\": \"#2ecc71\"}\nfig, ax = plt.subplots(figsize=(10, 3.5))\nmach_pos = {m: i for i, m in enumerate(machines)}\nfor _, r in sched_df.iterrows():\n    ax.barh(mach_pos[r[\"machine\"]], r[\"duration\"], left=r[\"start\"], height=0.5,\n            color=colors[r[\"job\"]], edgecolor=\"black\")\n    ax.text(r[\"start\"] + r[\"duration\"]/2, mach_pos[r[\"machine\"]], r[\"job\"],\n            ha=\"center\", va=\"center\", color=\"white\", fontweight=\"bold\")\nax.set_yticks(list(mach_pos.values()))\nax.set_yticklabels(machines)\nax.set_xlabel(\"Zaman (saat)\")\nax.set_title(f\"D-Wave/neal atama + SPT Gantt | Makespan={makespan}\")\nax.legend(handles=[mpatches.Patch(color=c, label=j) for j, c in colors.items()])\nplt.tight_layout()\nplt.show()\n",
   "id": "gantt"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "s6"
   },
   "source": "## 6. Opsiyonel: Gerçek D-Wave Cloud (Leap API)\n\n1. [https://cloud.dwavesys.com/](https://cloud.dwavesys.com/) hesabı açın  \n2. API token alın  \n3. Colab Secrets → `DWAVE_API_TOKEN` veya aşağıya yapıştırın  \n\nÜcretsiz plan sınırlı anneal hakkı verir; yoksa yerel `neal` yeterli.\n",
   "id": "s6"
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "id": "dwave_cloud",
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "executionInfo": {
     "status": "ok",
     "timestamp": 1786331855076,
     "user_tz": -180,
     "elapsed": 488,
     "user": {
      "displayName": "Joseph Volkan ÖZCAN",
      "userId": "11389530967736397480"
     }
    },
    "outputId": "cb5dc8f1-7d5a-41eb-e8a8-1a04968b5234"
   },
   "outputs": [
    {
     "output_type": "stream",
     "name": "stdout",
     "text": [
      "ℹ️ Token yok → cloud atlanacak (neal sonucu geçerli)\n",
      "Cloud adımı atlandı.\n"
     ]
    }
   ],
   "source": "DWAVE_TOKEN = \"\"\ntry:\n    from google.colab import userdata\n    DWAVE_TOKEN = userdata.get(\"DWAVE_API_TOKEN\") or \"\"\n    if DWAVE_TOKEN:\n        print(\"✅ D-Wave token Secrets'tan alındı\")\nexcept Exception:\n    pass\n\nif not DWAVE_TOKEN:\n    DWAVE_TOKEN = \"\"  # ← isteğe bağlı: token yapıştırın\n    if DWAVE_TOKEN:\n        print(\"✅ Token manuel\")\n    else:\n        print(\"ℹ️ Token yok → cloud atlanacak (neal sonucu geçerli)\")\n\nsampleset_dwave = None\nif DWAVE_TOKEN:\n    try:\n        from dwave.system import DWaveSampler, EmbeddingComposite\n        import os\n        os.environ[\"DWAVE_API_TOKEN\"] = DWAVE_TOKEN\n\n        sampler = EmbeddingComposite(DWaveSampler())\n        print(f\"D-Wave solver: {sampler.child.solver.name}\")\n        sampleset_dwave = sampler.sample(bqm, num_reads=100)\n        print(sampleset_dwave.truncate(3))\n        best_dw = sampleset_dwave.first\n        print(f\"D-Wave en iyi enerji: {best_dw.energy:.4f}\")\n        print(\"Atama:\")\n        for j in jobs:\n            for m in machines:\n                if best_dw.sample.get(f\"x_{j}_{m}\", 0) == 1:\n                    print(f\"  Job {j} → {m}\")\n    except Exception as e:\n        print(f\"⚠️ D-Wave cloud hatası: {type(e).__name__}: {e}\")\n        print(\"Yerel neal sonucu kullanılmaya devam eder.\")\nelse:\n    print(\"Cloud adımı atlandı.\")\n",
   "id": "dwave_cloud"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "s7"
   },
   "source": "## 7. Photonic / Qiskit Notu\n\n| Soru | Cevap |\n|------|--------|\n| Photonic ile MRP QUBO? | Doğrudan annealing yok; QAOA/VQE gate model gerekir → yine iterasyon + simülasyon maliyeti |\n| PennyLane photonic? | Eğitim simülasyonu mümkün; gerçek Xanadu/X-series erişimi ayrı hesap |\n| Qiskit’i tamamen bırakmalı mı? | Hayır – encoding, prototip, hibrit için Qiskit; **kombinatoryal QUBO production denemesi** için D-Wave/`neal` daha pragmatik |\n| IBM neden uzun? | Kuyruk + QAOA döngüsü + transpile; annealing tek shot’lık sample seti üretir |\n\n**Öneri (öğrenci / pilot proje):**\n1. BQM’i `dimod` ile kur  \n2. `neal` ile saniyede doğrula  \n3. Token varsa D-Wave Leap’te aynı BQM’i çalıştır  \n4. Sonuçları Gantt’a bağla (SAP PP pilot fikri)\n",
   "id": "s7"
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "closing"
   },
   "source": "## 8. Özet\n\n- IBM canlı QC’de QAOA’nın uzun sürmesi **beklenen** bir durum.\n- MRP/çizelgeleme tipi problemler **QUBO → annealing** hattına daha uygun.\n- Bu notebook: **yerel neal (hemen)** + **opsiyonel D-Wave cloud**.\n- Photonic şu an bu senaryo için birincil seçenek değil.\n\n### Ödev\n1. `lagrange` ve `balance` değiştirip atama fizibilitesini gözlemleyin  \n2. 4. job ekleyip değişken sayısını ve süreyi ölçün  \n3. D-Wave token ile cloud / neal enerji farkını karşılaştırın  \n\n---\n**Hazırlayan:** Joseph Volkan Ozcan  \n**Stack:** dimod · neal · dwave-ocean (opsiyonel)  \n**Colab · 2026**\n",
   "id": "closing"
  }
 ]
}