diff --git a/EvoloPy.ipynb b/EvoloPy.ipynb index 9832bc4..06d76c7 100644 --- a/EvoloPy.ipynb +++ b/EvoloPy.ipynb @@ -1,1992 +1,2006 @@ { - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "name": "EvoloPy.ipynb", - "provenance": [], - "collapsed_sections": [], - "include_colab_link": true - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "widgets": { - "application/vnd.jupyter.widget-state+json": { - "3a32992a7be9497c949bc06a2e838a1d": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DropdownModel", - "state": { - "_options_labels": [ - "2020-05-15-13-41-36" - ], - "_view_name": "DropdownView", - "style": "IPY_MODEL_3633a55c7efe490784594bad5694800d", - "_dom_classes": [], - "description": "Select folder:", - "_model_name": "DropdownModel", - "index": 0, - "_view_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_view_count": null, - "disabled": false, - "_view_module_version": "1.5.0", - "description_tooltip": null, - "_model_module": "@jupyter-widgets/controls", - "layout": "IPY_MODEL_75acaa0a501744f7817d0864462e8a7e" - } - }, - "3633a55c7efe490784594bad5694800d": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "state": { - "_view_name": "StyleView", - "_model_name": "DescriptionStyleModel", - "description_width": "", - "_view_module": "@jupyter-widgets/base", - "_model_module_version": "1.5.0", - "_view_count": null, - "_view_module_version": "1.2.0", - "_model_module": "@jupyter-widgets/controls" - } - }, - "75acaa0a501744f7817d0864462e8a7e": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "state": { - "_view_name": "LayoutView", - "grid_template_rows": null, - "right": null, - "justify_content": null, - "_view_module": "@jupyter-widgets/base", - "overflow": null, - "_model_module_version": "1.2.0", - "_view_count": null, - "flex_flow": null, - "width": null, - "min_width": null, - "border": null, - "align_items": null, - "bottom": null, - "_model_module": "@jupyter-widgets/base", - "top": null, - "grid_column": null, - "overflow_y": null, - "overflow_x": null, - "grid_auto_flow": null, - "grid_area": null, - "grid_template_columns": null, - "flex": null, - "_model_name": "LayoutModel", - "justify_items": null, - "grid_row": null, - "max_height": null, - "align_content": null, - "visibility": null, - "align_self": null, - "height": null, - "min_height": null, - "padding": null, - "grid_auto_rows": null, - "grid_gap": null, - "max_width": null, - "order": null, - "_view_module_version": "1.2.0", - "grid_template_areas": null, - "object_position": null, - "object_fit": null, - "grid_auto_columns": null, - "margin": null, - "display": null, - "left": null - } - }, - "e4a83005aaa043d48540b6f4202070e5": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DropdownModel", - "state": { - "_options_labels": [ - "convergence-F4.png", - "convergence-F3.png" - ], - "_view_name": "DropdownView", - "style": "IPY_MODEL_641b5f943c8e419583baaf02485acffb", - "_dom_classes": [], - "description": "Select plot:", - "_model_name": "DropdownModel", - "index": 0, - "_view_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_view_count": null, - "disabled": false, - "_view_module_version": "1.5.0", - "description_tooltip": null, - "_model_module": "@jupyter-widgets/controls", - "layout": "IPY_MODEL_45a8720657764f1585859c3d3dae8745" - } - }, - "641b5f943c8e419583baaf02485acffb": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "state": { - "_view_name": "StyleView", - "_model_name": "DescriptionStyleModel", - "description_width": "", - "_view_module": "@jupyter-widgets/base", - "_model_module_version": "1.5.0", - "_view_count": null, - "_view_module_version": "1.2.0", - "_model_module": "@jupyter-widgets/controls" - } - }, - "45a8720657764f1585859c3d3dae8745": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "state": { - "_view_name": "LayoutView", - "grid_template_rows": null, - "right": null, - "justify_content": null, - "_view_module": "@jupyter-widgets/base", - "overflow": null, - "_model_module_version": "1.2.0", - "_view_count": null, - "flex_flow": null, - "width": null, - "min_width": null, - "border": null, - "align_items": null, - "bottom": null, - "_model_module": "@jupyter-widgets/base", - "top": null, - "grid_column": null, - "overflow_y": null, - "overflow_x": null, - "grid_auto_flow": null, - "grid_area": null, - "grid_template_columns": null, - "flex": null, - "_model_name": "LayoutModel", - "justify_items": null, - "grid_row": null, - "max_height": null, - "align_content": null, - "visibility": null, - "align_self": null, - "height": null, - "min_height": null, - "padding": null, - "grid_auto_rows": null, - "grid_gap": null, - "max_width": null, - "order": null, - "_view_module_version": "1.2.0", - "grid_template_areas": null, - "object_position": null, - "object_fit": null, - "grid_auto_columns": null, - "margin": null, - "display": null, - "left": null - } - }, - "91e278780d5b4dcda11e832e971044f3": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DropdownModel", - "state": { - "_options_labels": [ - "boxplot-F3.png", - "boxplot-F4.png" - ], - "_view_name": "DropdownView", - "style": "IPY_MODEL_c1b161beed5c4b128b06a09d7a5be2fe", - "_dom_classes": [], - "description": "Select plot:", - "_model_name": "DropdownModel", - "index": 1, - "_view_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_view_count": null, - "disabled": false, - "_view_module_version": "1.5.0", - "description_tooltip": null, - "_model_module": "@jupyter-widgets/controls", - "layout": "IPY_MODEL_b08d8ae9147047acac84d9e52bfee64f" - } - }, - "c1b161beed5c4b128b06a09d7a5be2fe": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "state": { - "_view_name": "StyleView", - "_model_name": "DescriptionStyleModel", - "description_width": "", - "_view_module": "@jupyter-widgets/base", - "_model_module_version": "1.5.0", - "_view_count": null, - "_view_module_version": "1.2.0", - "_model_module": "@jupyter-widgets/controls" - } - }, - "b08d8ae9147047acac84d9e52bfee64f": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "state": { - "_view_name": "LayoutView", - "grid_template_rows": null, - "right": null, - "justify_content": null, - "_view_module": "@jupyter-widgets/base", - "overflow": null, - "_model_module_version": "1.2.0", - "_view_count": null, - "flex_flow": null, - "width": null, - "min_width": null, - "border": null, - "align_items": null, - "bottom": null, - "_model_module": "@jupyter-widgets/base", - "top": null, - "grid_column": null, - "overflow_y": null, - "overflow_x": null, - "grid_auto_flow": null, - "grid_area": null, - "grid_template_columns": null, - "flex": null, - "_model_name": "LayoutModel", - "justify_items": null, - "grid_row": null, - "max_height": null, - "align_content": null, - "visibility": null, - "align_self": null, - "height": null, - "min_height": null, - "padding": null, - "grid_auto_rows": null, - "grid_gap": null, - "max_width": null, - "order": null, - "_view_module_version": "1.2.0", - "grid_template_areas": null, - "object_position": null, - "object_fit": null, - "grid_auto_columns": null, - "margin": null, - "display": null, - "left": null - } - } - } - } + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "view-in-github" + }, + "source": [ + "\"Open" + ] }, - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "view-in-github", - "colab_type": "text" - }, - "source": [ - "\"Open" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "IiNG95DSmRmt", - "colab_type": "text" - }, - "source": [ - "

EvoloPy

\n", - "An open source nature-inspired optimization toolbox for global optimization in Python" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "hKzyadcdm6yw", - "colab_type": "text" - }, - "source": [ - "The EvoloPy toolbox provides classical and recent nature-inspired metaheuristic for the global optimization. The list of optimizers that have been implemented includes Particle Swarm Optimization (PSO), Multi-Verse Optimizer (MVO), Grey Wolf Optimizer (GWO), and Moth Flame Optimization (MFO)." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "2zQnPqDUujil", - "colab_type": "text" - }, - "source": [ - "The full list of implemented optimizers is available here https://github.com/7ossam81/EvoloPy/wiki/List-of-optimizers" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "ehxW3t0puwpm", - "colab_type": "text" - }, - "source": [ - "

Features

" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "TufeO-Rturq8", - "colab_type": "text" - }, - "source": [ - "* Fourteen nature-inspired metaheuristic optimizers are implemented.\n", - "* The implimentation uses the fast array manipulation using [NumPy] (http://www.numpy.org/).\n", - "* Matrix support using [SciPy's] (https://www.scipy.org/) package.\n", - "* More optimizers are comming soon" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "oG2TRdx-vf8m", - "colab_type": "text" - }, - "source": [ - "

Installation

" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "_XpMUOZNvi9H", - "colab_type": "text" - }, - "source": [ - "Python 3.xx is required." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "f_PVAZC6v7px", - "colab_type": "text" - }, - "source": [ - "

GitHub

" - ] + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "IiNG95DSmRmt" + }, + "source": [ + "

EvoloPy

\n", + "An open source nature-inspired optimization toolbox for global optimization in Python" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "hKzyadcdm6yw" + }, + "source": [ + "The EvoloPy toolbox provides classical and recent nature-inspired metaheuristic for the global optimization. The list of optimizers that have been implemented includes Particle Swarm Optimization (PSO), Multi-Verse Optimizer (MVO), Grey Wolf Optimizer (GWO), and Moth Flame Optimization (MFO)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "2zQnPqDUujil" + }, + "source": [ + "The full list of implemented optimizers is available here https://github.com/7ossam81/EvoloPy/wiki/List-of-optimizers" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "ehxW3t0puwpm" + }, + "source": [ + "

Features

" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "TufeO-Rturq8" + }, + "source": [ + "* Fourteen nature-inspired metaheuristic optimizers are implemented.\n", + "* The implimentation uses the fast array manipulation using [NumPy] (http://www.numpy.org/).\n", + "* Matrix support using [SciPy's] (https://www.scipy.org/) package.\n", + "* More optimizers are comming soon" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "oG2TRdx-vf8m" + }, + "source": [ + "

Installation

" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "_XpMUOZNvi9H" + }, + "source": [ + "Python 3.xx is required." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "f_PVAZC6v7px" + }, + "source": [ + "

GitHub

" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "aW_66ovkv2ev" + }, + "source": [ + "Clone the Git repository from GitHub:\n", + "git clone https://github.com/7ossam81/EvoloPy.git" + ] + }, + { + "cell_type": "raw", + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "QgrmE2wEyC_X" + }, + "source": [ + "!git clone https://github.com/7ossam81/EvoloPy.git" + ] + }, + { + "cell_type": "raw", + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "_yVUbtjcyiZR" + }, + "source": [ + "# Change working directory\n", + "import os\n", + "os.chdir(\"EvoloPy/\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "S4j-t-nXxaM7" + }, + "source": [ + "

Install Packages

" + ] + }, + { + "cell_type": "raw", + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "-mG8vIuIW1n8" + }, + "source": [ + "#Install NumPy, SciPy, sklearn, pandas, and matplotlib\n", + "!pip install -r requirements.txt" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "fEon-wGyZuq4" + }, + "source": [ + "

User Preferences

" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "cFF9ioDfyppV" + }, + "outputs": [], + "source": [ + "# Select optimizers\n", + "# \"SSA\",\"PSO\",\"GA\",\"BAT\",\"FFA\",\"GWO\",\"WOA\",\"MVO\",\"MFO\",\"CS\",\"HHO\",\"SCA\",\"JAYA\",\"DE\"\n", + "optimizer=[\"SSA\",\"PSO\",\"GWO\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "SuWo96bB6ohe" + }, + "outputs": [], + "source": [ + "# Select benchmark function\"\n", + "# \"F1\",\"F2\",\"F3\",\"F4\",\"F5\",\"F6\",\"F7\",\"F8\",\"F9\",\"F10\",\"F11\",\"F12\",\"F13\",\"F14\",\"F15\",\"F16\",\"F17\",\"F18\",\"F19\"\n", + "objectivefunc=[\"F3\",\"F4\"] " + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "CQyWvdS3Ipgt" + }, + "outputs": [], + "source": [ + "# Select number of repetitions for each experiment. \n", + "# To obtain meaningful statistical results, usually 30 independent runs are executed for each algorithm.\n", + "NumOfRuns=3" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "2djrIRh26sKB" + }, + "outputs": [], + "source": [ + "# Select general parameters for all optimizers (population size, number of iterations) ....\n", + "params = {'PopulationSize' : 30, 'Iterations' : 50}" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "aJb075Np62GM" + }, + "outputs": [], + "source": [ + "#Choose whether to Export the results in different formats\n", + "export_flags = {'Export_avg':True, 'Export_details':True, \n", + "'Export_convergence':True, 'Export_boxplot':True}" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "KAgXf1QkZD7X" + }, + "source": [ + "

Run Framework

" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "APzDcxiwI8A2" + }, + "outputs": [], + "source": [ + "# Run EvoCluster\n", + "from optimizer import run\n", + "run(optimizer, objectivefunc, NumOfRuns, params, export_flags)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "1mB9AVhQuwbH" + }, + "source": [ + "

Results Files and Plots

" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "642Oh7QUpRhL" + }, + "outputs": [], + "source": [ + "#import some useful packages to view the results' files in colab\n", + "import pandas as pd\n", + "from IPython.display import Image\n", + "import os\n", + "import datetime\n", + "import ipywidgets as widgets" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "3a32992a7be9497c949bc06a2e838a1d", + "3633a55c7efe490784594bad5694800d", + "75acaa0a501744f7817d0864462e8a7e" + ] }, + "colab_type": "code", + "id": "UOLHaWwBRf7D", + "outputId": "4423bcec-4cd7-4155-d923-5a6e7d731a9a" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "aW_66ovkv2ev", - "colab_type": "text" + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3a32992a7be9497c949bc06a2e838a1d", + "version_major": 2, + "version_minor": 0 }, - "source": [ - "Clone the Git repository from GitHub:\n", - "git clone https://github.com/7ossam81/EvoloPy.git" + "text/plain": [ + "Dropdown(description='Select folder:', options=('2020-05-15-13-41-36',), value='2020-05-15-13-41-36')" ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "#Select the experiments folder\n", + "foldernames = [filename for filename in os.listdir() if filename.startswith(str(datetime.datetime.now().year))]\n", + "drop_folder = widgets.Dropdown(options=foldernames, description='Select folder:')\n", + "drop_folder" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "xm8UuPRA6uIb" + }, + "outputs": [], + "source": [ + "#Get the selected folder\n", + "foldername = drop_folder.value" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "qjNFP9NqvNV3" + }, + "source": [ + "

Average Results File

" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 193 }, + "colab_type": "code", + "id": "U_PNBYEYp2cn", + "outputId": "d6fcb639-8d52-400c-fced-468475b9c789" + }, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "QgrmE2wEyC_X", - "colab_type": "code", - "colab": {} - }, - "source": [ - "!git clone https://github.com/7ossam81/EvoloPy.git" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "_yVUbtjcyiZR", - "colab_type": "code", - "colab": {} - }, - "source": [ - "# Change working directory\n", - "import os\n", - "os.chdir(\"EvoloPy/\")" + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
OptimizerobjfnameExecutionTimeIter1Iter2Iter3Iter4Iter5Iter6Iter7Iter8Iter9Iter10Iter11Iter12Iter13Iter14Iter15Iter16Iter17Iter18Iter19Iter20Iter21Iter22Iter23Iter24Iter25Iter26Iter27Iter28Iter29Iter30Iter31Iter32Iter33Iter34Iter35Iter36Iter37Iter38Iter39Iter40Iter41Iter42Iter43Iter44Iter45Iter46Iter47Iter48Iter49Iter50
0SSAF31.750.0059072.6028958.3123004.4122427.6120708.2420708.2420156.0219199.3818967.8518967.8518967.8518967.8518967.8518967.8518967.8518967.8515429.6815429.6812987.7811772.829815.498419.987635.836981.206300.405884.885454.595278.255104.204997.534916.334861.944814.554782.654769.074759.844752.964747.994745.714744.224743.264742.714742.434742.264742.164742.114742.084742.064742.06
1SSAF41.360.0053.5140.7434.8731.0929.4628.2427.2126.8926.5926.2925.8725.4225.0424.7124.6924.6924.6924.6924.4723.5723.3122.5222.5222.0421.5320.8620.6320.1719.7519.4719.2819.1419.1019.0118.9718.9418.9318.9218.9218.9118.9118.9118.9118.9118.9118.9118.9118.9118.91
2PSOF31.22183637.64180863.76154832.61131202.72103560.2286242.0879219.2173716.0548966.6934182.3427478.1326321.5123063.1818518.3417158.3914448.2613882.0512663.1911345.1010531.049172.048471.737901.277320.396875.686444.706099.125818.165681.575264.525011.524766.504607.504566.764530.854343.024228.024038.993884.793586.493474.493334.953292.483210.303075.052921.852867.092759.102711.192668.48
3PSOF40.9789.6885.1780.0675.3570.2765.0559.5754.0148.8543.0837.8933.4729.0025.9423.2621.8119.8018.7818.0717.6917.6116.0815.8215.5415.1914.9814.8214.6514.1413.9113.7513.6713.3113.1013.0412.8612.6912.2412.2312.0911.9911.7811.6011.3411.1910.9210.8710.7710.6810.67
\n", + "
" ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "S4j-t-nXxaM7", - "colab_type": "text" - }, - "source": [ - "

Install Packages

" + "text/plain": [ + " Optimizer objfname ExecutionTime ... Iter48 Iter49 Iter50\n", + "0 SSA F3 1.75 ... 4742.08 4742.06 4742.06\n", + "1 SSA F4 1.36 ... 18.91 18.91 18.91\n", + "2 PSO F3 1.22 ... 2759.10 2711.19 2668.48\n", + "3 PSO F4 0.97 ... 10.77 10.68 10.67\n", + "\n", + "[4 rows x 53 columns]" ] + }, + "execution_count": 13, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "#Show the average results file\n", + "filename = foldername +'/experiment.csv' \n", + "df = pd.read_csv(filename)\n", + "df.head(4)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "sXSfvROovXRc" + }, + "source": [ + "

Detailed Results File

" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 441 }, + "colab_type": "code", + "id": "RXU4upcgqcX_", + "outputId": "9ecd8e8f-c243-417c-b0d1-f73c5f0072c8" + }, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "-mG8vIuIW1n8", - "colab_type": "code", - "colab": {} - }, - "source": [ - "#Install NumPy, SciPy, sklearn, pandas, and matplotlib\n", - "!pip install -r requirements.txt" + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
OptimizerobjfnameExecutionTimeIter1Iter2Iter3Iter4Iter5Iter6Iter7Iter8Iter9Iter10Iter11Iter12Iter13Iter14Iter15Iter16Iter17Iter18Iter19Iter20Iter21Iter22Iter23Iter24Iter25Iter26Iter27Iter28Iter29Iter30Iter31Iter32Iter33Iter34Iter35Iter36Iter37Iter38Iter39Iter40Iter41Iter42Iter43Iter44Iter45Iter46Iter47Iter48Iter49Iter50
0SSAF31.7571590.00000052643.82090624036.40159524036.40159524036.40159519983.06281419983.06281419983.06281419934.62110519934.62110519934.62110519934.62110519934.62110519934.62110519934.62110519934.62110519934.62110519934.62110519934.62110513334.32520510375.6415276939.8623216582.0657246077.3015065719.3170515475.8076635039.5646184722.4496974509.0823724309.8459084231.9007814140.7905124098.8688384034.2249664004.3458163989.2108033977.5929553969.4320623964.4045083962.2789183960.1833823959.5943793959.0120793958.7270743958.5420683958.4477623958.3830383958.3554273958.3409073958.337686
1SSAF31.7654350.00000081772.55148042077.68268633528.30938633528.30938633528.30938633528.30938633339.47531931302.33055130607.73841930607.73841930607.73841930607.73841930607.73841930607.73841930607.73841930607.73841919993.20696419993.20696419993.20696419347.81399418381.64719014552.89078213217.58178911655.99794010353.6462069618.1390218900.8185958595.6522128275.8277908091.6581157947.8238887857.7549727801.0654537747.7751367729.3055787717.9714917709.4034527701.0718187697.1615617695.1696817693.5981777692.7063697692.2523337692.0020187691.8551017691.7864647691.7407627691.7212287691.706882
2SSAF31.7186340.00000042801.42457720760.85357811448.5082749718.1303458613.3603418613.3603417145.5108796361.1979956361.1979956361.1979956361.1979956361.1979956361.1979956361.1979956361.1979956361.1979956361.1979956361.1979955635.8138775595.0124944124.9746234124.9746233612.6034903568.2882813071.7483922996.9344242740.5010422730.0061762726.9322762669.0436692660.3749662629.1968362608.3485092595.8274492588.7048132583.9490262580.0560332578.4934902577.6909352577.3112282576.5996632576.4229112576.3029452576.2385492576.1905312576.1507472576.1379622576.1288982576.126138
3SSAF41.4069830.00000048.75972240.95712636.39211031.17677729.32298527.72871726.56693226.00322425.64803625.42549325.31540025.30355125.30355125.30355125.30355125.30355125.30355125.30355125.30355122.60747321.82807021.68950321.68950320.23996919.85763218.80346818.44190717.89604917.65975217.50645417.29303517.15610717.13718517.05595717.00034916.96322716.94811516.93856116.93856116.93551516.93449316.93449316.93409616.93358616.93325616.93305916.93302216.93296916.932945
4SSAF41.3276100.00000056.59103140.37915830.87132626.62679825.43901525.43901525.43901525.43901525.43901525.43901525.43901525.43901525.43901525.43901525.43901525.43901525.43901525.43901525.43901525.43901525.43901523.47834423.47834423.47834423.47834423.47834423.47834423.38020123.00298322.80562022.64592822.42577922.36732122.26736022.24505722.21427522.20159122.20159122.19613422.19160422.18906722.18700622.18651522.18605722.18564822.18551222.18544322.18537922.185344
5SSAF41.3542420.00000055.17402240.87144637.35015135.47212433.60898331.55825929.62323429.23799528.69207528.00606426.84835825.51335824.36594623.39783223.31627123.31627123.31627123.31627122.66302422.66302422.66302422.39191022.39191022.39191021.26726120.31099719.96991519.24428318.59004018.09297617.91496017.83754817.79652617.71765517.67612317.64768817.64074617.62415017.61660017.61322717.61174817.60996517.60891617.60851117.60834517.60812817.60799617.60792117.607890
6PSOF31.222843168506.134641160184.507508152720.276230150436.071070116981.682931102664.118631101190.697395100989.78365867178.84538033865.44482227574.79382827574.79382827296.42160320470.15634816390.30999212235.95440310941.0770999816.2650249461.5605359288.3043828893.3052938478.2329097880.1941247405.7200296409.6869996074.9041445844.1298935664.2618025539.7414305539.7414305395.0966055128.4915774940.2147534920.2405434812.5233674537.9362704537.9362704434.5664344112.5177043875.7166613731.1769483623.2870463608.0577763477.6036493418.5104143405.3336523405.3336523292.6308663270.2439503245.750870
7PSOF31.227612109898.280554109898.28055465502.95115758683.39133258683.39133252198.22549043605.88566138426.73869635462.87087733873.43131220051.44076016581.60226811264.80973111264.80973111264.80973111264.80973111264.80973111264.8097319267.3166829267.3166829267.3166828000.9547617956.7540257056.8038976841.7550676366.6347435948.6253105588.2334645517.8177974820.4436194495.6142354148.0857043997.4910393966.0902573966.0902573899.7379223838.3714853578.9662323455.6698923022.6087553022.6087553019.1915792968.9822882904.2860562866.8298362730.7032762638.4979082621.0881482566.7195032549.322518
8PSOF31.201217272508.492870272508.492870246274.591997184488.684465135015.597386103863.89769792861.05271481731.63197544258.36136634808.14321634808.14321634808.14321630628.30738223820.04819623820.04819619844.01244519440.26853416908.50306115306.42326413037.5122059355.4832198935.9964317866.8475107498.6348297375.5933466892.5548206504.6082696201.9830315987.1476785433.3695875143.8349245022.9206194884.7818724813.9370264813.9370264591.3821224307.7383244103.4335064086.1736843861.1337013669.6979473362.3727293300.3995163249.0234862939.8027262629.5227992557.4502652363.5743542296.5968552210.364796
9PSOF40.97688989.76030685.45281780.13681775.50126570.34813665.25423159.28413653.59340348.78140343.27685437.69394432.75501128.16040827.36841524.14871921.43578118.76867518.01742917.76253716.62505616.56597915.70145915.33314915.00697714.83612414.83612414.83612414.77181214.61894314.36320314.21855314.08712813.56604613.07111313.00157313.00157313.00157312.69686812.69686812.62641212.42810312.40614112.13460011.80656111.61732711.38351711.24364511.11839711.07685011.076850
10PSOF40.97002289.27512583.62986279.55074374.31874369.04034663.90902959.27512554.06075149.00585043.08179437.50013633.70908627.82500123.69001222.75271421.71006020.10230418.46656316.58229116.58229116.58229114.77899714.77899714.77899714.44787714.44787714.44787714.06195514.04660313.61476613.27245613.18014112.61272812.46581712.39349312.25378612.03615510.99268410.96893710.82423410.82423410.30356310.30356310.30356310.2748129.9005119.9005119.7721279.7691829.764364
11PSOF40.96826490.00206386.41758980.50563076.23418971.42997965.98431260.13889154.36597948.76559942.87042338.47569433.93178931.01624226.75981822.87689722.27997020.52183919.85517419.85517419.85517419.68304717.74506817.35234116.81942116.27768615.64385415.18271815.12865613.75664513.75664513.75664513.75664513.75664513.75664513.73804213.32916713.03557913.03557913.03150412.80938012.72026112.62442512.36541711.90010211.67949111.47168511.47168511.42159011.19553511.166306
\n", + "
" ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "fEon-wGyZuq4", - "colab_type": "text" - }, - "source": [ - "

User Preferences

" + "text/plain": [ + " Optimizer objfname ExecutionTime ... Iter48 Iter49 Iter50\n", + "0 SSA F3 1.757159 ... 3958.355427 3958.340907 3958.337686\n", + "1 SSA F3 1.765435 ... 7691.740762 7691.721228 7691.706882\n", + "2 SSA F3 1.718634 ... 2576.137962 2576.128898 2576.126138\n", + "3 SSA F4 1.406983 ... 16.933022 16.932969 16.932945\n", + "4 SSA F4 1.327610 ... 22.185443 22.185379 22.185344\n", + "5 SSA F4 1.354242 ... 17.607996 17.607921 17.607890\n", + "6 PSO F3 1.222843 ... 3292.630866 3270.243950 3245.750870\n", + "7 PSO F3 1.227612 ... 2621.088148 2566.719503 2549.322518\n", + "8 PSO F3 1.201217 ... 2363.574354 2296.596855 2210.364796\n", + "9 PSO F4 0.976889 ... 11.118397 11.076850 11.076850\n", + "10 PSO F4 0.970022 ... 9.772127 9.769182 9.764364\n", + "11 PSO F4 0.968264 ... 11.421590 11.195535 11.166306\n", + "\n", + "[12 rows x 53 columns]" ] + }, + "execution_count": 14, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "#Show the detailed results file\n", + "filename = foldername +'/experiment_details.csv' \n", + "df = pd.read_csv(filename)\n", + "df.head(12)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "7gw9qJb7vedV" + }, + "source": [ + "

Convergence Curve Plot

" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "e4a83005aaa043d48540b6f4202070e5", + "641b5f943c8e419583baaf02485acffb", + "45a8720657764f1585859c3d3dae8745" + ] }, + "colab_type": "code", + "id": "14hzxM7spueJ", + "outputId": "6e047a4c-b0df-48c1-d4b1-447240fd9384" + }, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "cFF9ioDfyppV", - "colab_type": "code", - "colab": {} - }, - "source": [ - "# Select optimizers\n", - "# \"SSA\",\"PSO\",\"GA\",\"BAT\",\"FFA\",\"GWO\",\"WOA\",\"MVO\",\"MFO\",\"CS\",\"HHO\",\"SCA\",\"JAYA\",\"DE\"\n", - "optimizer=[\"SSA\",\"PSO\",\"GWO\"]" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "SuWo96bB6ohe", - "colab_type": "code", - "colab": {} - }, - "source": [ - "# Select benchmark function\"\n", - "# \"F1\",\"F2\",\"F3\",\"F4\",\"F5\",\"F6\",\"F7\",\"F8\",\"F9\",\"F10\",\"F11\",\"F12\",\"F13\",\"F14\",\"F15\",\"F16\",\"F17\",\"F18\",\"F19\"\n", - "objectivefunc=[\"F3\",\"F4\"] " - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "CQyWvdS3Ipgt", - "colab_type": "code", - "colab": {} - }, - "source": [ - "# Select number of repetitions for each experiment. \n", - "# To obtain meaningful statistical results, usually 30 independent runs are executed for each algorithm.\n", - "NumOfRuns=3" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "2djrIRh26sKB", - "colab_type": "code", - "colab": {} - }, - "source": [ - "# Select general parameters for all optimizers (population size, number of iterations) ....\n", - "params = {'PopulationSize' : 30, 'Iterations' : 50}" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "aJb075Np62GM", - "colab_type": "code", - "colab": {} - }, - "source": [ - "#Choose whether to Export the results in different formats\n", - "export_flags = {'Export_avg':True, 'Export_details':True, \n", - "'Export_convergence':True, 'Export_boxplot':True}" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "KAgXf1QkZD7X", - "colab_type": "text" + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "e4a83005aaa043d48540b6f4202070e5", + "version_major": 2, + "version_minor": 0 }, - "source": [ - "

Run Framework

" + "text/plain": [ + "Dropdown(description='Select plot:', options=('convergence-F4.png', 'convergence-F3.png'), value='convergence-…" ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "#Select convergence curve to show\n", + "filenames = [filename for filename in os.listdir(foldername) if filename.startswith('convergence')]\n", + "\n", + "drop_plot_convergence = widgets.Dropdown(options=filenames, description='Select plot:')\n", + "drop_plot_convergence" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 279 }, + "colab_type": "code", + "id": "ZMstknfRafMj", + "outputId": "b4b18695-4f57-4804-e992-7fd6b72ef746" + }, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "APzDcxiwI8A2", - "colab_type": "code", - "colab": {} - }, - "source": [ - "# Run EvoCluster\n", - "from optimizer import run\n", - "run(optimizer, objectivefunc, NumOfRuns, params, export_flags)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "1mB9AVhQuwbH", - "colab_type": "text" - }, - "source": [ - "

Results Files and Plots

" + "data": { + "image/png": "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\n", + "text/plain": [ + "" ] + }, + "execution_count": 18, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "#Show selected convergence curve\n", + "Image(foldername +'/' + drop_plot_convergence.value)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "HYEl6buevixm" + }, + "source": [ + "

Box Plot

" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "91e278780d5b4dcda11e832e971044f3", + "c1b161beed5c4b128b06a09d7a5be2fe", + "b08d8ae9147047acac84d9e52bfee64f" + ] }, + "colab_type": "code", + "id": "rWF1AKS5bPvV", + "outputId": "9cdefbdf-8a8c-4a0f-cbae-3a0aba9528df" + }, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "642Oh7QUpRhL", - "colab_type": "code", - "colab": {} - }, - "source": [ - "#import some useful packages to view the results' files in colab\n", - "import pandas as pd\n", - "from IPython.display import Image\n", - "import os\n", - "import datetime\n", - "import ipywidgets as widgets" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "UOLHaWwBRf7D", - "colab_type": "code", - "outputId": "4423bcec-4cd7-4155-d923-5a6e7d731a9a", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 49, - "referenced_widgets": [ - "3a32992a7be9497c949bc06a2e838a1d", - "3633a55c7efe490784594bad5694800d", - "75acaa0a501744f7817d0864462e8a7e" - ] - } + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "91e278780d5b4dcda11e832e971044f3", + "version_major": 2, + "version_minor": 0 }, - "source": [ - "#Select the experiments folder\n", - "foldernames = [filename for filename in os.listdir() if filename.startswith(str(datetime.datetime.now().year))]\n", - "drop_folder = widgets.Dropdown(options=foldernames, description='Select folder:')\n", - "drop_folder" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "display_data", - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "3a32992a7be9497c949bc06a2e838a1d", - "version_minor": 0, - "version_major": 2 - }, - "text/plain": [ - "Dropdown(description='Select folder:', options=('2020-05-15-13-41-36',), value='2020-05-15-13-41-36')" - ] - }, - "metadata": { - "tags": [] - } - } + "text/plain": [ + "Dropdown(description='Select plot:', options=('boxplot-F3.png', 'boxplot-F4.png'), value='boxplot-F3.png')" ] + }, + "metadata": { + "tags": [] + }, + "output_type": "display_data" + } + ], + "source": [ + "#Select boxplot to show\n", + "filenames = [filename for filename in os.listdir(foldername) if filename.startswith('boxplot')]\n", + "\n", + "drop_boxplot = widgets.Dropdown(options=filenames, description='Select plot:')\n", + "drop_boxplot" + ] + }, + { + "cell_type": "code", + "execution_count": 0, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 265 }, + "colab_type": "code", + "id": "paBsvZRktfTh", + "outputId": "61ebf09e-07cc-4718-d273-0ed5e02766f6" + }, + "outputs": [ { - "cell_type": "code", - "metadata": { - "id": "xm8UuPRA6uIb", - "colab_type": "code", - "colab": {} - }, - "source": [ - "#Get the selected folder\n", - "foldername = drop_folder.value" - ], - "execution_count": 0, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "qjNFP9NqvNV3", - "colab_type": "text" - }, - "source": [ - "

Average Results File

" + "data": { + "image/png": "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\n", + "text/plain": [ + "" ] + }, + "execution_count": 22, + "metadata": { + "tags": [] + }, + "output_type": "execute_result" + } + ], + "source": [ + "#Show selected boxplot\n", + "Image(foldername +'/' + drop_boxplot.value)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "eahYmfKKJ62g" + }, + "source": [ + "

Citation Request

" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "PkabkcHFKFIK" + }, + "source": [ + "Please include these citations if you plan to use this Framework:\n", + "\n", + "* Faris, Hossam, Ibrahim Aljarah, Seyedali Mirjalili, Pedro A. Castillo, and Juan Julián Merelo Guervós. \"EvoloPy: An Open-source Nature-inspired Optimization Framework in Python.\" In IJCCI (ECTA), pp. 171-177. 2016.\n", + "* Qaddoura, Raneem, Hossam Faris, Ibrahim Aljarah, and Pedro A. Castillo. \"EvoCluster: An Open-Source Nature-Inspired Optimization Clustering Framework in Python.\" In International Conference on the Applications of Evolutionary Computation (Part of EvoStar), pp. 20-36. Springer, Cham, 2020.\n", + "* Ruba Abu Khurma, Ibrahim Aljarah, Ahmad Sharieh, and Seyedali Mirjalili. Evolopy-fs: An open-source nature-inspired optimization framework in python for feature selection. In Evolutionary Machine Learning Techniques, pages 131–173. Springer, 2020" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "include_colab_link": true, + "name": "EvoloPy.ipynb", + "provenance": [] + }, + "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.3" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "3633a55c7efe490784594bad5694800d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } }, - { - "cell_type": "code", - "metadata": { - "id": "U_PNBYEYp2cn", - "colab_type": "code", - "outputId": "d6fcb639-8d52-400c-fced-468475b9c789", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 193 - } - }, - "source": [ - "#Show the average results file\n", - "filename = foldername +'/experiment.csv' \n", - "df = pd.read_csv(filename)\n", - "df.head(4)" + "3a32992a7be9497c949bc06a2e838a1d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DropdownModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DropdownModel", + "_options_labels": [ + "2020-05-15-13-41-36" ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OptimizerobjfnameExecutionTimeIter1Iter2Iter3Iter4Iter5Iter6Iter7Iter8Iter9Iter10Iter11Iter12Iter13Iter14Iter15Iter16Iter17Iter18Iter19Iter20Iter21Iter22Iter23Iter24Iter25Iter26Iter27Iter28Iter29Iter30Iter31Iter32Iter33Iter34Iter35Iter36Iter37Iter38Iter39Iter40Iter41Iter42Iter43Iter44Iter45Iter46Iter47Iter48Iter49Iter50
0SSAF31.750.0059072.6028958.3123004.4122427.6120708.2420708.2420156.0219199.3818967.8518967.8518967.8518967.8518967.8518967.8518967.8518967.8515429.6815429.6812987.7811772.829815.498419.987635.836981.206300.405884.885454.595278.255104.204997.534916.334861.944814.554782.654769.074759.844752.964747.994745.714744.224743.264742.714742.434742.264742.164742.114742.084742.064742.06
1SSAF41.360.0053.5140.7434.8731.0929.4628.2427.2126.8926.5926.2925.8725.4225.0424.7124.6924.6924.6924.6924.4723.5723.3122.5222.5222.0421.5320.8620.6320.1719.7519.4719.2819.1419.1019.0118.9718.9418.9318.9218.9218.9118.9118.9118.9118.9118.9118.9118.9118.9118.91
2PSOF31.22183637.64180863.76154832.61131202.72103560.2286242.0879219.2173716.0548966.6934182.3427478.1326321.5123063.1818518.3417158.3914448.2613882.0512663.1911345.1010531.049172.048471.737901.277320.396875.686444.706099.125818.165681.575264.525011.524766.504607.504566.764530.854343.024228.024038.993884.793586.493474.493334.953292.483210.303075.052921.852867.092759.102711.192668.48
3PSOF40.9789.6885.1780.0675.3570.2765.0559.5754.0148.8543.0837.8933.4729.0025.9423.2621.8119.8018.7818.0717.6917.6116.0815.8215.5415.1914.9814.8214.6514.1413.9113.7513.6713.3113.1013.0412.8612.6912.2412.2312.0911.9911.7811.6011.3411.1910.9210.8710.7710.6810.67
\n", - "
" - ], - "text/plain": [ - " Optimizer objfname ExecutionTime ... Iter48 Iter49 Iter50\n", - "0 SSA F3 1.75 ... 4742.08 4742.06 4742.06\n", - "1 SSA F4 1.36 ... 18.91 18.91 18.91\n", - "2 PSO F3 1.22 ... 2759.10 2711.19 2668.48\n", - "3 PSO F4 0.97 ... 10.77 10.68 10.67\n", - "\n", - "[4 rows x 53 columns]" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 13 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "sXSfvROovXRc", - "colab_type": "text" - }, - "source": [ - "

Detailed Results File

" - ] + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "DropdownView", + "description": "Select folder:", + "description_tooltip": null, + "disabled": false, + "index": 0, + "layout": "IPY_MODEL_75acaa0a501744f7817d0864462e8a7e", + "style": "IPY_MODEL_3633a55c7efe490784594bad5694800d" + } }, - { - "cell_type": "code", - "metadata": { - "id": "RXU4upcgqcX_", - "colab_type": "code", - "outputId": "9ecd8e8f-c243-417c-b0d1-f73c5f0072c8", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 441 - } - }, - "source": [ - "#Show the detailed results file\n", - "filename = foldername +'/experiment_details.csv' \n", - "df = pd.read_csv(filename)\n", - "df.head(12)" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
OptimizerobjfnameExecutionTimeIter1Iter2Iter3Iter4Iter5Iter6Iter7Iter8Iter9Iter10Iter11Iter12Iter13Iter14Iter15Iter16Iter17Iter18Iter19Iter20Iter21Iter22Iter23Iter24Iter25Iter26Iter27Iter28Iter29Iter30Iter31Iter32Iter33Iter34Iter35Iter36Iter37Iter38Iter39Iter40Iter41Iter42Iter43Iter44Iter45Iter46Iter47Iter48Iter49Iter50
0SSAF31.7571590.00000052643.82090624036.40159524036.40159524036.40159519983.06281419983.06281419983.06281419934.62110519934.62110519934.62110519934.62110519934.62110519934.62110519934.62110519934.62110519934.62110519934.62110519934.62110513334.32520510375.6415276939.8623216582.0657246077.3015065719.3170515475.8076635039.5646184722.4496974509.0823724309.8459084231.9007814140.7905124098.8688384034.2249664004.3458163989.2108033977.5929553969.4320623964.4045083962.2789183960.1833823959.5943793959.0120793958.7270743958.5420683958.4477623958.3830383958.3554273958.3409073958.337686
1SSAF31.7654350.00000081772.55148042077.68268633528.30938633528.30938633528.30938633528.30938633339.47531931302.33055130607.73841930607.73841930607.73841930607.73841930607.73841930607.73841930607.73841930607.73841919993.20696419993.20696419993.20696419347.81399418381.64719014552.89078213217.58178911655.99794010353.6462069618.1390218900.8185958595.6522128275.8277908091.6581157947.8238887857.7549727801.0654537747.7751367729.3055787717.9714917709.4034527701.0718187697.1615617695.1696817693.5981777692.7063697692.2523337692.0020187691.8551017691.7864647691.7407627691.7212287691.706882
2SSAF31.7186340.00000042801.42457720760.85357811448.5082749718.1303458613.3603418613.3603417145.5108796361.1979956361.1979956361.1979956361.1979956361.1979956361.1979956361.1979956361.1979956361.1979956361.1979956361.1979955635.8138775595.0124944124.9746234124.9746233612.6034903568.2882813071.7483922996.9344242740.5010422730.0061762726.9322762669.0436692660.3749662629.1968362608.3485092595.8274492588.7048132583.9490262580.0560332578.4934902577.6909352577.3112282576.5996632576.4229112576.3029452576.2385492576.1905312576.1507472576.1379622576.1288982576.126138
3SSAF41.4069830.00000048.75972240.95712636.39211031.17677729.32298527.72871726.56693226.00322425.64803625.42549325.31540025.30355125.30355125.30355125.30355125.30355125.30355125.30355125.30355122.60747321.82807021.68950321.68950320.23996919.85763218.80346818.44190717.89604917.65975217.50645417.29303517.15610717.13718517.05595717.00034916.96322716.94811516.93856116.93856116.93551516.93449316.93449316.93409616.93358616.93325616.93305916.93302216.93296916.932945
4SSAF41.3276100.00000056.59103140.37915830.87132626.62679825.43901525.43901525.43901525.43901525.43901525.43901525.43901525.43901525.43901525.43901525.43901525.43901525.43901525.43901525.43901525.43901525.43901523.47834423.47834423.47834423.47834423.47834423.47834423.38020123.00298322.80562022.64592822.42577922.36732122.26736022.24505722.21427522.20159122.20159122.19613422.19160422.18906722.18700622.18651522.18605722.18564822.18551222.18544322.18537922.185344
5SSAF41.3542420.00000055.17402240.87144637.35015135.47212433.60898331.55825929.62323429.23799528.69207528.00606426.84835825.51335824.36594623.39783223.31627123.31627123.31627123.31627122.66302422.66302422.66302422.39191022.39191022.39191021.26726120.31099719.96991519.24428318.59004018.09297617.91496017.83754817.79652617.71765517.67612317.64768817.64074617.62415017.61660017.61322717.61174817.60996517.60891617.60851117.60834517.60812817.60799617.60792117.607890
6PSOF31.222843168506.134641160184.507508152720.276230150436.071070116981.682931102664.118631101190.697395100989.78365867178.84538033865.44482227574.79382827574.79382827296.42160320470.15634816390.30999212235.95440310941.0770999816.2650249461.5605359288.3043828893.3052938478.2329097880.1941247405.7200296409.6869996074.9041445844.1298935664.2618025539.7414305539.7414305395.0966055128.4915774940.2147534920.2405434812.5233674537.9362704537.9362704434.5664344112.5177043875.7166613731.1769483623.2870463608.0577763477.6036493418.5104143405.3336523405.3336523292.6308663270.2439503245.750870
7PSOF31.227612109898.280554109898.28055465502.95115758683.39133258683.39133252198.22549043605.88566138426.73869635462.87087733873.43131220051.44076016581.60226811264.80973111264.80973111264.80973111264.80973111264.80973111264.8097319267.3166829267.3166829267.3166828000.9547617956.7540257056.8038976841.7550676366.6347435948.6253105588.2334645517.8177974820.4436194495.6142354148.0857043997.4910393966.0902573966.0902573899.7379223838.3714853578.9662323455.6698923022.6087553022.6087553019.1915792968.9822882904.2860562866.8298362730.7032762638.4979082621.0881482566.7195032549.322518
8PSOF31.201217272508.492870272508.492870246274.591997184488.684465135015.597386103863.89769792861.05271481731.63197544258.36136634808.14321634808.14321634808.14321630628.30738223820.04819623820.04819619844.01244519440.26853416908.50306115306.42326413037.5122059355.4832198935.9964317866.8475107498.6348297375.5933466892.5548206504.6082696201.9830315987.1476785433.3695875143.8349245022.9206194884.7818724813.9370264813.9370264591.3821224307.7383244103.4335064086.1736843861.1337013669.6979473362.3727293300.3995163249.0234862939.8027262629.5227992557.4502652363.5743542296.5968552210.364796
9PSOF40.97688989.76030685.45281780.13681775.50126570.34813665.25423159.28413653.59340348.78140343.27685437.69394432.75501128.16040827.36841524.14871921.43578118.76867518.01742917.76253716.62505616.56597915.70145915.33314915.00697714.83612414.83612414.83612414.77181214.61894314.36320314.21855314.08712813.56604613.07111313.00157313.00157313.00157312.69686812.69686812.62641212.42810312.40614112.13460011.80656111.61732711.38351711.24364511.11839711.07685011.076850
10PSOF40.97002289.27512583.62986279.55074374.31874369.04034663.90902959.27512554.06075149.00585043.08179437.50013633.70908627.82500123.69001222.75271421.71006020.10230418.46656316.58229116.58229116.58229114.77899714.77899714.77899714.44787714.44787714.44787714.06195514.04660313.61476613.27245613.18014112.61272812.46581712.39349312.25378612.03615510.99268410.96893710.82423410.82423410.30356310.30356310.30356310.2748129.9005119.9005119.7721279.7691829.764364
11PSOF40.96826490.00206386.41758980.50563076.23418971.42997965.98431260.13889154.36597948.76559942.87042338.47569433.93178931.01624226.75981822.87689722.27997020.52183919.85517419.85517419.85517419.68304717.74506817.35234116.81942116.27768615.64385415.18271815.12865613.75664513.75664513.75664513.75664513.75664513.75664513.73804213.32916713.03557913.03557913.03150412.80938012.72026112.62442512.36541711.90010211.67949111.47168511.47168511.42159011.19553511.166306
\n", - "
" - ], - "text/plain": [ - " Optimizer objfname ExecutionTime ... Iter48 Iter49 Iter50\n", - "0 SSA F3 1.757159 ... 3958.355427 3958.340907 3958.337686\n", - "1 SSA F3 1.765435 ... 7691.740762 7691.721228 7691.706882\n", - "2 SSA F3 1.718634 ... 2576.137962 2576.128898 2576.126138\n", - "3 SSA F4 1.406983 ... 16.933022 16.932969 16.932945\n", - "4 SSA F4 1.327610 ... 22.185443 22.185379 22.185344\n", - "5 SSA F4 1.354242 ... 17.607996 17.607921 17.607890\n", - "6 PSO F3 1.222843 ... 3292.630866 3270.243950 3245.750870\n", - "7 PSO F3 1.227612 ... 2621.088148 2566.719503 2549.322518\n", - "8 PSO F3 1.201217 ... 2363.574354 2296.596855 2210.364796\n", - "9 PSO F4 0.976889 ... 11.118397 11.076850 11.076850\n", - "10 PSO F4 0.970022 ... 9.772127 9.769182 9.764364\n", - "11 PSO F4 0.968264 ... 11.421590 11.195535 11.166306\n", - "\n", - "[12 rows x 53 columns]" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 14 - } - ] + "45a8720657764f1585859c3d3dae8745": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "markdown", - "metadata": { - "id": "7gw9qJb7vedV", - "colab_type": "text" - }, - "source": [ - "

Convergence Curve Plot

" - ] + "641b5f943c8e419583baaf02485acffb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } }, - { - "cell_type": "code", - "metadata": { - "id": "14hzxM7spueJ", - "colab_type": "code", - "outputId": "6e047a4c-b0df-48c1-d4b1-447240fd9384", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 49, - "referenced_widgets": [ - "e4a83005aaa043d48540b6f4202070e5", - "641b5f943c8e419583baaf02485acffb", - "45a8720657764f1585859c3d3dae8745" - ] - } - }, - "source": [ - "#Select convergence curve to show\n", - "filenames = [filename for filename in os.listdir(foldername) if filename.startswith('convergence')]\n", - "\n", - "drop_plot_convergence = widgets.Dropdown(options=filenames, description='Select plot:')\n", - "drop_plot_convergence" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "display_data", - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "e4a83005aaa043d48540b6f4202070e5", - "version_minor": 0, - "version_major": 2 - }, - "text/plain": [ - "Dropdown(description='Select plot:', options=('convergence-F4.png', 'convergence-F3.png'), value='convergence-…" - ] - }, - "metadata": { - "tags": [] - } - } - ] + "75acaa0a501744f7817d0864462e8a7e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "code", - "metadata": { - "id": "ZMstknfRafMj", - "colab_type": "code", - "outputId": "b4b18695-4f57-4804-e992-7fd6b72ef746", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 279 - } - }, - "source": [ - "#Show selected convergence curve\n", - "Image(foldername +'/' + drop_plot_convergence.value)" + "91e278780d5b4dcda11e832e971044f3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DropdownModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DropdownModel", + "_options_labels": [ + "boxplot-F3.png", + "boxplot-F4.png" ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 18 - } - ] + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "DropdownView", + "description": "Select plot:", + "description_tooltip": null, + "disabled": false, + "index": 1, + "layout": "IPY_MODEL_b08d8ae9147047acac84d9e52bfee64f", + "style": "IPY_MODEL_c1b161beed5c4b128b06a09d7a5be2fe" + } }, - { - "cell_type": "markdown", - "metadata": { - "id": "HYEl6buevixm", - "colab_type": "text" - }, - "source": [ - "

Box Plot

" - ] + "b08d8ae9147047acac84d9e52bfee64f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } }, - { - "cell_type": "code", - "metadata": { - "id": "rWF1AKS5bPvV", - "colab_type": "code", - "outputId": "9cdefbdf-8a8c-4a0f-cbae-3a0aba9528df", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 49, - "referenced_widgets": [ - "91e278780d5b4dcda11e832e971044f3", - "c1b161beed5c4b128b06a09d7a5be2fe", - "b08d8ae9147047acac84d9e52bfee64f" - ] - } - }, - "source": [ - "#Select boxplot to show\n", - "filenames = [filename for filename in os.listdir(foldername) if filename.startswith('boxplot')]\n", - "\n", - "drop_boxplot = widgets.Dropdown(options=filenames, description='Select plot:')\n", - "drop_boxplot" - ], - "execution_count": 0, - "outputs": [ - { - "output_type": "display_data", - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "91e278780d5b4dcda11e832e971044f3", - "version_minor": 0, - "version_major": 2 - }, - "text/plain": [ - "Dropdown(description='Select plot:', options=('boxplot-F3.png', 'boxplot-F4.png'), value='boxplot-F3.png')" - ] - }, - "metadata": { - "tags": [] - } - } - ] + "c1b161beed5c4b128b06a09d7a5be2fe": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } }, - { - "cell_type": "code", - "metadata": { - "id": "paBsvZRktfTh", - "colab_type": "code", - "outputId": "61ebf09e-07cc-4718-d273-0ed5e02766f6", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 265 - } - }, - "source": [ - "#Show selected boxplot\n", - "Image(foldername +'/' + drop_boxplot.value)" + "e4a83005aaa043d48540b6f4202070e5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DropdownModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DropdownModel", + "_options_labels": [ + "convergence-F4.png", + "convergence-F3.png" ], - "execution_count": 0, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - }, - "execution_count": 22 - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "eahYmfKKJ62g", - "colab_type": "text" - }, - "source": [ - "

Citation Request

" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "PkabkcHFKFIK", - "colab_type": "text" - }, - "source": [ - "Please include these citations if you plan to use this Framework:\n", - "\n", - "* Faris, Hossam, Ibrahim Aljarah, Seyedali Mirjalili, Pedro A. Castillo, and Juan Julián Merelo Guervós. \"EvoloPy: An Open-source Nature-inspired Optimization Framework in Python.\" In IJCCI (ECTA), pp. 171-177. 2016.\n", - "* Qaddoura, Raneem, Hossam Faris, Ibrahim Aljarah, and Pedro A. Castillo. \"EvoCluster: An Open-Source Nature-Inspired Optimization Clustering Framework in Python.\" In International Conference on the Applications of Evolutionary Computation (Part of EvoStar), pp. 20-36. Springer, Cham, 2020.\n", - "* Ruba Abu Khurma, Ibrahim Aljarah, Ahmad Sharieh, and Seyedali Mirjalili. Evolopy-fs: An open-source nature-inspired optimization framework in python for feature selection. In Evolutionary Machine Learning Techniques, pages 131–173. Springer, 2020" - ] + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "DropdownView", + "description": "Select plot:", + "description_tooltip": null, + "disabled": false, + "index": 0, + "layout": "IPY_MODEL_45a8720657764f1585859c3d3dae8745", + "style": "IPY_MODEL_641b5f943c8e419583baaf02485acffb" + } } - ] -} \ No newline at end of file + } + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/README.md b/README.md index 90c45cc..b1e13a4 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -
-EvoCluster-logo -
+# VecMetaPy: A vectorized framework for metaheuristic optimization in Python +Paper: https://doi.org/10.1016/j.advengsoft.2022.103092 +VecMetaPy is an efficient version of EvoloPy, with vectorized implementation of the 23 benchmark functions and the five algorithms. The guidelines to use VecMetaPy are exactly the same as EvoloPy, with the only difference of using vectorized_optimizer.py instead of optimizer.py. You can find more in the VecMetaPy.ipynb notebook. -# EvoloPy: An open source nature-inspired optimization toolbox for global optimization in Python +## EvoloPy: An open source nature-inspired optimization toolbox for global optimization in Python The EvoloPy toolbox provides classical and recent nature-inspired metaheuristic for the global optimization. The list of optimizers that have been implemented includes Particle Swarm Optimization (PSO), Multi-Verse Optimizer (MVO), Grey Wolf Optimizer (GWO), and Moth Flame Optimization (MFO). The full list of implemented optimizers is available here https://github.com/7ossam81/EvoloPy/wiki/List-of-optimizers diff --git a/VecMetaPy.ipynb b/VecMetaPy.ipynb new file mode 100644 index 0000000..dd1b164 --- /dev/null +++ b/VecMetaPy.ipynb @@ -0,0 +1,789 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "IiNG95DSmRmt" + }, + "source": [ + "# VecMetaPy\n", + "## A vectorized framework for metaheuristic optimization in Python" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "hKzyadcdm6yw" + }, + "source": [ + "VecMetaPy is a vectorized version of EvoloPy (https://github.com/7ossam81/EvoloPy) meaning that the implementation of the optimization algorithms and benchmark functions have been vectorized using the features of the numpy library including broadcasting. All the benchmark functions from F1 to F23 have been vectorized, as well as the five optimization algorithms: Grey Wolf Optimizer (GWO), Whale Optimization Algorithm (WOA), Moth-Flame Optimization (MFO), Sine-Cosine Optimization (SCA) and Salp Swarm Optimization (SSA)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "ehxW3t0puwpm" + }, + "source": [ + "

Features

" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "TufeO-Rturq8" + }, + "source": [ + "* The implementation of all benchmark functions have been vectorized.\n", + "* The implementation of the five algorithms mentioned above have been vectorized.\n", + "* The implementation uses the fast array manipulation using [NumPy] (http://www.numpy.org/)." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "oG2TRdx-vf8m" + }, + "source": [ + "

Installation

" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "_XpMUOZNvi9H" + }, + "source": [ + "Python 3.xx is required." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "f_PVAZC6v7px" + }, + "source": [ + "

GitHub

" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "aW_66ovkv2ev" + }, + "source": [ + "Clone the Git repository https://github.com/BaratiLab/VecMetaPy" + ] + }, + { + "cell_type": "raw", + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "QgrmE2wEyC_X" + }, + "source": [ + "!git clone https://github.com/BaratiLab/VecMetaPy.git" + ] + }, + { + "cell_type": "raw", + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "_yVUbtjcyiZR" + }, + "source": [ + "# Change working directory\n", + "import os\n", + "os.chdir(\"VecMetaPy/\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "S4j-t-nXxaM7" + }, + "source": [ + "

Install Packages

" + ] + }, + { + "cell_type": "raw", + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "-mG8vIuIW1n8" + }, + "source": [ + "#Install NumPy, SciPy, sklearn, pandas, and matplotlib\n", + "!pip install -r requirements.txt" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "fEon-wGyZuq4" + }, + "source": [ + "

User Preferences

" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "cFF9ioDfyppV" + }, + "outputs": [], + "source": [ + "# Select optimizers\n", + "# \"GWO\",\"WOA\",\"MFO\", \"SCA\", \"SSA\",\n", + "optimizer=[\"SSA\",\"SCA\",\"GWO\", \"WOA\", \"MFO\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "SuWo96bB6ohe" + }, + "outputs": [], + "source": [ + "# Select benchmark function\"\n", + "# \"F1\" to \"F23\"\n", + "objectivefunc_idx = [1,8,14]\n", + "# objectivefunc_idx = range(1, 24) # to include all objective functions\n", + "objectivefunc = [f'F{i}' for i in objectivefunc_idx] " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "CQyWvdS3Ipgt" + }, + "outputs": [], + "source": [ + "# Select number of repetitions for each experiment. \n", + "# To obtain meaningful statistical results, usually 30 independent runs are executed for each algorithm.\n", + "NumOfRuns = 3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "2djrIRh26sKB" + }, + "outputs": [], + "source": [ + "# Select general parameters for all optimizers (population size, number of iterations) ....\n", + "params = {'PopulationSize' : 30, 'Iterations' : 200}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "aJb075Np62GM" + }, + "outputs": [], + "source": [ + "# Choose whether to Export the results in different formats\n", + "export_flags = {'Export_avg':True, 'Export_details':True, \n", + "'Export_convergence':True, 'Export_boxplot':True}" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "KAgXf1QkZD7X" + }, + "source": [ + "

Run Framework

" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "APzDcxiwI8A2" + }, + "outputs": [], + "source": [ + "# Run VecMetaPy\n", + "from vectorized_optimizer import run\n", + "run(optimizer, objectivefunc, NumOfRuns, params, export_flags)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "1mB9AVhQuwbH" + }, + "source": [ + "

Results Files and Plots

" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "642Oh7QUpRhL" + }, + "outputs": [], + "source": [ + "#import some useful packages to view the results' files in colab\n", + "import pandas as pd\n", + "from IPython.display import Image\n", + "import os\n", + "import datetime\n", + "import ipywidgets as widgets" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "3a32992a7be9497c949bc06a2e838a1d", + "3633a55c7efe490784594bad5694800d", + "75acaa0a501744f7817d0864462e8a7e" + ] + }, + "colab_type": "code", + "id": "UOLHaWwBRf7D", + "outputId": "4423bcec-4cd7-4155-d923-5a6e7d731a9a" + }, + "outputs": [], + "source": [ + "#Select the experiments folder\n", + "foldernames = [filename for filename in os.listdir() if filename.startswith(str(datetime.datetime.now().year))]\n", + "drop_folder = widgets.Dropdown(options=foldernames, description='Select folder:')\n", + "drop_folder" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": {}, + "colab_type": "code", + "id": "xm8UuPRA6uIb" + }, + "outputs": [], + "source": [ + "#Get the selected folder\n", + "foldername = drop_folder.value" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "qjNFP9NqvNV3" + }, + "source": [ + "

Average Results File

" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 193 + }, + "colab_type": "code", + "id": "U_PNBYEYp2cn", + "outputId": "d6fcb639-8d52-400c-fced-468475b9c789" + }, + "outputs": [], + "source": [ + "#Show the average results file\n", + "filename = foldername +'/experiment.csv' \n", + "df = pd.read_csv(filename)\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "sXSfvROovXRc" + }, + "source": [ + "

Detailed Results File

" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 441 + }, + "colab_type": "code", + "id": "RXU4upcgqcX_", + "outputId": "9ecd8e8f-c243-417c-b0d1-f73c5f0072c8" + }, + "outputs": [], + "source": [ + "#Show the detailed results file\n", + "filename = foldername +'/experiment_details.csv' \n", + "df = pd.read_csv(filename)\n", + "df.head(12)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "7gw9qJb7vedV" + }, + "source": [ + "

Convergence Curve Plot

" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "e4a83005aaa043d48540b6f4202070e5", + "641b5f943c8e419583baaf02485acffb", + "45a8720657764f1585859c3d3dae8745" + ] + }, + "colab_type": "code", + "id": "14hzxM7spueJ", + "outputId": "6e047a4c-b0df-48c1-d4b1-447240fd9384" + }, + "outputs": [], + "source": [ + "#Select convergence curve to show\n", + "filenames = [filename for filename in os.listdir(foldername) if filename.startswith('convergence')]\n", + "\n", + "drop_plot_convergence = widgets.Dropdown(options=filenames, description='Select plot:')\n", + "drop_plot_convergence" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 279 + }, + "colab_type": "code", + "id": "ZMstknfRafMj", + "outputId": "b4b18695-4f57-4804-e992-7fd6b72ef746" + }, + "outputs": [], + "source": [ + "#Show selected convergence curve\n", + "Image(foldername +'/' + drop_plot_convergence.value)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "colab_type": "text", + "id": "HYEl6buevixm" + }, + "source": [ + "

Box Plot

" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 49, + "referenced_widgets": [ + "91e278780d5b4dcda11e832e971044f3", + "c1b161beed5c4b128b06a09d7a5be2fe", + "b08d8ae9147047acac84d9e52bfee64f" + ] + }, + "colab_type": "code", + "id": "rWF1AKS5bPvV", + "outputId": "9cdefbdf-8a8c-4a0f-cbae-3a0aba9528df" + }, + "outputs": [], + "source": [ + "#Select boxplot to show\n", + "filenames = [filename for filename in os.listdir(foldername) if filename.startswith('boxplot')]\n", + "\n", + "drop_boxplot = widgets.Dropdown(options=filenames, description='Select plot:')\n", + "drop_boxplot" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 265 + }, + "colab_type": "code", + "id": "paBsvZRktfTh", + "outputId": "61ebf09e-07cc-4718-d273-0ed5e02766f6" + }, + "outputs": [], + "source": [ + "#Show selected boxplot\n", + "Image(foldername +'/' + drop_boxplot.value)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Citation Request\n", + "Please include these citations if you plan to use this Framework:\n", + "\n", + "* VecMetaPy Paper: https://doi.org/10.1016/j.advengsoft.2022.103092\n", + "\n", + "\n", + "* Faris, Hossam, Ibrahim Aljarah, Seyedali Mirjalili, Pedro A. Castillo, and Juan Julián Merelo Guervós. \"EvoloPy: An Open-source Nature-inspired Optimization Framework in Python.\" In IJCCI (ECTA), pp. 171-177. 2016.\n" + ] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [], + "include_colab_link": true, + "name": "EvoloPy.ipynb", + "provenance": [] + }, + "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.3" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "3633a55c7efe490784594bad5694800d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3a32992a7be9497c949bc06a2e838a1d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DropdownModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DropdownModel", + "_options_labels": [ + "2020-05-15-13-41-36" + ], + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "DropdownView", + "description": "Select folder:", + "description_tooltip": null, + "disabled": false, + "index": 0, + "layout": "IPY_MODEL_75acaa0a501744f7817d0864462e8a7e", + "style": "IPY_MODEL_3633a55c7efe490784594bad5694800d" + } + }, + "45a8720657764f1585859c3d3dae8745": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "641b5f943c8e419583baaf02485acffb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "75acaa0a501744f7817d0864462e8a7e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "91e278780d5b4dcda11e832e971044f3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DropdownModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DropdownModel", + "_options_labels": [ + "boxplot-F3.png", + "boxplot-F4.png" + ], + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "DropdownView", + "description": "Select plot:", + "description_tooltip": null, + "disabled": false, + "index": 1, + "layout": "IPY_MODEL_b08d8ae9147047acac84d9e52bfee64f", + "style": "IPY_MODEL_c1b161beed5c4b128b06a09d7a5be2fe" + } + }, + "b08d8ae9147047acac84d9e52bfee64f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c1b161beed5c4b128b06a09d7a5be2fe": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e4a83005aaa043d48540b6f4202070e5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DropdownModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DropdownModel", + "_options_labels": [ + "convergence-F4.png", + "convergence-F3.png" + ], + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "DropdownView", + "description": "Select plot:", + "description_tooltip": null, + "disabled": false, + "index": 0, + "layout": "IPY_MODEL_45a8720657764f1585859c3d3dae8745", + "style": "IPY_MODEL_641b5f943c8e419583baaf02485acffb" + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/optimizer.py b/optimizer.py index ce65ce7..d5da331 100644 --- a/optimizer.py +++ b/optimizer.py @@ -66,7 +66,7 @@ def selector(algo, func_details, popSize, Iter): elif algo == "DE": x = de.DE(getattr(benchmarks, function_name), lb, ub, dim, popSize, Iter) else: - return null + return None return x diff --git a/optimizers/GWO.py b/optimizers/GWO.py index 4658daf..54d9847 100644 --- a/optimizers/GWO.py +++ b/optimizers/GWO.py @@ -7,20 +7,12 @@ import random import numpy -import math from solution import solution import time def GWO(objf, lb, ub, dim, SearchAgents_no, Max_iter): - # Max_iter=1000 - # lb=-100 - # ub=100 - # dim=30 - # SearchAgents_no=5 - - # initialize alpha, beta, and delta_pos Alpha_pos = numpy.zeros(dim) Alpha_score = float("inf") diff --git a/optimizers/MFO.py b/optimizers/MFO.py index f8ddafc..4bab4e7 100644 --- a/optimizers/MFO.py +++ b/optimizers/MFO.py @@ -14,11 +14,6 @@ def MFO(objf, lb, ub, dim, N, Max_iteration): - # Max_iteration=1000 - # lb=-100 - # ub=100 - # dim=30 - N = 50 # Number of search agents if not isinstance(lb, list): lb = [lb] * dim if not isinstance(ub, list): diff --git a/optimizers/SSA.py b/optimizers/SSA.py index 6fc093b..5030116 100644 --- a/optimizers/SSA.py +++ b/optimizers/SSA.py @@ -1,3 +1,10 @@ +""" +Salp Swarm Algorithm + +Author: Hossam Faris + +""" + import random import numpy import math @@ -7,11 +14,6 @@ def SSA(objf, lb, ub, dim, N, Max_iteration): - # Max_iteration=1000 - # lb=-100 - # ub=100 - # dim=30 - N = 50 # Number of search agents if not isinstance(lb, list): lb = [lb] * dim if not isinstance(ub, list): diff --git a/vectorized_benchmarks.py b/vectorized_benchmarks.py new file mode 100644 index 0000000..3aaf8e7 --- /dev/null +++ b/vectorized_benchmarks.py @@ -0,0 +1,327 @@ +# -*- coding: utf-8 -*- +""" +Created on Tue May 17 12:46:20 2016 + +@author: Hossam Faris + +Vectorized by AmirPouya Hemmasian, Dec 2021 + +Each function receives a NxD matrix (numpy array) as input. +Each row represents a point in the D-dimensional search space +The output is a numpy array of length N containing the fitness +value of the N points respectively. +""" + +import numpy as np + + + + +# define the function blocks + +# helper function: +def Ufun(x, a, k, m): + return k * ((x - a) ** m) * (x > a) + k * ((-x - a) ** m) * (x < (-a)) + +# Unimodal High-Dimensional Functions: + +def F1(x): + return np.sum(x**2, axis=1) + +def F2(x): + absx = np.abs(x) + return np.sum(absx, axis=1) + np.prod(absx, axis=1) + +def F3(x): + return np.sum(np.cumsum(x, axis=1)**2, axis=1) + +def F4(x): + return np.max(np.abs(x), axis=1) + +def F5(x): + return np.sum( 100*(x[:, 1:] - x[:, :-1]**2)**2 + \ + (x[:, :-1] - 1)**2, axis=1) + +def F6(x): + return np.sum((x + 0.5)**2, axis=1) + +def F7(x): + m, n = x.shape + w = np.arange(1, n+1) + return np.sum(w*x**4, axis=1) + np.random.rand(m) + +# Multimodal High-Dimensional Functions: + +def F8(x): + return np.sum(-x*np.sin(np.abs(x)**0.5), axis=1) + +def F9(x): + return np.sum(x**2 - 10*np.cos(2*np.pi*x), axis=1) + 10*x.shape[1] + +def F10(x): + return -20*np.exp(-0.2 * np.mean(x**2, axis=1)**0.5) \ + - np.exp(np.mean(np.cos(2*np.pi*x), axis=1)) + 20 + np.exp(1) + +def F11(x): + w = np.arange(1, x.shape[1]+1) + return np.sum(x**2, axis=1)/4000 - \ + np.prod( np.cos(x*w**-0.5) , axis=1) + 1 + +def F12(x): + y = 1 + (1 + x)/4 + return np.pi/x.shape[1]*( + 10*np.sin(np.pi*y[:, 0])**2 + + np.sum( (y[:, :-1] - 1)**2 *(1 + 10*np.sin(np.pi*y[:, 1:])**2), axis=1) + + (y[:, -1] - 1)**2 ) + np.sum( Ufun(x, 10, 100, 4), axis=1) + +def F13(x): + return 0.1*( np.sin(3*np.pi*x[:,0])**2 + + np.sum( (x[:,:-1] - 1)**2 *(1 + np.sin(3*np.pi*x[:, 1:])**2 ), axis=1) + + (x[:, -1] - 1)**2 * ( 1 + np.sin(2*np.pi*x[:, -1])**2 ) ) \ + + np.sum(Ufun(x, 5, 100, 4), axis=1) + +# Multimodal Low-Dimensional Functions: + +a14 = np.array([[-32, -16, 0, 16, 32, + -32, -16, 0, 16, 32, + -32, -16, 0, 16, 32, + -32, -16, 0, 16, 32, + -32, -16, 0, 16, 32], + [-32, -32, -32, -32, -32, + -16, -16, -16, -16, -16, + 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, + 32, 32, 32, 32, 32]])[None, :, :] + +def F14(x): + v = x[:, :, None] + s = 1/(np.arange(1,26) + np.sum((v-a14)**6, axis=1)) + return 1/( 1/500 + np.sum(s, axis=-1) ) + + +a15 = np.array([0.1957, 0.1947, 0.1735, 0.16, 0.0844, 0.0627, + 0.0456, 0.0342, 0.0323, 0.0235, 0.0246,]) +b15 = 1/np.array([0.25, 0.5, 1, 2, 4, 6, 8, 10, 12, 14, 16]) + +def F15(L): + L = L[:,:,None] + return np.sum( + (a15 -(L[:,0,:]*(b15 **2+L[:,1,:]*b15))/(b15**2+L[:,2,:]*b15+L[:,3,:]))**2, + axis=-1) + +def F16(L): + return ( + 4 * (L[:,0] ** 2) + - 2.1 * (L[:,0] ** 4) + + (L[:,0] ** 6) / 3 + + L[:,0] * L[:,1] + - 4 * (L[:,1] ** 2) + + 4 * (L[:,1] ** 4) + ) + +def F17(L): + return ( + (L[:,1] - L[:,0]**2 * 5.1/(4*np.pi**2) + 5/np.pi*L[:,0] -6)**2 + + 10 * (1 - 1 / (8 * np.pi)) * np.cos(L[:,0]) + 10 + ) + +def F18(L): + return (1 + + (L[:,0] + L[:,1] + 1) ** 2 + * ( + 19 + - 14 * L[:,0] + + 3 * L[:,0] ** 2 + - 14 * L[:,1] + + 6 * L[:,0] * L[:,1] + + 3 * L[:,1] ** 2 + ) + ) * (30+ (2 * L[:,0] - 3 * L[:,1]) ** 2 + * (18 + - 32 * L[:,0] + + 12 * L[:,0] ** 2 + + 48 * L[:,1] + - 36 * L[:,0] * L[:,1] + + 27 * L[:,1] ** 2 + ) + ) + +a19 = np.array([[3, 10, 30], [0.1, 10, 35], [3, 10, 30], [0.1, 10, 35]]).T +c19 = np.array([1, 1.2, 3, 3.2]) +p19 = np.array([[0.3689, 0.117, 0.2673], + [0.4699, 0.4387, 0.747], + [0.1091, 0.8732, 0.5547], + [0.03815, 0.5743, 0.8828]]).T + +def F19(L): + L = L[:,:, None] + return -np.sum(c19*np.exp(-np.sum(a19*(L-p19)**2,axis=1)), axis=1) + +a20 = np.array([[10, 3, 17, 3.5, 1.7, 8], + [0.05, 10, 17, 0.1, 8, 14], + [3, 3.5, 1.7, 10, 17, 8], + [17, 8, 0.05, 10, 0.1, 14]]).T +c20 = np.array([1, 1.2, 3, 3.2]) +p20 = np.array([[0.1312, 0.1696, 0.5569, 0.0124, 0.8283, 0.5886], + [0.2329, 0.4135, 0.8307, 0.3736, 0.1004, 0.9991], + [0.2348, 0.1415, 0.3522, 0.2883, 0.3047, 0.6650], + [0.4047, 0.8828, 0.8732, 0.5743, 0.1091, 0.0381]]).T + +def F20(L): + L = L[:,:, None] + return -np.sum(c20*np.exp(-np.sum(a20*(L-p20)**2,axis=1)), axis=1) + +a20s = np.array([ + [4, 4, 4, 4], + [1, 1, 1, 1], + [8, 8, 8, 8], + [6, 6, 6, 6], + [3, 7, 3, 7], + [2, 9, 2, 9], + [5, 5, 3, 3], + [8, 1, 8, 1], + [6, 2, 6, 2], + [7, 3.6, 7, 3.6]]).T +c20s = np.array([0.1, 0.2, 0.2, 0.4, 0.4, 0.6, 0.3, 0.7, 0.5, 0.5]) + +def F21(L): + L = L[:,:,None] + return -np.sum((np.sum((L-a20s[:,:5])**2, axis=1) + c20s[:5])**-1, axis=1) + +def F22(L): + L = L[:,:,None] + return -np.sum((np.sum((L-a20s[:,:7])**2, axis=1) + c20s[:7])**-1, axis=1) + +def F23(L): + L = L[:,:,None] + return -np.sum((np.sum((L-a20s)**2, axis=1) + c20s)**-1, axis=1) + + + +param = { + "F1": ["F1", -100, 100, 30], + "F2": ["F2", -10, 10, 30], + "F3": ["F3", -100, 100, 30], + "F4": ["F4", -100, 100, 30], + "F5": ["F5", -30, 30, 30], + "F6": ["F6", -100, 100, 30], + "F7": ["F7", -1.28, 1.28, 30], + "F8": ["F8", -500, 500, 30], + "F9": ["F9", -5.12, 5.12, 30], + "F10": ["F10", -32, 32, 30], + "F11": ["F11", -600, 600, 30], + "F12": ["F12", -50, 50, 30], + "F13": ["F13", -50, 50, 30], + "F14": ["F14", -65.536, 65.536, 2], + "F15": ["F15", -5, 5, 4], + "F16": ["F16", -5, 5, 2], + "F17": ["F17", -5, 15, 2], + "F18": ["F18", -2, 2, 2], + "F19": ["F19", 0, 1, 3], + "F20": ["F20", 0, 1, 6], + "F21": ["F21", 0, 10, 4], + "F22": ["F22", 0, 10, 4], + "F23": ["F23", 0, 10, 4]} + +def getFunctionDetails(a): + # [name, lb, ub, dim] + return param.get(a, "nothing") + +''' +# ESAs space mission design benchmarks https://www.esa.int/gsp/ACT/projects/gtop/ +from fcmaes.astro import ( + MessFull, + Messenger, + Gtoc1, + Cassini1, + Cassini2, + Rosetta, + Tandem, + Sagas, +) +def Ca1(x): + return Cassini1().fun(x) +def Ca2(x): + return Cassini2().fun(x) +def Ros(x): + return Rosetta().fun(x) +def Tan(x): + return Tandem(5).fun(x) +def Sag(x): + return Sagas().fun(x) +def Mef(x): + return MessFull().fun(x) +def Mes(x): + return Messenger().fun(x) +def Gt1(x): + return Gtoc1().fun(x) + +param = { + "F1": ["F1", -100, 100, 30], + "F2": ["F2", -10, 10, 30], + "F3": ["F3", -100, 100, 30], + "F4": ["F4", -100, 100, 30], + "F5": ["F5", -30, 30, 30], + "F6": ["F6", -100, 100, 30], + "F7": ["F7", -1.28, 1.28, 30], + "F8": ["F8", -500, 500, 30], + "F9": ["F9", -5.12, 5.12, 30], + "F10": ["F10", -32, 32, 30], + "F11": ["F11", -600, 600, 30], + "F12": ["F12", -50, 50, 30], + "F13": ["F13", -50, 50, 30], + "F14": ["F14", -65.536, 65.536, 2], + "F15": ["F15", -5, 5, 4], + "F16": ["F16", -5, 5, 2], + "F17": ["F17", -5, 15, 2], + "F18": ["F18", -2, 2, 2], + "F19": ["F19", 0, 1, 3], + "F20": ["F20", 0, 1, 6], + "F21": ["F21", 0, 10, 4], + "F22": ["F22", 0, 10, 4], + "F23": ["F23", 0, 10, 4], + "Ca1": [ + "Ca1", + Cassini1().bounds.lb, + Cassini1().bounds.ub, + len(Cassini1().bounds.lb), + ], + "Ca2": [ + "Ca2", + Cassini2().bounds.lb, + Cassini2().bounds.ub, + len(Cassini2().bounds.lb), + ], + "Gt1": ["Gt1", Gtoc1().bounds.lb, Gtoc1().bounds.ub, len(Gtoc1().bounds.lb)], + "Mes": [ + "Mes", + Messenger().bounds.lb, + Messenger().bounds.ub, + len(Messenger().bounds.lb), + ], + "Mef": [ + "Mef", + MessFull().bounds.lb, + MessFull().bounds.ub, + len(MessFull().bounds.lb), + ], + "Sag": ["Sag", Sagas().bounds.lb, Sagas().bounds.ub, len(Sagas().bounds.lb)], + "Tan": [ + "Tan", + Tandem(5).bounds.lb, + Tandem(5).bounds.ub, + len(Tandem(5).bounds.lb), + ], + "Ros": [ + "Ros", + Rosetta().bounds.lb, + Rosetta().bounds.ub, + len(Rosetta().bounds.lb), + ], + } + +def getFunctionDetails(a): + # [name, lb, ub, dim] + return param.get(a, "nothing") + +''' \ No newline at end of file diff --git a/vectorized_optimizer.py b/vectorized_optimizer.py new file mode 100644 index 0000000..91862cd --- /dev/null +++ b/vectorized_optimizer.py @@ -0,0 +1,163 @@ +# -*- coding: utf-8 -*- +""" +Created on Tue May 17 15:50:25 2016 + +@author: hossam + +Vectorized by: AmirPouya Hemmasian + +""" +from pathlib import Path +import vectorized_optimizers.GWO as gwo +import vectorized_optimizers.MFO as mfo +import vectorized_optimizers.WOA as woa +import vectorized_optimizers.SSA as ssa +import vectorized_optimizers.SCA as sca +import vectorized_benchmarks as benchmarks +import csv +import numpy +import time +import warnings +import os +import plot_convergence as conv_plot +import plot_boxplot as box_plot + +warnings.simplefilter(action="ignore") + + +def selector(algo, func_details, popSize, Iter): + function_name = func_details[0] + lb = func_details[1] + ub = func_details[2] + dim = func_details[3] + + if algo == "SSA": + x = ssa.SSA(getattr(benchmarks, function_name), lb, ub, dim, popSize, Iter) + elif algo == "GWO": + x = gwo.GWO(getattr(benchmarks, function_name), lb, ub, dim, popSize, Iter) + elif algo == "WOA": + x = woa.WOA(getattr(benchmarks, function_name), lb, ub, dim, popSize, Iter) + elif algo == "MFO": + x = mfo.MFO(getattr(benchmarks, function_name), lb, ub, dim, popSize, Iter) + elif algo == "SCA": + x = sca.SCA(getattr(benchmarks, function_name), lb, ub, dim, popSize, Iter) + else: + return None + return x + +def run(optimizer, objectivefunc, NumOfRuns, params, export_flags): + + """ + It serves as the main interface of the framework for running the experiments. + + Parameters + ---------- + optimizer : list + The list of optimizers names + objectivefunc : list + The list of benchmark functions + NumOfRuns : int + The number of independent runs + params : set + The set of parameters which are: + 1. Size of population (PopulationSize) + 2. The number of iterations (Iterations) + export_flags : set + The set of Boolean flags which are: + 1. Export (Exporting the results in a file) + 2. Export_details (Exporting the detailed results in files) + 3. Export_convergence (Exporting the covergence plots) + 4. Export_boxplot (Exporting the box plots) + + Returns + ----------- + N/A + """ + + # Select general parameters for all optimizers (population size, number of iterations) .... + PopulationSize = params["PopulationSize"] + Iterations = params["Iterations"] + + # Export results ? + Export = export_flags["Export_avg"] + Export_details = export_flags["Export_details"] + Export_convergence = export_flags["Export_convergence"] + Export_boxplot = export_flags["Export_boxplot"] + + Flag = False + Flag_details = False + + # CSV Header for for the cinvergence + CnvgHeader = [] + + results_directory = time.strftime("%Y-%m-%d-%H-%M-%S") + "/" + Path(results_directory).mkdir(parents=True, exist_ok=True) + + for l in range(0, Iterations): + CnvgHeader.append("Iter" + str(l + 1)) + + for i in range(0, len(optimizer)): + for j in range(0, len(objectivefunc)): + convergence = [0] * NumOfRuns + executionTime = [0] * NumOfRuns + for k in range(0, NumOfRuns): + func_details = benchmarks.getFunctionDetails(objectivefunc[j]) + x = selector(optimizer[i], func_details, PopulationSize, Iterations) + convergence[k] = x.convergence + optimizerName = x.optimizer + objfname = x.objfname + if Export_details == True: + ExportToFile = results_directory + "experiment_details.csv" + with open(ExportToFile, "a", newline="\n") as out: + writer = csv.writer(out, delimiter=",") + if ( + Flag_details == False + ): # just one time to write the header of the CSV file + header = numpy.concatenate( + [["Optimizer", "objfname", "ExecutionTime"], CnvgHeader] + ) + writer.writerow(header) + Flag_details = True # at least one experiment + executionTime[k] = x.executionTime + a = numpy.concatenate( + [[x.optimizer, x.objfname, x.executionTime], x.convergence] + ) + writer.writerow(a) + out.close() + + if Export == True: + ExportToFile = results_directory + "experiment.csv" + + with open(ExportToFile, "a", newline="\n") as out: + writer = csv.writer(out, delimiter=",") + if ( + Flag == False + ): # just one time to write the header of the CSV file + header = numpy.concatenate( + [["Optimizer", "objfname", "ExecutionTime"], CnvgHeader] + ) + writer.writerow(header) + Flag = True + + avgExecutionTime = float("%0.2f" % (sum(executionTime) / NumOfRuns)) + avgConvergence = numpy.around( + numpy.mean(convergence, axis=0, dtype=numpy.float64), decimals=2 + ).tolist() + a = numpy.concatenate( + [[optimizerName, objfname, avgExecutionTime], avgConvergence] + ) + writer.writerow(a) + out.close() + + if Export_convergence == True: + conv_plot.run(results_directory, optimizer, objectivefunc, Iterations) + + if Export_boxplot == True: + box_plot.run(results_directory, optimizer, objectivefunc, Iterations) + + if Flag == False: # Faild to run at least one experiment + print( + "No Optomizer or Cost function is selected. Check lists of available optimizers and cost functions" + ) + + print("Execution completed") diff --git a/vectorized_optimizers/GWO.py b/vectorized_optimizers/GWO.py new file mode 100644 index 0000000..3881759 --- /dev/null +++ b/vectorized_optimizers/GWO.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +""" +Created on Mon May 16 00:27:50 2016 + +@author: Hossam Faris + +Vectorized by AmirPouya Hemmasian in Dec 2021 + +""" + +import numpy as np +from solution import solution +import time + + +def GWO(objf, lb, ub, dim, SearchAgents_no, Max_iter): + + # initialize alpha, beta, and delta_pos + top3_score = np.array([float('inf')]*3) + top3_pos = np.zeros((3,dim)) + + if not isinstance(lb, list): + lb = [lb] * dim + if not isinstance(ub, list): + ub = [ub] * dim + + lb = np.array(lb) + ub = np.array(ub) + + # Initialize the positions of search agents + Positions = np.random.uniform(lb, ub, (SearchAgents_no,dim)) + + Convergence_curve = np.zeros(Max_iter) + s = solution() + + # Loop counter + print(f'GWO is optimizing {objf.__name__}') + + timerStart = time.time() + s.startTime = time.strftime("%Y-%m-%d-%H-%M-%S") + # Main loop + for t in range(Max_iter): + + f_list = objf(Positions) + + # new alpha, beta, delta + f_race = np.concatenate((top3_score, f_list)) + pos_race = np.concatenate((top3_pos, Positions)) + winners = np.argsort(f_race)[:3] + top3_score = f_race[winners] + top3_pos = pos_race[winners] + + # a decreases linearly fron 2 to 0 + a = 2*(1-t/Max_iter) + + # sampling the random values r + r = np.random.rand(6, SearchAgents_no, dim) + + # A and C for alpha, beta, delta + A = a*(2*r[:3]-1) + C = 2*r[3:] + + Positions = np.mean( + top3_pos[:, None, :] - + A*np.abs(C*top3_pos[:, None, :] - Positions) + , axis=0) + + Positions = np.clip(Positions, lb, ub) + + Convergence_curve[t] = top3_score[0] + + if (t+1) % 100 == 0: + print(f'Iteration: {t+1} | Best Fitness: {top3_score[0]}') + + timerEnd = time.time() + s.endTime = time.strftime("%Y-%m-%d-%H-%M-%S") + s.executionTime = timerEnd - timerStart + s.convergence = Convergence_curve + s.optimizer = "GWO" + s.objfname = objf.__name__ + + return s diff --git a/vectorized_optimizers/MFO.py b/vectorized_optimizers/MFO.py new file mode 100644 index 0000000..e7987aa --- /dev/null +++ b/vectorized_optimizers/MFO.py @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- +""" +Created on Mon May 16 10:42:18 2016 + +@author: hossam + +Vectorized by AmirPouya Hemmasian in Dec 2021 +""" + + +import numpy as np +import math +from solution import solution +import time + + +def MFO(objf, lb, ub, dim, N, Max_iter): + + if not isinstance(lb, list): + lb = [lb] * dim + if not isinstance(ub, list): + ub = [ub] * dim + + # Initialize the positions of moths + lb = np.array(lb) + ub = np.array(ub) + + + Moth_pos = np.random.uniform(lb, ub, (N, dim)) + + Convergence_curve = np.zeros(Max_iter) + + s = solution() + + print(f'MFO is optimizing {objf.__name__}') + + timerStart = time.time() + s.startTime = time.strftime("%Y-%m-%d-%H-%M-%S") + + b = 1 + Moth_fitness = objf(Moth_pos) + I = np.argsort(Moth_fitness) + flame_pos = Moth_pos[I] + flame_fitness = Moth_fitness[I] + + # Main loop + for t in range(Max_iter): + + # Number of flames Eq. (3.14) in the paper + Flame_no = int(N-(N-1)*t/Max_iter) + + a = -1-t/Max_iter + + # Eq. 3.12 and 3,.13 to update the moth positions: + T = (a-1)*np.random.rand(N,dim) + 1 + + spiral = np.exp(b*T)*np.cos(2*np.pi*T) + + Moth_pos[:Flame_no] = flame_pos[:Flame_no] + spiral[:Flame_no]*\ + np.abs(flame_pos[:Flame_no]-Moth_pos[:Flame_no]) + if Flame_no=0.5 # bubble net + es = (p<0.5) & (np.abs(A)>=1) # encircle search + eh = (p<0.5) & (np.abs(A)<1) # encircle hunt + + li = np.random.choice(SearchAgents_no, es.sum()) + l = (a2 - 1) * np.random.rand(bl.sum()) + 1 + b = 1 + A = A[:,None] + C = C[:,None] + + Positions[es] = Positions[li] - A[es]*np.abs(C[es]*Positions[li] - Positions[es]) + + Positions[eh] = Leader_pos - \ + A[eh]*np.abs(C[eh]*Leader_pos - Positions[eh]) + + Positions[bl] = np.abs(Leader_pos - Positions[bl])*\ + np.exp(b*l[:,None])*np.cos(np.pi*2*l[:,None]) + Leader_pos + + + Positions = np.clip(Positions, lb, ub) + + convergence_curve[t] = Leader_score + + if (t+1) % 100 == 0: + print(f'Iteration: {t+1} | Best Fitness: {Leader_score}') + + timerEnd = time.time() + s.endTime = time.strftime("%Y-%m-%d-%H-%M-%S") + s.executionTime = timerEnd - timerStart + s.convergence = convergence_curve + s.optimizer = "WOA" + s.objfname = objf.__name__ + s.best = Leader_score + s.bestIndividual = Leader_pos + + return s