{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###  Integrated Simulation-Based Optimization of Operational Decisions at Container Terminals - Data Analysis\n",
    "\n",
    "This Jupyter Notebook is used in the publication \"Integrated Simulation-Based Optimization of Operational Decisions at Container Terminals\" by Kastner, M.; Nellen, N.; Schwientek, A.; Jahn, C. in the Journal *Algorithms* in 2021.\n",
    "In this notebook, the figures are plotted and the statistics are run.\n",
    "In case of questions regarding the code or data, please write an email to marvin.kastner@tuhh.de."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "import statistics\n",
    "import scipy.stats\n",
    "import scikit_posthocs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<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>index</th>\n",
       "      <th>procedure</th>\n",
       "      <th>df_number</th>\n",
       "      <th>number_tts</th>\n",
       "      <th>number_ybs</th>\n",
       "      <th>number_qcs</th>\n",
       "      <th>yb_assignment_of_qcs</th>\n",
       "      <th>qc_assignment_of_tts</th>\n",
       "      <th>dispatching_weight_a</th>\n",
       "      <th>dispatching_weight_b</th>\n",
       "      <th>...</th>\n",
       "      <th>weighted_utilization</th>\n",
       "      <th>working_time_tts_min</th>\n",
       "      <th>working_time_tts_std</th>\n",
       "      <th>working_time_tts_max</th>\n",
       "      <th>optimization_run_name</th>\n",
       "      <th>fitness</th>\n",
       "      <th>randomly_chosen</th>\n",
       "      <th>during_initialization</th>\n",
       "      <th>timestamp_trials</th>\n",
       "      <th>timestamp_exp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>sa</td>\n",
       "      <td>662</td>\n",
       "      <td>7</td>\n",
       "      <td>15</td>\n",
       "      <td>6</td>\n",
       "      <td>Z</td>\n",
       "      <td>1</td>\n",
       "      <td>50</td>\n",
       "      <td>50</td>\n",
       "      <td>...</td>\n",
       "      <td>0.300686</td>\n",
       "      <td>91655.357142</td>\n",
       "      <td>796.732590</td>\n",
       "      <td>93938.452381</td>\n",
       "      <td>RS--QC-6--it-1--2020-11-24T00-19-28</td>\n",
       "      <td>-0.151685</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2020-11-26T08-15-17</td>\n",
       "      <td>2020-11-24T00-19-28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>sa</td>\n",
       "      <td>662</td>\n",
       "      <td>6</td>\n",
       "      <td>15</td>\n",
       "      <td>6</td>\n",
       "      <td>Z</td>\n",
       "      <td>1</td>\n",
       "      <td>30</td>\n",
       "      <td>70</td>\n",
       "      <td>...</td>\n",
       "      <td>0.261234</td>\n",
       "      <td>106009.642857</td>\n",
       "      <td>1092.275920</td>\n",
       "      <td>108884.642856</td>\n",
       "      <td>RS--QC-6--it-0--2020-11-23T04-47-48</td>\n",
       "      <td>-0.112707</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2020-11-26T08-15-17</td>\n",
       "      <td>2020-11-23T04-47-48</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>sa</td>\n",
       "      <td>662</td>\n",
       "      <td>28</td>\n",
       "      <td>13</td>\n",
       "      <td>6</td>\n",
       "      <td>Z</td>\n",
       "      <td>2</td>\n",
       "      <td>60</td>\n",
       "      <td>40</td>\n",
       "      <td>...</td>\n",
       "      <td>0.592639</td>\n",
       "      <td>38414.761904</td>\n",
       "      <td>2504.002794</td>\n",
       "      <td>51039.285714</td>\n",
       "      <td>RS--QC-6--it-10--2020-11-25T16-15-43</td>\n",
       "      <td>-0.590109</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2020-11-26T08-15-17</td>\n",
       "      <td>2020-11-25T16-15-43</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>sa</td>\n",
       "      <td>662</td>\n",
       "      <td>6</td>\n",
       "      <td>17</td>\n",
       "      <td>6</td>\n",
       "      <td>Z</td>\n",
       "      <td>1</td>\n",
       "      <td>40</td>\n",
       "      <td>60</td>\n",
       "      <td>...</td>\n",
       "      <td>0.253486</td>\n",
       "      <td>107152.142858</td>\n",
       "      <td>718.791346</td>\n",
       "      <td>109194.166667</td>\n",
       "      <td>TPE---QC-6--it-0--2020-11-23T02-34-00</td>\n",
       "      <td>-0.109614</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2020-11-26T08-15-17</td>\n",
       "      <td>2020-11-23T02-34-00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>sa</td>\n",
       "      <td>662</td>\n",
       "      <td>5</td>\n",
       "      <td>15</td>\n",
       "      <td>6</td>\n",
       "      <td>N</td>\n",
       "      <td>1</td>\n",
       "      <td>90</td>\n",
       "      <td>10</td>\n",
       "      <td>...</td>\n",
       "      <td>0.218280</td>\n",
       "      <td>117007.857144</td>\n",
       "      <td>697.740842</td>\n",
       "      <td>118675.952381</td>\n",
       "      <td>SA--QC-6--it-0--2020-11-23T00-07-47</td>\n",
       "      <td>-0.078963</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2020-11-26T08-15-17</td>\n",
       "      <td>2020-11-23T00-07-47</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51995</th>\n",
       "      <td>45</td>\n",
       "      <td>bys</td>\n",
       "      <td>1701</td>\n",
       "      <td>22</td>\n",
       "      <td>20</td>\n",
       "      <td>4</td>\n",
       "      <td>N</td>\n",
       "      <td>2</td>\n",
       "      <td>30</td>\n",
       "      <td>70</td>\n",
       "      <td>...</td>\n",
       "      <td>0.653322</td>\n",
       "      <td>53958.928571</td>\n",
       "      <td>3770.779324</td>\n",
       "      <td>63284.404762</td>\n",
       "      <td>BYS--QC-4--it-0--2020-11-24T13-56-31</td>\n",
       "      <td>-0.836482</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2020-11-25T12-04-15</td>\n",
       "      <td>2020-11-24T13-56-31</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51996</th>\n",
       "      <td>46</td>\n",
       "      <td>bys</td>\n",
       "      <td>1701</td>\n",
       "      <td>28</td>\n",
       "      <td>8</td>\n",
       "      <td>4</td>\n",
       "      <td>N</td>\n",
       "      <td>2</td>\n",
       "      <td>50</td>\n",
       "      <td>50</td>\n",
       "      <td>...</td>\n",
       "      <td>0.715397</td>\n",
       "      <td>43589.285715</td>\n",
       "      <td>894.015273</td>\n",
       "      <td>47058.333335</td>\n",
       "      <td>BYS--QC-4--it-1--2020-11-24T21-28-19</td>\n",
       "      <td>-0.811100</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2020-11-25T12-04-15</td>\n",
       "      <td>2020-11-24T21-28-19</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51997</th>\n",
       "      <td>47</td>\n",
       "      <td>bys</td>\n",
       "      <td>1701</td>\n",
       "      <td>28</td>\n",
       "      <td>20</td>\n",
       "      <td>4</td>\n",
       "      <td>Z</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>100</td>\n",
       "      <td>...</td>\n",
       "      <td>0.569849</td>\n",
       "      <td>46682.500000</td>\n",
       "      <td>1244.035349</td>\n",
       "      <td>51701.071429</td>\n",
       "      <td>BYS--QC-4--it-0--2020-11-24T14-57-24</td>\n",
       "      <td>-0.662839</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2020-11-25T12-04-15</td>\n",
       "      <td>2020-11-24T14-57-24</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51998</th>\n",
       "      <td>48</td>\n",
       "      <td>bys</td>\n",
       "      <td>1701</td>\n",
       "      <td>20</td>\n",
       "      <td>8</td>\n",
       "      <td>4</td>\n",
       "      <td>N</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>100</td>\n",
       "      <td>...</td>\n",
       "      <td>0.733802</td>\n",
       "      <td>60289.642858</td>\n",
       "      <td>1527.488746</td>\n",
       "      <td>64910.476192</td>\n",
       "      <td>BYS--QC-4--it-1--2020-11-24T01-02-06</td>\n",
       "      <td>-0.836020</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2020-11-25T12-04-15</td>\n",
       "      <td>2020-11-24T01-02-06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51999</th>\n",
       "      <td>49</td>\n",
       "      <td>bys</td>\n",
       "      <td>1701</td>\n",
       "      <td>16</td>\n",
       "      <td>8</td>\n",
       "      <td>4</td>\n",
       "      <td>N</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>100</td>\n",
       "      <td>...</td>\n",
       "      <td>0.750068</td>\n",
       "      <td>51962.261905</td>\n",
       "      <td>10514.088040</td>\n",
       "      <td>75410.000002</td>\n",
       "      <td>BYS--QC-4--it-1--2020-11-25T04-28-56</td>\n",
       "      <td>-0.841722</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2020-11-25T12-04-15</td>\n",
       "      <td>2020-11-25T04-28-56</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>40000 rows × 33 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       index procedure  df_number  number_tts  number_ybs  number_qcs  \\\n",
       "0          0        sa        662           7          15           6   \n",
       "1          1        sa        662           6          15           6   \n",
       "2          2        sa        662          28          13           6   \n",
       "3          3        sa        662           6          17           6   \n",
       "4          4        sa        662           5          15           6   \n",
       "...      ...       ...        ...         ...         ...         ...   \n",
       "51995     45       bys       1701          22          20           4   \n",
       "51996     46       bys       1701          28           8           4   \n",
       "51997     47       bys       1701          28          20           4   \n",
       "51998     48       bys       1701          20           8           4   \n",
       "51999     49       bys       1701          16           8           4   \n",
       "\n",
       "      yb_assignment_of_qcs  qc_assignment_of_tts  dispatching_weight_a  \\\n",
       "0                        Z                     1                    50   \n",
       "1                        Z                     1                    30   \n",
       "2                        Z                     2                    60   \n",
       "3                        Z                     1                    40   \n",
       "4                        N                     1                    90   \n",
       "...                    ...                   ...                   ...   \n",
       "51995                    N                     2                    30   \n",
       "51996                    N                     2                    50   \n",
       "51997                    Z                     2                     0   \n",
       "51998                    N                     2                     0   \n",
       "51999                    N                     2                     0   \n",
       "\n",
       "       dispatching_weight_b  ...  weighted_utilization  working_time_tts_min  \\\n",
       "0                        50  ...              0.300686          91655.357142   \n",
       "1                        70  ...              0.261234         106009.642857   \n",
       "2                        40  ...              0.592639          38414.761904   \n",
       "3                        60  ...              0.253486         107152.142858   \n",
       "4                        10  ...              0.218280         117007.857144   \n",
       "...                     ...  ...                   ...                   ...   \n",
       "51995                    70  ...              0.653322          53958.928571   \n",
       "51996                    50  ...              0.715397          43589.285715   \n",
       "51997                   100  ...              0.569849          46682.500000   \n",
       "51998                   100  ...              0.733802          60289.642858   \n",
       "51999                   100  ...              0.750068          51962.261905   \n",
       "\n",
       "       working_time_tts_std  working_time_tts_max  \\\n",
       "0                796.732590          93938.452381   \n",
       "1               1092.275920         108884.642856   \n",
       "2               2504.002794          51039.285714   \n",
       "3                718.791346         109194.166667   \n",
       "4                697.740842         118675.952381   \n",
       "...                     ...                   ...   \n",
       "51995           3770.779324          63284.404762   \n",
       "51996            894.015273          47058.333335   \n",
       "51997           1244.035349          51701.071429   \n",
       "51998           1527.488746          64910.476192   \n",
       "51999          10514.088040          75410.000002   \n",
       "\n",
       "                       optimization_run_name   fitness  randomly_chosen  \\\n",
       "0        RS--QC-6--it-1--2020-11-24T00-19-28 -0.151685              NaN   \n",
       "1        RS--QC-6--it-0--2020-11-23T04-47-48 -0.112707              NaN   \n",
       "2       RS--QC-6--it-10--2020-11-25T16-15-43 -0.590109              NaN   \n",
       "3      TPE---QC-6--it-0--2020-11-23T02-34-00 -0.109614              NaN   \n",
       "4        SA--QC-6--it-0--2020-11-23T00-07-47 -0.078963              NaN   \n",
       "...                                      ...       ...              ...   \n",
       "51995   BYS--QC-4--it-0--2020-11-24T13-56-31 -0.836482              NaN   \n",
       "51996   BYS--QC-4--it-1--2020-11-24T21-28-19 -0.811100              NaN   \n",
       "51997   BYS--QC-4--it-0--2020-11-24T14-57-24 -0.662839              NaN   \n",
       "51998   BYS--QC-4--it-1--2020-11-24T01-02-06 -0.836020              NaN   \n",
       "51999   BYS--QC-4--it-1--2020-11-25T04-28-56 -0.841722              NaN   \n",
       "\n",
       "       during_initialization     timestamp_trials        timestamp_exp  \n",
       "0                        NaN  2020-11-26T08-15-17  2020-11-24T00-19-28  \n",
       "1                        NaN  2020-11-26T08-15-17  2020-11-23T04-47-48  \n",
       "2                        NaN  2020-11-26T08-15-17  2020-11-25T16-15-43  \n",
       "3                        NaN  2020-11-26T08-15-17  2020-11-23T02-34-00  \n",
       "4                        NaN  2020-11-26T08-15-17  2020-11-23T00-07-47  \n",
       "...                      ...                  ...                  ...  \n",
       "51995                    NaN  2020-11-25T12-04-15  2020-11-24T13-56-31  \n",
       "51996                    NaN  2020-11-25T12-04-15  2020-11-24T21-28-19  \n",
       "51997                    NaN  2020-11-25T12-04-15  2020-11-24T14-57-24  \n",
       "51998                    NaN  2020-11-25T12-04-15  2020-11-24T01-02-06  \n",
       "51999                    NaN  2020-11-25T12-04-15  2020-11-25T04-28-56  \n",
       "\n",
       "[40000 rows x 33 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fname = \"Integrated Simulation-Based Optimization of Operational Decisions at Container Terminals - Dataset.xlsx\"\n",
    "df = pd.read_excel(fname, index_col=0)\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 40000 entries, 0 to 51999\n",
      "Data columns (total 33 columns):\n",
      " #   Column                 Non-Null Count  Dtype  \n",
      "---  ------                 --------------  -----  \n",
      " 0   index                  40000 non-null  int64  \n",
      " 1   procedure              40000 non-null  object \n",
      " 2   df_number              40000 non-null  int64  \n",
      " 3   number_tts             40000 non-null  int64  \n",
      " 4   number_ybs             40000 non-null  int64  \n",
      " 5   number_qcs             40000 non-null  int64  \n",
      " 6   yb_assignment_of_qcs   40000 non-null  object \n",
      " 7   qc_assignment_of_tts   40000 non-null  int64  \n",
      " 8   dispatching_weight_a   40000 non-null  int64  \n",
      " 9   dispatching_weight_b   40000 non-null  int64  \n",
      " 10  working_time_qcs       40000 non-null  int64  \n",
      " 11  working_time_ybs       40000 non-null  int64  \n",
      " 12  working_time_tts_avg   40000 non-null  float64\n",
      " 13  relative_throughput    40000 non-null  float64\n",
      " 14  working_time_each_qc   40000 non-null  int64  \n",
      " 15  utilization_each_qc    40000 non-null  float64\n",
      " 16  utilization_each_tt    40000 non-null  float64\n",
      " 17  working_time_each_yb   40000 non-null  float64\n",
      " 18  utilization_each_yb    40000 non-null  float64\n",
      " 19  total_investment       40000 non-null  float64\n",
      " 20  qc_weight              40000 non-null  float64\n",
      " 21  yb_weight              40000 non-null  float64\n",
      " 22  tt_weight              40000 non-null  float64\n",
      " 23  weighted_utilization   40000 non-null  float64\n",
      " 24  working_time_tts_min   40000 non-null  float64\n",
      " 25  working_time_tts_std   40000 non-null  float64\n",
      " 26  working_time_tts_max   40000 non-null  float64\n",
      " 27  optimization_run_name  40000 non-null  object \n",
      " 28  fitness                40000 non-null  float64\n",
      " 29  randomly_chosen        1000 non-null   float64\n",
      " 30  during_initialization  1000 non-null   float64\n",
      " 31  timestamp_trials       40000 non-null  object \n",
      " 32  timestamp_exp          40000 non-null  object \n",
      "dtypes: float64(17), int64(11), object(5)\n",
      "memory usage: 10.4+ MB\n"
     ]
    }
   ],
   "source": [
    "df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = df.assign(positive_fitness=-df.fitness)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Generate Figures"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(\n",
    "    figsize=(5, 3),\n",
    ")\n",
    "\n",
    "ax.boxplot(df[[\n",
    "    \"utilization_each_tt\",\n",
    "    \"utilization_each_yb\",\n",
    "    \"utilization_each_qc\",\n",
    "    \"weighted_utilization\",\n",
    "]] * 100)\n",
    "\n",
    "ax.set_xticks(list(range(1, 5)))\n",
    "ax.set_xticklabels([\n",
    "    \"YTs\",\n",
    "    \"YBs\",\n",
    "    \"QCs\",\n",
    "    \"Weighted\\nUtilization\",\n",
    "])\n",
    "ax.set_ylabel(\"Percentage\")\n",
    "ax.set_ylim([0, 100])\n",
    "plt.setp(ax.artists, edgecolor='k', facecolor='w')\n",
    "plt.setp(ax.lines, color='k')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = df.assign(difference_working_time_tts=df[\"working_time_tts_max\"] - df[\"working_time_tts_min\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(\n",
    "    figsize=(5, 3),\n",
    ")\n",
    "\n",
    "only_global = df[df[\"qc_assignment_of_tts\"] == 2]\n",
    "\n",
    "data = [\n",
    "    only_global[only_global[\"number_qcs\"] == 3][\"difference_working_time_tts\"].values / 3600,\n",
    "    only_global[only_global[\"number_qcs\"] == 4][\"difference_working_time_tts\"].values / 3600,\n",
    "    only_global[only_global[\"number_qcs\"] == 5][\"difference_working_time_tts\"].values / 3600,\n",
    "    only_global[only_global[\"number_qcs\"] == 6][\"difference_working_time_tts\"].values / 3600\n",
    "]\n",
    "\n",
    "ax.boxplot(data)\n",
    "\n",
    "ax.set_xticks(list(range(1, 5)))\n",
    "ax.set_xticklabels([\n",
    "    \"3 QCs\",\n",
    "    \"4 QCs\",\n",
    "    \"5 QCs\",\n",
    "    \"6 QCs\"\n",
    "])\n",
    "\n",
    "ax.set_ylabel(\"Time Difference (in hours)\")\n",
    "plt.setp(ax.artists, edgecolor='k', facecolor='w')\n",
    "plt.setp(ax.lines, color='k')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<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>index</th>\n",
       "      <th>procedure</th>\n",
       "      <th>df_number</th>\n",
       "      <th>number_tts</th>\n",
       "      <th>number_ybs</th>\n",
       "      <th>number_qcs</th>\n",
       "      <th>yb_assignment_of_qcs</th>\n",
       "      <th>qc_assignment_of_tts</th>\n",
       "      <th>dispatching_weight_a</th>\n",
       "      <th>dispatching_weight_b</th>\n",
       "      <th>...</th>\n",
       "      <th>working_time_tts_std</th>\n",
       "      <th>working_time_tts_max</th>\n",
       "      <th>optimization_run_name</th>\n",
       "      <th>fitness</th>\n",
       "      <th>randomly_chosen</th>\n",
       "      <th>during_initialization</th>\n",
       "      <th>timestamp_trials</th>\n",
       "      <th>timestamp_exp</th>\n",
       "      <th>positive_fitness</th>\n",
       "      <th>difference_working_time_tts</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>26</td>\n",
       "      <td>sa</td>\n",
       "      <td>662</td>\n",
       "      <td>29</td>\n",
       "      <td>18</td>\n",
       "      <td>6</td>\n",
       "      <td>N</td>\n",
       "      <td>2</td>\n",
       "      <td>70</td>\n",
       "      <td>30</td>\n",
       "      <td>...</td>\n",
       "      <td>1097.299387</td>\n",
       "      <td>46487.142857</td>\n",
       "      <td>SA--QC-6--it-0--2020-11-23T20-29-54</td>\n",
       "      <td>-0.843421</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2020-11-26T08-15-17</td>\n",
       "      <td>2020-11-23T20-29-54</td>\n",
       "      <td>0.843421</td>\n",
       "      <td>4840.595237</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>45</td>\n",
       "      <td>sa</td>\n",
       "      <td>663</td>\n",
       "      <td>16</td>\n",
       "      <td>12</td>\n",
       "      <td>4</td>\n",
       "      <td>N</td>\n",
       "      <td>2</td>\n",
       "      <td>10</td>\n",
       "      <td>90</td>\n",
       "      <td>...</td>\n",
       "      <td>11154.78224</td>\n",
       "      <td>75537.380954</td>\n",
       "      <td>SA--QC-4--it-4--2020-11-24T13-17-06</td>\n",
       "      <td>-0.776443</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2020-11-26T08-14-44</td>\n",
       "      <td>2020-11-24T13-17-06</td>\n",
       "      <td>0.776443</td>\n",
       "      <td>26672.976192</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>143</th>\n",
       "      <td>43</td>\n",
       "      <td>sa</td>\n",
       "      <td>664</td>\n",
       "      <td>21</td>\n",
       "      <td>19</td>\n",
       "      <td>5</td>\n",
       "      <td>N</td>\n",
       "      <td>2</td>\n",
       "      <td>20</td>\n",
       "      <td>80</td>\n",
       "      <td>...</td>\n",
       "      <td>2852.423212</td>\n",
       "      <td>52359.761905</td>\n",
       "      <td>RS--QC-5--it-0--2020-11-23T01-09-09</td>\n",
       "      <td>-0.739871</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2020-11-26T08-07-08</td>\n",
       "      <td>2020-11-23T01-09-09</td>\n",
       "      <td>0.739871</td>\n",
       "      <td>9810.833334</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>171</th>\n",
       "      <td>21</td>\n",
       "      <td>sa</td>\n",
       "      <td>665</td>\n",
       "      <td>12</td>\n",
       "      <td>9</td>\n",
       "      <td>3</td>\n",
       "      <td>N</td>\n",
       "      <td>2</td>\n",
       "      <td>40</td>\n",
       "      <td>60</td>\n",
       "      <td>...</td>\n",
       "      <td>15183.089304</td>\n",
       "      <td>101568.809525</td>\n",
       "      <td>TPE---QC-3--it-13--2020-11-25T18-29-20</td>\n",
       "      <td>-0.892063</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2020-11-26T08-06-35</td>\n",
       "      <td>2020-11-25T18-29-20</td>\n",
       "      <td>0.892063</td>\n",
       "      <td>35944.047619</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>242</th>\n",
       "      <td>42</td>\n",
       "      <td>sa</td>\n",
       "      <td>666</td>\n",
       "      <td>23</td>\n",
       "      <td>18</td>\n",
       "      <td>6</td>\n",
       "      <td>N</td>\n",
       "      <td>2</td>\n",
       "      <td>30</td>\n",
       "      <td>70</td>\n",
       "      <td>...</td>\n",
       "      <td>8182.707514</td>\n",
       "      <td>51977.261904</td>\n",
       "      <td>SA--QC-6--it-10--2020-11-25T11-50-30</td>\n",
       "      <td>-0.845699</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2020-11-26T07-58-26</td>\n",
       "      <td>2020-11-25T11-50-30</td>\n",
       "      <td>0.845699</td>\n",
       "      <td>21379.642856</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51696</th>\n",
       "      <td>46</td>\n",
       "      <td>bys</td>\n",
       "      <td>1695</td>\n",
       "      <td>31</td>\n",
       "      <td>20</td>\n",
       "      <td>5</td>\n",
       "      <td>N</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>100</td>\n",
       "      <td>...</td>\n",
       "      <td>9420.076149</td>\n",
       "      <td>57174.642857</td>\n",
       "      <td>BYS--QC-5--it-2--2020-11-25T04-12-02</td>\n",
       "      <td>-0.716888</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2020-11-25T13-03-50</td>\n",
       "      <td>2020-11-25T04-12-02</td>\n",
       "      <td>0.716888</td>\n",
       "      <td>25973.690476</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51713</th>\n",
       "      <td>13</td>\n",
       "      <td>bys</td>\n",
       "      <td>1696</td>\n",
       "      <td>23</td>\n",
       "      <td>12</td>\n",
       "      <td>6</td>\n",
       "      <td>N</td>\n",
       "      <td>2</td>\n",
       "      <td>50</td>\n",
       "      <td>50</td>\n",
       "      <td>...</td>\n",
       "      <td>7546.473968</td>\n",
       "      <td>52325.238096</td>\n",
       "      <td>BYS--QC-6--it-0--2020-11-24T20-03-16</td>\n",
       "      <td>-0.925641</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2020-11-25T13-00-48</td>\n",
       "      <td>2020-11-24T20-03-16</td>\n",
       "      <td>0.925641</td>\n",
       "      <td>19355.476191</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51777</th>\n",
       "      <td>27</td>\n",
       "      <td>bys</td>\n",
       "      <td>1697</td>\n",
       "      <td>19</td>\n",
       "      <td>20</td>\n",
       "      <td>5</td>\n",
       "      <td>N</td>\n",
       "      <td>2</td>\n",
       "      <td>10</td>\n",
       "      <td>90</td>\n",
       "      <td>...</td>\n",
       "      <td>6328.415737</td>\n",
       "      <td>51787.97619</td>\n",
       "      <td>TPE---QC-5--it-3--2020-11-24T23-00-54</td>\n",
       "      <td>-0.729675</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2020-11-25T12-47-54</td>\n",
       "      <td>2020-11-24T23-00-54</td>\n",
       "      <td>0.729675</td>\n",
       "      <td>18606.190476</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51905</th>\n",
       "      <td>5</td>\n",
       "      <td>bys</td>\n",
       "      <td>1700</td>\n",
       "      <td>19</td>\n",
       "      <td>20</td>\n",
       "      <td>4</td>\n",
       "      <td>N</td>\n",
       "      <td>2</td>\n",
       "      <td>70</td>\n",
       "      <td>30</td>\n",
       "      <td>...</td>\n",
       "      <td>2696.876433</td>\n",
       "      <td>69843.809524</td>\n",
       "      <td>BYS--QC-4--it-2--2020-11-25T02-33-55</td>\n",
       "      <td>-0.842992</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2020-11-25T12-10-22</td>\n",
       "      <td>2020-11-25T02-33-55</td>\n",
       "      <td>0.842992</td>\n",
       "      <td>7841.666667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51993</th>\n",
       "      <td>43</td>\n",
       "      <td>bys</td>\n",
       "      <td>1701</td>\n",
       "      <td>19</td>\n",
       "      <td>20</td>\n",
       "      <td>4</td>\n",
       "      <td>N</td>\n",
       "      <td>2</td>\n",
       "      <td>90</td>\n",
       "      <td>10</td>\n",
       "      <td>...</td>\n",
       "      <td>2444.482174</td>\n",
       "      <td>69098.571429</td>\n",
       "      <td>SA--QC-4--it-9--2020-11-25T03-20-03</td>\n",
       "      <td>-0.843106</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>2020-11-25T12-04-15</td>\n",
       "      <td>2020-11-25T03-20-03</td>\n",
       "      <td>0.843106</td>\n",
       "      <td>8715.714286</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>800 rows × 35 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      index procedure df_number number_tts number_ybs number_qcs  \\\n",
       "26       26        sa       662         29         18          6   \n",
       "95       45        sa       663         16         12          4   \n",
       "143      43        sa       664         21         19          5   \n",
       "171      21        sa       665         12          9          3   \n",
       "242      42        sa       666         23         18          6   \n",
       "...     ...       ...       ...        ...        ...        ...   \n",
       "51696    46       bys      1695         31         20          5   \n",
       "51713    13       bys      1696         23         12          6   \n",
       "51777    27       bys      1697         19         20          5   \n",
       "51905     5       bys      1700         19         20          4   \n",
       "51993    43       bys      1701         19         20          4   \n",
       "\n",
       "      yb_assignment_of_qcs qc_assignment_of_tts dispatching_weight_a  \\\n",
       "26                       N                    2                   70   \n",
       "95                       N                    2                   10   \n",
       "143                      N                    2                   20   \n",
       "171                      N                    2                   40   \n",
       "242                      N                    2                   30   \n",
       "...                    ...                  ...                  ...   \n",
       "51696                    N                    2                    0   \n",
       "51713                    N                    2                   50   \n",
       "51777                    N                    2                   10   \n",
       "51905                    N                    2                   70   \n",
       "51993                    N                    2                   90   \n",
       "\n",
       "      dispatching_weight_b  ... working_time_tts_std working_time_tts_max  \\\n",
       "26                      30  ...          1097.299387         46487.142857   \n",
       "95                      90  ...          11154.78224         75537.380954   \n",
       "143                     80  ...          2852.423212         52359.761905   \n",
       "171                     60  ...         15183.089304        101568.809525   \n",
       "242                     70  ...          8182.707514         51977.261904   \n",
       "...                    ...  ...                  ...                  ...   \n",
       "51696                  100  ...          9420.076149         57174.642857   \n",
       "51713                   50  ...          7546.473968         52325.238096   \n",
       "51777                   90  ...          6328.415737          51787.97619   \n",
       "51905                   30  ...          2696.876433         69843.809524   \n",
       "51993                   10  ...          2444.482174         69098.571429   \n",
       "\n",
       "                        optimization_run_name   fitness randomly_chosen  \\\n",
       "26        SA--QC-6--it-0--2020-11-23T20-29-54 -0.843421             NaN   \n",
       "95        SA--QC-4--it-4--2020-11-24T13-17-06 -0.776443             NaN   \n",
       "143       RS--QC-5--it-0--2020-11-23T01-09-09 -0.739871             NaN   \n",
       "171    TPE---QC-3--it-13--2020-11-25T18-29-20 -0.892063             NaN   \n",
       "242      SA--QC-6--it-10--2020-11-25T11-50-30 -0.845699             NaN   \n",
       "...                                       ...       ...             ...   \n",
       "51696    BYS--QC-5--it-2--2020-11-25T04-12-02 -0.716888             NaN   \n",
       "51713    BYS--QC-6--it-0--2020-11-24T20-03-16 -0.925641             NaN   \n",
       "51777   TPE---QC-5--it-3--2020-11-24T23-00-54 -0.729675             NaN   \n",
       "51905    BYS--QC-4--it-2--2020-11-25T02-33-55 -0.842992             NaN   \n",
       "51993     SA--QC-4--it-9--2020-11-25T03-20-03 -0.843106             NaN   \n",
       "\n",
       "      during_initialization     timestamp_trials        timestamp_exp  \\\n",
       "26                      NaN  2020-11-26T08-15-17  2020-11-23T20-29-54   \n",
       "95                      NaN  2020-11-26T08-14-44  2020-11-24T13-17-06   \n",
       "143                     NaN  2020-11-26T08-07-08  2020-11-23T01-09-09   \n",
       "171                     NaN  2020-11-26T08-06-35  2020-11-25T18-29-20   \n",
       "242                     NaN  2020-11-26T07-58-26  2020-11-25T11-50-30   \n",
       "...                     ...                  ...                  ...   \n",
       "51696                   NaN  2020-11-25T13-03-50  2020-11-25T04-12-02   \n",
       "51713                   NaN  2020-11-25T13-00-48  2020-11-24T20-03-16   \n",
       "51777                   NaN  2020-11-25T12-47-54  2020-11-24T23-00-54   \n",
       "51905                   NaN  2020-11-25T12-10-22  2020-11-25T02-33-55   \n",
       "51993                   NaN  2020-11-25T12-04-15  2020-11-25T03-20-03   \n",
       "\n",
       "      positive_fitness difference_working_time_tts  \n",
       "26            0.843421                 4840.595237  \n",
       "95            0.776443                26672.976192  \n",
       "143           0.739871                 9810.833334  \n",
       "171           0.892063                35944.047619  \n",
       "242           0.845699                21379.642856  \n",
       "...                ...                         ...  \n",
       "51696         0.716888                25973.690476  \n",
       "51713         0.925641                19355.476191  \n",
       "51777         0.729675                18606.190476  \n",
       "51905         0.842992                 7841.666667  \n",
       "51993         0.843106                 8715.714286  \n",
       "\n",
       "[800 rows x 35 columns]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def get_min(this_df):\n",
    "    return this_df.iloc[this_df.fitness.values.argmin()]\n",
    "\n",
    "sa_mins =   [get_min(this_df) for _, this_df in df[df.procedure == \"sa\"  ].groupby(\"df_number\")]\n",
    "tpe_mins =  [get_min(this_df) for _, this_df in df[df.procedure == \"tpe\" ].groupby(\"df_number\")]\n",
    "rand_mins = [get_min(this_df) for _, this_df in df[df.procedure == \"rand\"].groupby(\"df_number\")]\n",
    "bys_mins =  [get_min(this_df) for _, this_df in df[df.procedure == \"bys\" ].groupby(\"df_number\")]\n",
    "\n",
    "df_mins = pd.concat([\n",
    "    pd.DataFrame(pd.concat(sa_mins, axis=1)).T,\n",
    "    pd.DataFrame(pd.concat(tpe_mins, axis=1)).T,\n",
    "    pd.DataFrame(pd.concat(rand_mins, axis=1)).T,\n",
    "    pd.DataFrame(pd.concat(bys_mins, axis=1)).T\n",
    "], axis=0)\n",
    "\n",
    "df_mins"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 800 entries, 26 to 51993\n",
      "Data columns (total 35 columns):\n",
      " #   Column                       Non-Null Count  Dtype \n",
      "---  ------                       --------------  ----- \n",
      " 0   index                        800 non-null    object\n",
      " 1   procedure                    800 non-null    object\n",
      " 2   df_number                    800 non-null    object\n",
      " 3   number_tts                   800 non-null    object\n",
      " 4   number_ybs                   800 non-null    object\n",
      " 5   number_qcs                   800 non-null    object\n",
      " 6   yb_assignment_of_qcs         800 non-null    object\n",
      " 7   qc_assignment_of_tts         800 non-null    object\n",
      " 8   dispatching_weight_a         800 non-null    object\n",
      " 9   dispatching_weight_b         800 non-null    object\n",
      " 10  working_time_qcs             800 non-null    object\n",
      " 11  working_time_ybs             800 non-null    object\n",
      " 12  working_time_tts_avg         800 non-null    object\n",
      " 13  relative_throughput          800 non-null    object\n",
      " 14  working_time_each_qc         800 non-null    object\n",
      " 15  utilization_each_qc          800 non-null    object\n",
      " 16  utilization_each_tt          800 non-null    object\n",
      " 17  working_time_each_yb         800 non-null    object\n",
      " 18  utilization_each_yb          800 non-null    object\n",
      " 19  total_investment             800 non-null    object\n",
      " 20  qc_weight                    800 non-null    object\n",
      " 21  yb_weight                    800 non-null    object\n",
      " 22  tt_weight                    800 non-null    object\n",
      " 23  weighted_utilization         800 non-null    object\n",
      " 24  working_time_tts_min         800 non-null    object\n",
      " 25  working_time_tts_std         800 non-null    object\n",
      " 26  working_time_tts_max         800 non-null    object\n",
      " 27  optimization_run_name        800 non-null    object\n",
      " 28  fitness                      800 non-null    object\n",
      " 29  randomly_chosen              7 non-null      object\n",
      " 30  during_initialization        7 non-null      object\n",
      " 31  timestamp_trials             800 non-null    object\n",
      " 32  timestamp_exp                800 non-null    object\n",
      " 33  positive_fitness             800 non-null    object\n",
      " 34  difference_working_time_tts  800 non-null    object\n",
      "dtypes: object(35)\n",
      "memory usage: 225.0+ KB\n"
     ]
    }
   ],
   "source": [
    "df_mins.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x216 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots(\n",
    "    figsize=(5, 3),\n",
    ")\n",
    "\n",
    "overview = []\n",
    "\n",
    "for number_qcs, group in df_mins.groupby(\"number_qcs\"):\n",
    "    tts_per_qc = group[\"number_tts\"] / number_qcs\n",
    "    overview.append(tts_per_qc)\n",
    "\n",
    "usermedians = [statistics.median(o) for o in overview]\n",
    "usermedians[1] = usermedians[1] - 0.1\n",
    "\n",
    "ax.boxplot(list(reversed(overview)), usermedians=usermedians, vert=False)\n",
    "\n",
    "ax.set_yticks(list(range(1, 5)))\n",
    "ax.set_yticklabels([f\"{i} QCs\" for i in range(3, 7)])\n",
    "ax.set_xlabel(\"Number YTs for each QC\")\n",
    "\n",
    "ax.scatter(x=[4]*4, y=list(range(1, 5)), marker=\"*\",\n",
    "           edgecolors=\"white\", color=\"white\", s=100)\n",
    "\n",
    "ax.scatter(x=[4]*4, y=list(range(1, 5)), marker=\"*\",\n",
    "           color=\"k\",\n",
    "           edgecolors=\"k\", s=90)\n",
    "\n",
    "plt.setp(ax.artists, edgecolor='k', facecolor='w')\n",
    "plt.setp(ax.lines, color='k')\n",
    "plt.tight_layout()\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 504x504 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "common_gray_color = \"dimgray\"\n",
    "\n",
    "fig, axes = plt.subplots(\n",
    "    nrows=4,\n",
    "    figsize=(7, 7),\n",
    "    sharex=True\n",
    ")\n",
    "\n",
    "values = []\n",
    "for ax, number_qcs, best_sol in zip(axes, range(3, 7), [9, 15, 19, 12]):\n",
    "    this_df = df_mins[(df_mins[\"number_qcs\"] == number_qcs)]\n",
    "    counts, bins, bars = ax.hist(\n",
    "        this_df[\"number_ybs\"],\n",
    "        color=\"dimgray\",\n",
    "        align='left',\n",
    "        bins=list(range(6, 21))\n",
    "    )\n",
    "\n",
    "    ax.set_ylabel(f\"Frequency\\nfor {number_qcs} QCs\")\n",
    "    plt.setp(ax.artists, edgecolor='k', facecolor='w')\n",
    "    plt.setp(ax.lines, color='k')\n",
    "    \n",
    "    y_pos = dict(list(zip(bins, counts)))[best_sol]\n",
    "\n",
    "    ax.scatter(x=best_sol, y=y_pos * 105/100, marker=\"*\",\n",
    "               color=common_gray_color,\n",
    "               edgecolors=common_gray_color, linewidths=None)\n",
    "    ax.spines['bottom'].set_position('zero')\n",
    "\n",
    "plt.xlabel(\"Number YBs\")\n",
    "fig.align_ylabels(axes)\n",
    "plt.xticks(list(range(6, 21)))\n",
    "plt.tight_layout()\n",
    "plt.xlim([5.1, 20.9])\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x504 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axes = plt.subplots(\n",
    "    ncols=2,\n",
    "    nrows=2,\n",
    "    figsize=(10, 7),\n",
    "    sharey=True\n",
    ")\n",
    "\n",
    "translated = {\n",
    "    \"sa\" : \"SA\",\n",
    "    \"tpe\" : \"TPE\",\n",
    "    \"rand\" : \"RS\",\n",
    "    \"bys\" : \"BO\"\n",
    "}\n",
    "\n",
    "number_qcs = 3\n",
    "procedures = ['tpe', 'bys', 'sa', 'rand']\n",
    "for axes_col in axes:\n",
    "    for i, ax in enumerate(axes_col):\n",
    "        if i == 0:\n",
    "            ax.set_ylabel(\"Fitness\")\n",
    "        \n",
    "        fitness_values = []\n",
    "        for proc in procedures:\n",
    "            this_df = df_mins[(df_mins[\"number_qcs\"] == number_qcs) & (df_mins[\"procedure\"] == proc)]\n",
    "            fitness_values.append({\n",
    "                \"proc\" : proc,\n",
    "                \"fitness\" : -this_df[\"fitness\"]\n",
    "            })\n",
    "\n",
    "        ax.boxplot([f[\"fitness\"] for f in fitness_values])\n",
    "        ax.set_xticks(list(range(1, 5)))\n",
    "        ax.set_xticklabels([translated[p] for p in procedures])\n",
    "\n",
    "        ax.set_title(f\"Fitness after 50 iterations for {number_qcs} QCs\")\n",
    "\n",
    "        plt.setp(ax.artists, edgecolor='k', facecolor='w')\n",
    "        plt.setp(ax.lines, color='k')\n",
    "        number_qcs += 1\n",
    "\n",
    "plt.subplots_adjust(\n",
    "    wspace=0.05,\n",
    "    hspace=0.35\n",
    ")\n",
    "plt.tight_layout()\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, ax = plt.subplots()\n",
    "\n",
    "translated = {\n",
    "    \"sa\" : \"SA\",\n",
    "    \"tpe\" : \"TPE\",\n",
    "    \"rand\" : \"RS\",\n",
    "    \"bys\" : \"BO\"\n",
    "}\n",
    "\n",
    "procedures = ['tpe', 'bys', 'sa', 'rand']\n",
    "\n",
    "fitness_values = []\n",
    "for proc in procedures:\n",
    "    this_df = df_mins[(df_mins[\"procedure\"] == proc)]\n",
    "    fitness_values.append({\n",
    "        \"proc\" : proc,\n",
    "        \"fitness\" : -this_df[\"fitness\"]\n",
    "    })\n",
    "\n",
    "ax.boxplot([f[\"fitness\"] for f in fitness_values])\n",
    "ax.set_xticks(list(range(1, 5)))\n",
    "ax.set_xticklabels([translated[p] for p in procedures])\n",
    "\n",
    "ax.set_title(f\"Fitness after 50 iterations, all scenarios summarized\")\n",
    "\n",
    "plt.setp(ax.artists, edgecolor='k', facecolor='w')\n",
    "plt.setp(ax.lines, color='k')\n",
    "\n",
    "\n",
    "plt.subplots_adjust(\n",
    "    wspace=0.05,\n",
    "    hspace=0.35\n",
    ")\n",
    "plt.tight_layout()\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Statistics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.731404035858857, 0.8906619652158381, 0.8650091114597841,\n",
       "       0.8380369771946291, 0.878353952093692, 0.7401203059082071,\n",
       "       0.916726132764881, 0.865031475851286, 0.7245854983937541,\n",
       "       0.889388004927479, 0.8646512152674161, 0.8429965318888081,\n",
       "       0.8802965491919741, 0.7394965890122941, 0.843651705304811,\n",
       "       0.7412436187201981, 0.865031475851286, 0.864594571827596,\n",
       "       0.8920185250607331, 0.8920625612999541, 0.925017740983273,\n",
       "       0.829826835844203, 0.7413559252479011, 0.740400518822197,\n",
       "       0.8645823898969701, 0.8625016413003781, 0.8820025233362131,\n",
       "       0.8740320376356081, 0.834899187279956, 0.9149606186236251,\n",
       "       0.723796741791347, 0.7392548326123181, 0.864510377733199,\n",
       "       0.8640308974146491, 0.892074679872457, 0.8690127530409261,\n",
       "       0.8451679700015061, 0.9255906399867371, 0.736648606510469,\n",
       "       0.7371539376322911, 0.86374458510535, 0.8646729065918971,\n",
       "       0.889388004927479, 0.8893537018713901, 0.917354667758398,\n",
       "       0.923311974748874, 0.7384865659098461, 0.739871087716728,\n",
       "       0.8652186002981491, 0.8639528864795271, 0.8802230578436231,\n",
       "       0.8921738444892101, 0.8431828966534031, 0.8452176702947941,\n",
       "       0.733290005680131, 0.7411276305332011, 0.8568777400449791,\n",
       "       0.8654262581494071, 0.8919738733919931, 0.890869738269471,\n",
       "       0.8465387027906701, 0.7388891388113441, 0.84398272404411,\n",
       "       0.863080532722267, 0.7413614393325341, 0.8645184823064661,\n",
       "       0.891771348534061, 0.888984422995979, 0.9136589785565631,\n",
       "       0.9256407548305691, 0.7404491534078681, 0.741739122658809,\n",
       "       0.863686983842269, 0.8888457862045541, 0.8645184823064661,\n",
       "       0.925597137537934, 0.8891942929023551, 0.724586250240953,\n",
       "       0.8425512921542201, 0.7412436187201981, 0.9195904862814781,\n",
       "       0.8640411814548911, 0.7408035785894791, 0.8566877974701591,\n",
       "       0.739880445669931, 0.876346505249842, 0.8920625612999541,\n",
       "       0.8623278478316281, 0.888880631697029, 0.8646512152674161,\n",
       "       0.923520621599152, 0.9195784450531521, 0.846487318299977,\n",
       "       0.892023270474612, 0.7351244083137001, 0.738208516914977,\n",
       "       0.74146267079491, 0.923792680081127, 0.8646645557411881,\n",
       "       0.8530105714696311, 0.7413022024636341, 0.854538471598632,\n",
       "       0.8907983822264811, 0.890656350478059, 0.8920185250607331,\n",
       "       0.8628936218885821, 0.925981393120299, 0.845594754918173,\n",
       "       0.889298861001505, 0.741739122658809, 0.8355212009842741,\n",
       "       0.7244892170142481, 0.7412436187201981, 0.9255906399867371,\n",
       "       0.8645184823064661, 0.864787924695082, 0.892023270474612,\n",
       "       0.8645898010361891, 0.731608477641381, 0.8922853352337651,\n",
       "       0.8429965318888081, 0.8902994277666241, 0.8650945248231611,\n",
       "       0.8441765248878471, 0.843651705304811, 0.724137130733282,\n",
       "       0.888984422995979, 0.7412436187201981, 0.864510377733199,\n",
       "       0.8646729065918971, 0.7412436187201981, 0.9193130602281471,\n",
       "       0.880623366996907, 0.8860707519168831, 0.8652186002981491,\n",
       "       0.9214346355832821, 0.7412436187201981, 0.891771348534061,\n",
       "       0.845699314137892, 0.921516030853406, 0.7412436187201981,\n",
       "       0.723854814491367, 0.8652186002981491, 0.862066488840121,\n",
       "       0.7411316610683251, 0.8902193591616261, 0.8644669154914301,\n",
       "       0.8566877974701591, 0.8822055122926791, 0.890459912737769,\n",
       "       0.9256955088625901, 0.9221100848982321, 0.8922853352337651,\n",
       "       0.7412436187201981, 0.8452176702947941, 0.7399901102549981,\n",
       "       0.92543388005714, 0.736824705152579, 0.8643902323607011,\n",
       "       0.864334168312165, 0.8893537018713901, 0.8639528864795271,\n",
       "       0.7401203059082071, 0.890869738269471, 0.892023270474612,\n",
       "       0.9256984148681471, 0.8647525150571871, 0.923679274123936,\n",
       "       0.843279807040598, 0.740316169057568, 0.8891414146287181,\n",
       "       0.7401494296549761, 0.8642737269085691, 0.7397138614016401,\n",
       "       0.8465387027906701, 0.8645898010361891, 0.862381359685578,\n",
       "       0.8891384234518591, 0.878353952093692, 0.7369835142523601,\n",
       "       0.8891833218908911, 0.908007472396652, 0.8646729065918971,\n",
       "       0.923322943989561, 0.9214346355832821, 0.7398711510692451,\n",
       "       0.889298861001505, 0.731404035858857, 0.740962492232437,\n",
       "       0.9249352481245461, 0.8640308974146491, 0.859787688152543,\n",
       "       0.739310976829007, 0.862585753777352, 0.8891414146287181,\n",
       "       0.8820025233362131, 0.8888717448276781, 0.8646645557411881,\n",
       "       0.925207450892033, 0.91936909941316], dtype=object)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "array([0.7284737020137231, 0.8387101472507351, 0.812026555557078,\n",
       "       0.9255455728064901, 0.7298744782290061, 0.925997935826223,\n",
       "       0.7284737020137231, 0.8427450185238511, 0.842237937760237,\n",
       "       0.811847357340272, 0.923792680081127, 0.684438274911019,\n",
       "       0.923679274123936, 0.7284737020137231, 0.7302791430889951,\n",
       "       0.8421875563622561, 0.8082919193876411, 0.925981393120299,\n",
       "       0.72936635064932, 0.8427450185238511, 0.811847357340272,\n",
       "       0.9258116595747161, 0.7298744782290061, 0.8386302737696011,\n",
       "       0.8118381024968141, 0.8415948435636641, 0.7341455833882821,\n",
       "       0.7679909554870551, 0.9149606186236251, 0.728889243915641,\n",
       "       0.722101552591048, 0.8427450185238511, 0.811832268448016,\n",
       "       0.8421875563622561, 0.8118489370005221, 0.9256984148681471,\n",
       "       0.925847453691492, 0.7290629665569051, 0.8429916148192881,\n",
       "       0.7259413108857441, 0.8085325721946851, 0.9216157591831421,\n",
       "       0.8429916148192881, 0.8118489370005221, 0.9209826216919741,\n",
       "       0.7216691379951271, 0.841824943433595, 0.7290629665569051,\n",
       "       0.8390616058444841, 0.8112613449733641, 0.682911159064102,\n",
       "       0.921922381521959, 0.7298401939636661, 0.925868668428182,\n",
       "       0.727620845169858, 0.841514626131685, 0.811847357340272,\n",
       "       0.8427963809501271, 0.811331160285463, 0.9256407548305691,\n",
       "       0.92543388005714, 0.7298917715334471, 0.7299384957987071,\n",
       "       0.8415868395668781, 0.8118489370005221, 0.8429916148192881,\n",
       "       0.9103555213379101, 0.812026555557078, 0.728787379153582,\n",
       "       0.925847453691492, 0.6780416031912491, 0.8409348092316241,\n",
       "       0.838676724436842, 0.811762798726239, 0.812026555557078,\n",
       "       0.925981393120299, 0.925981393120299, 0.729650209573381,\n",
       "       0.7205445433387151, 0.8383614281506521, 0.811847357340272,\n",
       "       0.843105730607795, 0.8923395871069021, 0.807644158112865,\n",
       "       0.7221064638979541, 0.925868668428182, 0.842237937760237,\n",
       "       0.8118489370005221, 0.728453449898092, 0.903667667550293,\n",
       "       0.8427364486982901, 0.8118489370005221, 0.7302791430889951,\n",
       "       0.898995006433948, 0.8429535129953211, 0.7289687907058,\n",
       "       0.8386337769681581, 0.8118489370005221, 0.8080462874014781,\n",
       "       0.925868668428182, 0.9256984148681471, 0.727095410804783,\n",
       "       0.8429535129953211, 0.7298744782290061, 0.811847357340272,\n",
       "       0.8429916148192881, 0.8115396798320951, 0.92543388005714,\n",
       "       0.7260119626036501, 0.8429916148192881, 0.808468826731162,\n",
       "       0.9214430810264801, 0.7299384957987071, 0.925868668428182,\n",
       "       0.7236459760680121, 0.8427364486982901, 0.8118381024968141,\n",
       "       0.9256955088625901, 0.7296142797784051, 0.843105730607795,\n",
       "       0.8118381024968141, 0.8415993007940241, 0.9016861674499401,\n",
       "       0.811847357340272, 0.7299384957987071, 0.925868668428182,\n",
       "       0.811832268448016, 0.9256407548305691, 0.841721588261336,\n",
       "       0.8115396798320951, 0.729295633054553, 0.729489481176906,\n",
       "       0.8429916148192881, 0.9249352481245461, 0.8421875563622561,\n",
       "       0.811847357340272, 0.788446536140406, 0.72382104013917,\n",
       "       0.7298917715334471, 0.812026555557078, 0.925847453691492,\n",
       "       0.8971092782438551, 0.8391423906535611, 0.8429916148192881,\n",
       "       0.709501933578865, 0.7278650845687361, 0.774128279950387,\n",
       "       0.832090611135569, 0.811221497158184, 0.811847357340272,\n",
       "       0.920996662033535, 0.925868668428182, 0.8427364486982901,\n",
       "       0.720222770691442, 0.720222770691442, 0.8115396798320951,\n",
       "       0.8118381024968141, 0.8427364486982901, 0.8427450185238511,\n",
       "       0.727528294914599, 0.925847453691492, 0.8427364486982901,\n",
       "       0.8080462874014781, 0.7298917715334471, 0.925997935826223,\n",
       "       0.811847357340272, 0.729489481176906, 0.838861348136931,\n",
       "       0.811847357340272, 0.811832268448016, 0.925997935826223,\n",
       "       0.840966851302932, 0.9212179863153891, 0.775091501846455,\n",
       "       0.811762798726239, 0.9149336596691331, 0.72936635064932,\n",
       "       0.7258204878035741, 0.729594811305308, 0.9211263394743461,\n",
       "       0.729489481176906, 0.8427450185238511, 0.832004618841354,\n",
       "       0.814462210767523, 0.7289687907058, 0.8429535129953211,\n",
       "       0.8082808319432561, 0.8115396798320951, 0.811832268448016,\n",
       "       0.9258116595747161, 0.6845599598338731, 0.8429535129953211,\n",
       "       0.90574702813393, 0.921802815132272, 0.8118381024968141,\n",
       "       0.7168883852351671, 0.9256407548305691, 0.729674877611682,\n",
       "       0.8429916148192881, 0.843105730607795], dtype=object)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "array([0.843421417721086, 0.7764434249672101, 0.7398711510692451,\n",
       "       0.8920625612999541, 0.845699314137892, 0.8643902323607011,\n",
       "       0.7401925417846901, 0.8860286088015331, 0.8652186002981491,\n",
       "       0.8788276519476721, 0.8112816885043641, 0.9077355944083021,\n",
       "       0.724386314356103, 0.8652186002981491, 0.740343030435991,\n",
       "       0.8650091114597841, 0.889343157712102, 0.878046230011413,\n",
       "       0.84398272404411, 0.846379552133188, 0.720597402402079,\n",
       "       0.721356550309276, 0.7762199033567171, 0.865031475851286,\n",
       "       0.8728569084557811, 0.892023270474612, 0.8455298123118871,\n",
       "       0.842970266626459, 0.7233378464437641, 0.7234274351450231,\n",
       "       0.8647525150571871, 0.864510377733199, 0.8821832176811151,\n",
       "       0.799189698933046, 0.8451679700015061, 0.7245854983937541,\n",
       "       0.925981393120299, 0.740343030435991, 0.8627204826336431,\n",
       "       0.8861312903205331, 0.8638058510539941, 0.9256407548305691,\n",
       "       0.741739122658809, 0.8761360798333561, 0.843421417721086,\n",
       "       0.7237006356929641, 0.8647525150571871, 0.851627501384929,\n",
       "       0.878353952093692, 0.878353952093692, 0.84398272404411,\n",
       "       0.845576228540945, 0.7411316610683251, 0.8639239622305861,\n",
       "       0.7245889298786271, 0.7998305923194451, 0.863686983842269,\n",
       "       0.8689917253903301, 0.846487318299977, 0.8434074058293941,\n",
       "       0.7245854983937541, 0.8652186002981491, 0.7413614393325341,\n",
       "       0.8788276519476721, 0.846379552133188, 0.8596957269230521,\n",
       "       0.890459912737769, 0.7046845852534891, 0.8442805063945801,\n",
       "       0.8652186002981491, 0.8920185250607331, 0.7237006356929641,\n",
       "       0.84398272404411, 0.7221646672841041, 0.774903438612195,\n",
       "       0.8600313952704871, 0.866178396961324, 0.869261153962219,\n",
       "       0.846379552133188, 0.921516030853406, 0.72035172455592,\n",
       "       0.8650091114597841, 0.723796741791347, 0.8818020088593981,\n",
       "       0.8650945248231611, 0.8459586459653311, 0.8920185250607331,\n",
       "       0.741739122658809, 0.8426953686445151, 0.8600313952704871,\n",
       "       0.7997205859973311, 0.7401494296549761, 0.845576228540945,\n",
       "       0.8517176154929671, 0.739762318424191, 0.856512188058923,\n",
       "       0.791054732252453, 0.8000918161032601, 0.843951190266319,\n",
       "       0.7401494296549761, 0.846379552133188, 0.864510377733199,\n",
       "       0.717891247617716, 0.8891942929023551, 0.8650091114597841,\n",
       "       0.8442805063945801, 0.740343030435991, 0.881960417167136,\n",
       "       0.9141444083788861, 0.7766322471779451, 0.7233378464437641,\n",
       "       0.889388004927479, 0.8650091114597841, 0.846108941837571,\n",
       "       0.8764270614056421, 0.721452002541194, 0.8421649170552361,\n",
       "       0.863914828648597, 0.7245854983937541, 0.8920185250607331,\n",
       "       0.8645184823064661, 0.843951190266319, 0.8802965491919741,\n",
       "       0.724386314356103, 0.842358792856531, 0.7405825395501441,\n",
       "       0.862826792009846, 0.8922853352337651, 0.8652186002981491,\n",
       "       0.8455298123118871, 0.8802230578436231, 0.846379552133188,\n",
       "       0.7233378464437641, 0.8650091114597841, 0.7244555523386,\n",
       "       0.7990108177232641, 0.8652186002981491, 0.797045461404137,\n",
       "       0.845699314137892, 0.8459586459653311, 0.740343030435991,\n",
       "       0.7237006356929641, 0.8650091114597841, 0.885933538150359,\n",
       "       0.8643867737924871, 0.880679430574919, 0.840596640806561,\n",
       "       0.8455298123118871, 0.7351500497258651, 0.7241132581302391,\n",
       "       0.8649110716467491, 0.8802158569291171, 0.863914828648597,\n",
       "       0.8802230578436231, 0.843951190266319, 0.7404491534078681,\n",
       "       0.846108941837571, 0.8513597445421691, 0.7241132581302391,\n",
       "       0.880871459165509, 0.8651802714970831, 0.846379552133188,\n",
       "       0.8893088743067771, 0.7411316610683251, 0.865031475851286,\n",
       "       0.845594754918173, 0.888984422995979, 0.722435241010263,\n",
       "       0.8384750145862321, 0.7234274351450231, 0.8652186002981491,\n",
       "       0.86394198939059, 0.881709624654028, 0.799189698933046,\n",
       "       0.84398272404411, 0.8458064596440951, 0.741104709498778,\n",
       "       0.8592285769827551, 0.724057742914137, 0.880871459165509,\n",
       "       0.8646645557411881, 0.843440956608788, 0.8802719825408241,\n",
       "       0.7413022024636341, 0.8442805063945801, 0.865031475851286,\n",
       "       0.7402702197552771, 0.799189698933046, 0.8644669154914301,\n",
       "       0.843440956608788, 0.845563867664825, 0.8860286088015331,\n",
       "       0.7245854983937541, 0.8452115579529451, 0.7413614393325341,\n",
       "       0.8652186002981491, 0.8650091114597841, 0.7405825395501441,\n",
       "       0.880871459165509, 0.79899203941979], dtype=object)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "array([0.8785465423314851, 0.90340648038683, 0.9198300034415111,\n",
       "       0.7184728047557011, 0.7284737020137231, 0.8650945248231611,\n",
       "       0.8640308974146491, 0.8788276519476721, 0.8890406458298341,\n",
       "       0.9141444083788861, 0.7331930613136081, 0.921634690947922,\n",
       "       0.855427812751101, 0.738208516914977, 0.798725230838719,\n",
       "       0.8624301672885271, 0.9208344918315511, 0.8077071377457271,\n",
       "       0.7388891388113441, 0.921842245605039, 0.8645184823064661,\n",
       "       0.7171463060777631, 0.808906612932454, 0.724386314356103,\n",
       "       0.8597973804790351, 0.7297465673810011, 0.8617669408870041,\n",
       "       0.7799043202857021, 0.870144099242515, 0.908007472396652,\n",
       "       0.8040359920262571, 0.70362021503667, 0.738798327959428,\n",
       "       0.855556699013665, 0.7984155252173181, 0.863914828648597,\n",
       "       0.8236673508787751, 0.8917007687358961, 0.7398711510692451,\n",
       "       0.921499844054485, 0.8442834795031081, 0.728787379153582,\n",
       "       0.8644669154914301, 0.8802634606463361, 0.810771212987888,\n",
       "       0.87912015723069, 0.8306435844413691, 0.7104154414756101,\n",
       "       0.8409551346321531, 0.7384865659098461, 0.880871459165509,\n",
       "       0.8624301672885271, 0.910179283729834, 0.7829650114645701,\n",
       "       0.729471192857807, 0.8964183244421841, 0.8496089861307421,\n",
       "       0.7243281560558831, 0.892023270474612, 0.859787688152543,\n",
       "       0.7658823061230761, 0.9210112253949401, 0.846379552133188,\n",
       "       0.705023062844776, 0.7394965890122941, 0.8636867977062491,\n",
       "       0.865528832499946, 0.858742789569724, 0.8424658429855171,\n",
       "       0.878806442176089, 0.8983948095941371, 0.728155549613365,\n",
       "       0.677514917984791, 0.8637083436882851, 0.840629924298374,\n",
       "       0.8761360798333561, 0.8738785947895501, 0.8273636553809841,\n",
       "       0.806083358110337, 0.8555548267602541, 0.7413614393325341,\n",
       "       0.869224650672326, 0.7128047168333641, 0.8645898010361891,\n",
       "       0.855397679016433, 0.9195784450531521, 0.881960417167136,\n",
       "       0.8777921508426291, 0.916588359342238, 0.7225377138226691,\n",
       "       0.9193885192590181, 0.8470432674281311, 0.72382104013917,\n",
       "       0.731629958414399, 0.8860707519168831, 0.8403413164408141,\n",
       "       0.8627218882790441, 0.921172778919997, 0.8822055122926791,\n",
       "       0.7233378464437641, 0.881642349357572, 0.7988689293991601,\n",
       "       0.863129233582099, 0.8088314971804831, 0.7217786957204131,\n",
       "       0.86207604757915, 0.7412077130822661, 0.8544668088474001,\n",
       "       0.8639128936396641, 0.836347158840898, 0.7627305212133411,\n",
       "       0.8115396798320951, 0.8442805063945801, 0.706865473341803,\n",
       "       0.9149606186236251, 0.839248664492216, 0.714379301751024,\n",
       "       0.7398711510692451, 0.855556699013665, 0.8888457862045541,\n",
       "       0.8567153731657601, 0.9058552865010191, 0.8821832176811151,\n",
       "       0.8040995733577531, 0.8222482966964261, 0.722262628914311,\n",
       "       0.9077355944083021, 0.720597402402079, 0.8625255554095551,\n",
       "       0.7392548326123181, 0.8638599340099901, 0.890869738269471,\n",
       "       0.8728569084557811, 0.854518433781243, 0.9136589785565631,\n",
       "       0.925597137537934, 0.8788276519476721, 0.7392548326123181,\n",
       "       0.7234274351450231, 0.8422948655332401, 0.8596849663980851,\n",
       "       0.842675534509374, 0.740962492232437, 0.8788276519476721,\n",
       "       0.8697472741290051, 0.8427364486982901, 0.923322943989561,\n",
       "       0.8112797268328471, 0.8821832176811151, 0.7278650845687361,\n",
       "       0.7244555523386, 0.8306435844413691, 0.8647525150571871,\n",
       "       0.733290005680131, 0.8638477198579441, 0.8775972551495631,\n",
       "       0.845267270741841, 0.8802719825408241, 0.802455130905329,\n",
       "       0.7649045243693271, 0.7908634727975421, 0.705675471516495,\n",
       "       0.9103555213379101, 0.7167887845163881, 0.8179835728356251,\n",
       "       0.7256828018413171, 0.864253387449585, 0.7528737650131111,\n",
       "       0.862585753777352, 0.889026637921532, 0.917354667758398,\n",
       "       0.8657865563198751, 0.8198008839259231, 0.7351500497258651,\n",
       "       0.8452344128600741, 0.8646512152674161, 0.7388815030923721,\n",
       "       0.729489481176906, 0.8887649179194511, 0.8608982091910451,\n",
       "       0.9210112253949401, 0.8381436094450061, 0.853555777146841,\n",
       "       0.7371539376322911, 0.8860286088015331, 0.840685305868557,\n",
       "       0.9149336596691331, 0.921499844054485, 0.72773241433079,\n",
       "       0.87381918640748, 0.7397138614016401, 0.862381359685578,\n",
       "       0.914358504974169, 0.843951190266319, 0.7557988178598981,\n",
       "       0.857159651351683, 0.7410074059061691, 0.8891225989651821,\n",
       "       0.8643902323607011, 0.7388815030923721], dtype=object)"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fval_tpe = fitness_values[0]\n",
    "assert fval_tpe['proc'] == 'tpe'\n",
    "fval_tpe = fval_tpe['fitness'].values\n",
    "assert type(fval_tpe) == np.ndarray\n",
    "display(fval_tpe)\n",
    "\n",
    "fval_bo = fitness_values[1]\n",
    "assert fval_bo['proc'] == 'bys'\n",
    "fval_bo = fval_bo['fitness'].values\n",
    "assert type(fval_bo) == np.ndarray\n",
    "assert not np.array_equal(fval_tpe, fval_bo)\n",
    "display(fval_bo)\n",
    "\n",
    "fval_sa = fitness_values[2]\n",
    "assert fval_sa['proc'] == 'sa'\n",
    "fval_sa = fval_sa['fitness'].values\n",
    "assert type(fval_sa) == np.ndarray\n",
    "assert not np.array_equal(fval_sa, fval_tpe)\n",
    "assert not np.array_equal(fval_sa, fval_bo)\n",
    "display(fval_sa)\n",
    "\n",
    "fval_rs = fitness_values[3]\n",
    "assert fval_rs['proc'] == 'rand'\n",
    "fval_rs = fval_rs['fitness'].values\n",
    "assert type(fval_rs) == np.ndarray\n",
    "assert not np.array_equal(fval_rs, fval_tpe)\n",
    "assert not np.array_equal(fval_rs, fval_bo)\n",
    "assert not np.array_equal(fval_rs, fval_sa)\n",
    "display(fval_rs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.8645504361017181 0.8442785995917004 0.723796741791347\n",
      "0.8460337939014511 0.825957090433468 0.7046845852534891\n",
      "0.812026555557078 0.8201605410522251 0.6780416031912491\n",
      "0.8544926213143216 0.8275191901391717 0.677514917984791\n"
     ]
    }
   ],
   "source": [
    "for fval in [fval_tpe, fval_sa, fval_bo, fval_rs]:\n",
    "    print(statistics.median(fval), statistics.mean(fval), min(fval))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KruskalResult(statistic=31.30282054970994, pvalue=7.339622433862359e-07)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "scipy.stats.kruskal(fval_tpe, fval_sa, fval_bo, fval_rs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'0.00000073'"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\"{:.8f}\".format(float(\"7.339622433862359e-07\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It is significant and $H_0$ can be discarded.\n",
    "Therefore, there is a difference between the groups."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<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>TPE</th>\n",
       "      <th>SA</th>\n",
       "      <th>BO</th>\n",
       "      <th>RS</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>method</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>TPE</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.004143</td>\n",
       "      <td>0.000002</td>\n",
       "      <td>0.004744</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SA</th>\n",
       "      <td>0.004143</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.350344</td>\n",
       "      <td>0.999983</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>BO</th>\n",
       "      <td>0.000002</td>\n",
       "      <td>0.350344</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.330266</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>RS</th>\n",
       "      <td>0.004744</td>\n",
       "      <td>0.999983</td>\n",
       "      <td>0.330266</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             TPE        SA        BO        RS\n",
       "method                                        \n",
       "TPE     1.000000  0.004143  0.000002  0.004744\n",
       "SA      0.004143  1.000000  0.350344  0.999983\n",
       "BO      0.000002  0.350344  1.000000  0.330266\n",
       "RS      0.004744  0.999983  0.330266  1.000000"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = scikit_posthocs.posthoc_nemenyi(\n",
    "    [fval_tpe, fval_sa, fval_bo, fval_rs],\n",
    ")\n",
    "x.columns = [\"TPE\", \"SA\", \"BO\", \"RS\"]\n",
    "x = x.assign(method=[\"TPE\", \"SA\", \"BO\", \"RS\"])\n",
    "x.set_index(\"method\", inplace=True)\n",
    "x"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Bonferroni-corrected: instead of $0.01$, check for $0.005$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<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>TPE</th>\n",
       "      <th>SA</th>\n",
       "      <th>BO</th>\n",
       "      <th>RS</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>method</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>TPE</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SA</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>BO</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>RS</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          TPE     SA     BO     RS\n",
       "method                            \n",
       "TPE     False   True   True   True\n",
       "SA       True  False  False  False\n",
       "BO       True  False  False  False\n",
       "RS       True  False  False  False"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x < 0.005"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "number_qcs       \n",
       "3           6391     0.892285\n",
       "4           16846    0.865426\n",
       "5           19420    0.741739\n",
       "6           42174    0.925998\n",
       "Name: positive_fitness, dtype: object"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "best_approximation = df_mins.groupby(\n",
    "    \"number_qcs\")[\"positive_fitness\"].apply(lambda x: x.sort_values(ascending=False).head(1))\n",
    "best_approximation"
   ]
  }
 ],
 "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.9"
  },
  "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": 2
}
