{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Calculate a Pareto optimal set" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Pareto optimality](https://en.wikipedia.org/wiki/Pareto_efficiency) (or multi-objective optimization) allows one to search for optimal solutions for an optimization problem with multiple objectives. The Pareto class in the Orthogonal Array package allows one to calculate the Pareto optimal elements (called the Pareto frontier)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "%matplotlib inline\n", "\n", "import oapackage" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, define a dataset of 50 random vectors. The vectors have length 2, so there are 2 objectives to be optimized." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "datapoints = np.random.rand(2, 50)\n", "\n", "for ii in range(0, datapoints.shape[1]):\n", " w = datapoints[:, ii]\n", " fac = 0.6 + 0.4 * np.linalg.norm(w)\n", " datapoints[:, ii] = (1 / fac) * w\n", "\n", "h = plt.plot(datapoints[0, :], datapoints[1, :], \".b\", markersize=16, label=\"Non Pareto-optimal\")\n", "_ = plt.title(\"The input data\", fontsize=15)\n", "plt.xlabel(\"Objective 1\", fontsize=16)\n", "plt.ylabel(\"Objective 2\", fontsize=16)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a structure (`ParetoDoubleLong`) to keep track of the data." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Pareto: 12 optimal values, 12 objects\n" ] } ], "source": [ "pareto = oapackage.ParetoDoubleLong()\n", "\n", "for ii in range(0, datapoints.shape[1]):\n", " w = oapackage.doubleVector((datapoints[0, ii], datapoints[1, ii]))\n", " pareto.addvalue(w, ii)\n", "\n", "pareto.show(verbose=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot the results." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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RaTWALh7QR7nnHOO9/Xb3/6232u9HTzo3t7ufsIJ7sE/R/pHTU3W02R13HHH+a5du/zUU0/1nTt3emtrq7e0tLi7+8c+9jF/+OGH3d39wQcf9E984hPu7n799df7pz/9ae/q6vIXX3zRJ0yYkPHc7u4HDhzw2bNn+9KlS93dfceOHe7uvmfPHp84caJ3dHS4uzvgy5cvd3f39957z88//3zftm2bu7v/6Ec/8htvvNHd3RsbG339+vXu7r53714fO3asb9y40d3dr732Wl+yZEm/uqxYscIvuugiP3jwoG/dutVPPvlkf/PNN33lypVeXl7umzZt8oMHD/pFF13kf//3f39Y/fu+n5UrV/rxxx/vb775pu/bt88/+MEP+vz5893d/bvf/a7feuut7u7+9ttv+6FDh9zd/Yc//KHfcccd7u7+0EMP+Re/+MW0n9lAvxNSWGbZ/++VlRW7hunNn+9eUZG+zhUVQXmu7N4dnK+mJvg8amqC57t35+b8wLMeIsZGtmUOMGxYMP1w167sxx3pIMMHPvABrrvuOu67777DXl+3bh2f+cxnALj22mt5+umne8ouv/xyysrKOOusszK2OLtbtueeey6nnHIKN998MwD33XcfU6ZMob6+ntdff52XX34ZCPrYP/WpTwGwceNGXnjhBS6++GKmTp3Kt771Ldrb2/tdY+PGjYwbN47TTz8dgOuvv541a9b0O+7pp5/m6quvZtiwYZx44ok0Njayfv16AKZPn8748eMZNmwYV1999WHvM5Np06YxZswYysvLmTBhApdccgkAdXV1bN68GQimnl566aXU1dXR2trKiy++OOB5JVqi1Cc8GIW8o6isDKYfbtsGXV3B14ULC7+YKxabU1RVBbdI2cqP1G233cZHPvIRbrzxxozH9J5tUV5e3vO9Z5hD2d1n3tuqVav45S9/ybp16zj22GOZOXNmz3S8iooKhg0b1nPOiRMnsm7duqz1znTt3/zmN3z+858H4J577sl4XN/3le55Or3ff1lZWc/zsrIyDqamGn35y1/mjjvuYPbs2axatSpnA8tSOPPmBV0T6QJjlPPCRGmWSaFEumXerRCDDKNGjeLKK6/kwQcf7Hntggsu4Ec/+hEAjz/+OH/yJ39yxNfZtWsXI0eO5Nhjj+Wll16ira0t7XEf/vCH2b59e08wP3DgQE/LdsSI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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "lst = pareto.allindices() # the indices of the Pareto optimal designs\n", "\n", "optimal_datapoints = datapoints[:, lst]\n", "\n", "h = plt.plot(datapoints[0, :], datapoints[1, :], \".b\", markersize=16, label=\"Non Pareto-optimal\")\n", "hp = plt.plot(optimal_datapoints[0, :], optimal_datapoints[1, :], \".r\", markersize=16, label=\"Pareto optimal\")\n", "plt.xlabel(\"Objective 1\", fontsize=16)\n", "plt.ylabel(\"Objective 2\", fontsize=16)\n", "plt.xticks([])\n", "plt.yticks([])\n", "_ = plt.legend(loc=3, numpoints=1)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.1" } }, "nbformat": 4, "nbformat_minor": 2 }