{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "3cdc1b46", "metadata": {}, "outputs": [], "source": [ "# Cost function modelling the University of the Caribbean Lands scenario\n", "#\n", "# Parameters (beside the debug flag, which is boolean), passed as a list:\n", "# * x[0], fraction of the investment to go to School of Agronomy (A)\n", "# * x[1], fraction of the investment to go to School of Business (B)\n", "# * x[2], fraction of the investment to go to School of Computing (C)\n", "#\n", "# Contract/precondition: All x[i] >= 0, sum over all x[i] <= 1.\n", "# The remainder is understood to go into Dormitories (D).\n", "#\n", "# The function returns a list with the predicted outcome for the three minimization objectives:\n", "# * first element y_0: Decrease in research strength within five years,\n", "# quantified by the annual number of citations to papers from the university\n", "# * second element y_1: Others' share in the real-estate tenancy business (1 - our share),\n", "# quantified in terms of the fraction of the overall the number of tenants in Pt. Reston\n", "# * third element y_2: Number of votes against the investment plan in the Grand Council.\n", "# The Grand Council is assumed to have 60 seats.\n", "#\n", "# Remark: We intentionally return fractional numbers of seats in the Grand Council, i.e.,\n", "# that criterion is treated as a continuous rather than a discrete quantity.\n", "# The same goes for the number of citations to papers.\n", "#\n", "# Justification:\n", "# a) Numerical optimization; it is easier that way for opt.minimize() to walk toward minima.\n", "# b) There is an actual sense in which these values should be floating-point numbers.\n", "# We are here returning the *expected* outcome for these quantities.\n", "# This technically would be a weighted average over probabilities for random variables.\n", "# We are here developing a simple qualitative model, where these random variables are not\n", "# included explicitly, but both research success and votes do indeed depend on chance.\n", "#\n", "def cost_function(x, debug_output):\n", " # copy x into a list containing investment fractions\n", " # if the constraints are violated, all are assumed to be zero\n", " #\n", " # note that technically it is not our duty to ensure that the preconditions are met;\n", " # nonetheless, the scalar optimizer from scipy might not adhere to the contract\n", " #\n", " if x[0] >= 0 and x[1] >= 0 and x[2] >= 0 and (x[0] + x[1] + x[2]) <= 1:\n", " investment_fraction = [x[0], x[1], x[2], 1 - x[0] - x[1] - x[2]]\n", " else:\n", " investment_fraction = [0, 0, 0, 0]\n", " \n", " # compute the predicted improved research strength for each school,\n", " # and from these data, compute the prediction for y_0\n", " # model: square root of research strength responds linearly to investment\n", " #\n", " present_sqrt_res_strength = [present_research_strength[i]**0.5 for i in range(3)]\n", " future_sqrt_res_strength = [present_sqrt_res_strength[i] + \\\n", " research_response_coefficient*investment_fraction[i] \\\n", " for i in range(3)]\n", " future_research_strength = [future_sqrt_res_strength[i]*future_sqrt_res_strength[i] \\\n", " for i in range(3)]\n", " research_decrease = 0\n", " for i in range(3):\n", " research_decrease += present_research_strength[i] - future_research_strength[i]\n", " \n", " # compute the prediction for the tenancy metric y_1\n", " # model: it responds linearly to investment\n", " #\n", " others_tenancy_share = others_tenancy_share_now + tenancy_response_coefficient*investment_fraction[3]\n", " \n", " # now predict the vote on the Grand Council:\n", " # we assume that the council is split into interest groups concerning A, B, C, D\n", " #\n", " # each group responds linearly to investment, for a range\n", " # between minimal expectation (all against) and maximal expectation (all in favour);\n", " # outside this range, the respective group is all against or all in favour of the proposal\n", " #\n", " votes_against = 0\n", " for i in range(4):\n", " if min_expectation[i] >= investment_fraction[i]:\n", " votes_against += council_presence[i]\n", " elif max_expectation[i] >= investment_fraction[i]:\n", " fraction_in_favour = (investment_fraction[i] - \\\n", " min_expectation[i]) / (max_expectation[i] - min_expectation[i])\n", " votes_against += (1 - fraction_in_favour) * council_presence[i]\n", " \n", " # return the outcome, including debugging output if requested\n", " #\n", " y = [research_decrease, others_tenancy_share, votes_against]\n", " \n", " if debug_output:\n", " print(\"\\ninvestment fraction:\")\n", " for i in range(len(investment_fraction)):\n", " print(\"\\tinvestment_fraction[\", i, \"]\\t=\\t\", round(100*investment_fraction[i], 3), \" %\", sep=\"\")\n", " \n", " print(\"\\npredicted research strength:\")\n", " for i in range(len(future_research_strength)):\n", " print(\"\\tfuture_research_strength[\", i, \"]\\t=\\t\", \\\n", " round(future_research_strength[i], 1), sep=\"\", end=\"\")\n", " print(\"\\t(now:\\t\", present_research_strength[i], \")\", sep=\"\")\n", " \n", " council_size = 0\n", " for n in council_presence:\n", " council_size += n\n", " print(\"\\npredicted vote in the Grand Council:\\n\\tFor:\", \\\n", " round(council_size - votes_against, 2), \"\\n\\tAgainst:\", round(votes_against, 2))\n", " \n", " print(\"\\nobjectives:\")\n", " for i in range(len(y)):\n", " print(\"\\ty[\", i, \"]\\t=\\t\", round(y[i], 5), sep=\"\")\n", " return y\n", "\n", "\n", "# constant coefficients used in the model cost function\n", "#\n", "present_research_strength = [20000, 5000, 2000] # present research strength of the three schools\n", "research_response_coefficient = 30 # linear response of sqrt(research strength) to investment\n", "others_tenancy_share_now = 0.993 # at present, 99.3% of tenants in Pt. Reston do not rent from us\n", "tenancy_response_coefficient = -0.007 # our share might be doubled if we invest 100% in this\n", "council_presence = [12, 9, 15, 24] # seats of each of the four factions on the Grand Council\n", "min_expectation = [0.32, 0.08, 0.02, 0.04] # how much needs to be invested until some vote for the plan\n", "max_expectation = [0.64, 0.12, 0.2, 0.64] # how much needs to be invested so that all vote for the plan" ] }, { "cell_type": "code", "execution_count": 2, "id": "e36134e7", "metadata": {}, "outputs": [], "source": [ "import random\n", "from scipy.stats import lognorm\n", "\n", "# returns a random point in parameter space, for this particular scenario\n", "#\n", "def random_parameters():\n", " unnormalized = [random.random() for i in range(4)]\n", " u_sum = 0.0\n", " for u in unnormalized: # rescale to unity, since sum of investment fractions is 100%\n", " u_sum += u\n", " x = [unnormalized[i] / u_sum for i in range(3)] # we only include the first three fractions in the list\n", " return x\n", "\n", "# returns a random weighting of the objectives, normalized by their characteristic scale\n", "# log-normal distribution chosen\n", "#\n", "def random_weights():\n", " return [lognorm.rvs(sigma) / scale for scale in objective_scale]\n", "\n", "sigma = 3 # std deviation in logarithm of the random weights\n", "objective_scale = [9000, 0.007, 36] # scale of outcome expected for each of the objectives" ] }, { "cell_type": "code", "execution_count": 3, "id": "c34f9ea4", "metadata": {}, "outputs": [], "source": [ "# wrappers for Pareto front construction based on linear combinations and hyperboxing\n", "#\n", "import math\n", "import scipy.optimize as opt\n", "\n", "# the first argument, x, is a list containing the parameter values\n", "# the second argument, w, is a list containing the weights associated with each of the objectives\n", "#\n", "def cost_linear_combination(x, w, debug_output):\n", " combined_cost = 0\n", " y = cost_function(x, debug_output)\n", " for i in range(min(len(y), len(w))):\n", " combined_cost += w[i]*y[i]\n", " if debug_output:\n", " print(\"\\nCombined cost measure w[0]y[0] + w[1]y[1] + ... =\", round(combined_cost, 5))\n", " return combined_cost\n", "\n", "# the arguments are the initial point x0 and the weights w\n", "#\n", "def linear_combination_optimizer_local(x0, w, epsilon, debug_output):\n", " # below we define a function inside this function, for which w is fixed;\n", " # then, only the list x remains as an argument\n", " def fixed_weight_cost_function(x):\n", " return cost_linear_combination(x, w, False)\n", " \n", " # the function defined above has the right format to be handed over to opt.minimize\n", " local_minimum = opt.minimize(fixed_weight_cost_function, x0, method='nelder-mead', \\\n", " options={'xatol': epsilon})\n", " \n", " if debug_output:\n", " print(\"weights: \")\n", " for i in range(len(w)):\n", " print(\"\\tw[\", i, \"]\\t=\\t\", round(w[i], 4), sep=\"\")\n", " cost_linear_combination(local_minimum.x, w, True)\n", " return list(local_minimum.x)\n", "\n", "# runs multiple attempts at local optimization starting from random parameters\n", "#\n", "def linear_combination_optimizer_global(w, epsilon, attempts, debug_output):\n", " wy_global_min = math.inf\n", " for i in range(attempts):\n", " x_local_min = linear_combination_optimizer_local(random_parameters(), w, epsilon, False)\n", " wy_local_min = cost_linear_combination(x_local_min, w, False)\n", " if wy_local_min < wy_global_min:\n", " x_global_min = x_local_min\n", " wy_global_min = wy_local_min\n", " if debug_output:\n", " print(\"weights: \")\n", " for i in range(len(w)):\n", " print(\"\\tw[\", i, \"]\\t=\\t\", round(w[i], 4), sep=\"\")\n", " cost_linear_combination(x_global_min, w, True)\n", " return x_global_min\n", "\n", "# the first argument, x, is a list containing the parameter values\n", "# the second argument, w, contains the weights of each objective\n", "# the third argument, yoff, is a list containing hyperboxing offsets for the optimization criteria\n", "#\n", "def cost_hyperboxing(x, w, yoff):\n", " y = cost_function(x, False)\n", " ymax_shifted = -math.inf\n", " for i in range(min(len(y), len(yoff))):\n", " yi_shifted = w[i]*(y[i] - yoff[i])\n", " if yi_shifted > ymax_shifted:\n", " ymax_shifted = yi_shifted\n", " return ymax_shifted\n", "\n", "# the arguments are the initial point x0, the weights w, and the offsets yoff\n", "#\n", "def hyperboxing_optimizer_local(x0, w, yoff, epsilon):\n", " # below we define a function inside this function, for which yoff is fixed;\n", " # then, only the list x remains as an argument\n", " def fixed_offset_cost_function(x):\n", " return cost_hyperboxing(x, w, yoff)\n", " \n", " # the function defined above has the right format to be handed over to opt.minimize\n", " local_minimum = opt.minimize(fixed_offset_cost_function, x0, method='nelder-mead', \\\n", " options={'xatol': epsilon})\n", " return list(local_minimum.x)\n", "\n", "# runs multiple attempts at local optimization starting from random parameters\n", "#\n", "def hyperboxing_optimizer_global(w, yoff, epsilon, attempts):\n", " ymax_global_min = math.inf\n", " for i in range(attempts):\n", " x_local_min = hyperboxing_optimizer_local(random_parameters(), w, yoff, epsilon)\n", " ymax_local_min = cost_hyperboxing(x_local_min, w, yoff)\n", " if ymax_local_min < ymax_global_min:\n", " x_global_min = x_local_min\n", " ymax_global_min = ymax_local_min\n", " return x_global_min" ] }, { "cell_type": "code", "execution_count": 4, "id": "77794408", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "==\n", "Compromise attempt no. i = 0\n", "\n", "weights: \n", "\tw[0]\t=\t0.0001\n", "\tw[1]\t=\t8549.7584\n", "\tw[2]\t=\t0.0047\n", "\n", "investment fraction:\n", "\tinvestment_fraction[0]\t=\t0.494 %\n", "\tinvestment_fraction[1]\t=\t0.0 %\n", "\tinvestment_fraction[2]\t=\t0.0 %\n", "\tinvestment_fraction[3]\t=\t99.506 %\n", "\n", "predicted research strength:\n", "\tfuture_research_strength[0]\t=\t20041.9\t(now:\t20000)\n", "\tfuture_research_strength[1]\t=\t5000.0\t(now:\t5000)\n", "\tfuture_research_strength[2]\t=\t2000.0\t(now:\t2000)\n", "\n", "predicted vote in the Grand Council:\n", "\tFor: 24 \n", "\tAgainst: 36\n", "\n", "objectives:\n", "\ty[0]\t=\t-41.90581\n", "\ty[1]\t=\t0.98603\n", "\ty[2]\t=\t36\n", "\n", "Combined cost measure w[0]y[0] + w[1]y[1] + ... = 8430.51928\n", "\n", "==\n", "Compromise attempt no. i = 1\n", "\n", "weights: \n", "\tw[0]\t=\t0.0\n", "\tw[1]\t=\t0.7989\n", "\tw[2]\t=\t0.046\n", "\n", "investment fraction:\n", "\tinvestment_fraction[0]\t=\t4.0 %\n", "\tinvestment_fraction[1]\t=\t12.0 %\n", "\tinvestment_fraction[2]\t=\t20.0 %\n", "\tinvestment_fraction[3]\t=\t64.0 %\n", "\n", "predicted research strength:\n", "\tfuture_research_strength[0]\t=\t20340.8\t(now:\t20000)\n", "\tfuture_research_strength[1]\t=\t5522.1\t(now:\t5000)\n", "\tfuture_research_strength[2]\t=\t2572.7\t(now:\t2000)\n", "\n", "predicted vote in the Grand Council:\n", "\tFor: 48 \n", "\tAgainst: 12\n", "\n", "objectives:\n", "\ty[0]\t=\t-1435.58075\n", "\ty[1]\t=\t0.98852\n", "\ty[2]\t=\t12\n", "\n", "Combined cost measure w[0]y[0] + w[1]y[1] + ... = 1.31838\n", "\n", "==\n", "Compromise attempt no. i = 2\n", "\n", "weights: \n", "\tw[0]\t=\t0.0\n", "\tw[1]\t=\t46.2918\n", "\tw[2]\t=\t0.0006\n", "\n", "investment fraction:\n", "\tinvestment_fraction[0]\t=\t0.174 %\n", "\tinvestment_fraction[1]\t=\t0.0 %\n", "\tinvestment_fraction[2]\t=\t0.0 %\n", "\tinvestment_fraction[3]\t=\t99.826 %\n", "\n", "predicted research strength:\n", "\tfuture_research_strength[0]\t=\t20014.8\t(now:\t20000)\n", "\tfuture_research_strength[1]\t=\t5000.0\t(now:\t5000)\n", "\tfuture_research_strength[2]\t=\t2000.0\t(now:\t2000)\n", "\n", "predicted vote in the Grand Council:\n", "\tFor: 24 \n", "\tAgainst: 36\n", "\n", "objectives:\n", "\ty[0]\t=\t-14.7668\n", "\ty[1]\t=\t0.98601\n", "\ty[2]\t=\t36\n", "\n", "Combined cost measure w[0]y[0] + w[1]y[1] + ... = 45.66455\n" ] } ], "source": [ "# try out three different random linear combinations\n", "#\n", "import random\n", "precision_x = 3.0e-07 # local optimizer settings\n", "global_sampling = 64 # global optimizer settings\n", "\n", "for i in range(3):\n", " print(\"\\n==\\nCompromise attempt no. i =\", i, end = \"\\n\\n\")\n", " linear_combination_optimizer_global(random_weights(), precision_x, global_sampling, True)" ] }, { "cell_type": "code", "execution_count": 5, "id": "e244cb4a", "metadata": {}, "outputs": [], "source": [ "# validate that a candidate point on the Pareto front really isn't dominated\n", "# if this happens, it is indicative of numerical inaccuracy of the optimizer\n", "#\n", "def pareto_optimal(obj_space_point, pareto_front):\n", " for k in range(len(pareto_front[0])):\n", " dominated = True\n", " for i in range(n):\n", " if obj_space_point[i] < pareto_front[i][k]:\n", " dominated = False\n", " if dominated:\n", " # print(\"*** domination of obj_space_point =\", obj_space_point,\\\n", " # \" by \", [pareto_optimal_compromises[i][k] for i in range(n)], \" ***\")\n", " print(\"*** numerical artefact: point dominated ***\")\n", " return False # obj_space_point is dominated by another, hence not Pareto optimal\n", " return True # no known point on the Pareto front dominates obj_space_point -> validation successful\n", "\n", "# checks whether a new point dominates any pre-existing point on the Pareto front\n", "# if this happens, it is indicative of numerical inaccuracy of the optimizer\n", "#\n", "# in that event, the old point gets overwritten\n", "#\n", "def replace_dominated(obj_space_point, par_space_point, pareto_front, pareto_optimal_parameters):\n", " for k in range(len(pareto_front[0])):\n", " dominating = True\n", " for i in range(n):\n", " if obj_space_point[i] > pareto_front[i][k]:\n", " dominating = False\n", " if dominating:\n", " print(\"*** numerical artefact: new point dominates a pre-existing point ***\")\n", " for i in range(m):\n", " pareto_optimal_parameters[i][k] = par_space_point[i]\n", " for i in range(n):\n", " pareto_front[i][k] = obj_space_point[i]\n", " return True\n", " return False" ] }, { "cell_type": "code", "execution_count": 6, "id": "f183efd7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Linear combinations:\n", "======\n", "\n", "0.68\t0.12\t0.2\t\t\t-7280.88309\t0.993\t24.0\t\n", "0.99978\t0.0\t0.00017\t\t\t-9383.51245\t0.993\t48\t\n", "0.0\t0.00034\t0.0\t\t\t-1.46369\t0.986\t36\t\n", "0.04\t0.12\t0.2\t\t\t-1435.58421\t0.98852\t12.0\t\n", "0.0028\t0.00567\t0.0\t\t\t-47.86348\t0.98606\t36\t\n", "0.04\t0.12\t0.2\t\t\t-1435.5819\t0.98852\t12\t\n", "0.00495\t0.0\t0.0\t\t\t-42.01969\t0.98603\t36\t\n", "0.99998\t2e-05\t0.0\t\t\t-9385.18592\t0.993\t48\t\n", "0.0\t0.12\t0.2\t\t\t-1094.74701\t0.98824\t12\t\n", "*** numerical artefact: point dominated ***\n", "0.0\t0.12\t0.2\t\t\t-1094.73392\t0.98824\t12.0\t\n", "0.04\t0.12\t0.2\t\t\t-1435.58239\t0.98852\t12\t\n", "0.99997\t0.0\t3e-05\t\t\t-9385.0167\t0.993\t48\t\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "0.0\t0.12\t0.2\t\t\t-1094.73445\t0.98824\t12\t\n", "*** numerical artefact: point dominated ***\n", "0.68\t0.12\t0.2\t\t\t-7280.88381\t0.993\t24.0\t\n", "0.0029\t7e-05\t0.0\t\t\t-24.89955\t0.98602\t36\t\n", "0.6397\t0.0\t0.0\t\t\t-5796.36338\t0.99048\t35.19926\t\n", "1e-05\t0.0\t0.00064\t\t\t-1.75997\t0.986\t36\t\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "1.0\t0.0\t0.0\t\t\t-9385.27532\t0.993\t48\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73431\t0.98824\t12\t\n", "0.0\t0.0007\t0.0\t\t\t-2.9906\t0.986\t36\t\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "0.00216\t0.0\t0.0\t\t\t-18.34989\t0.98602\t36\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "0.88\t0.12\t0.0\t\t\t-8686.08259\t0.993\t39\t\n", "0.00312\t0.0\t0.0\t\t\t-26.46421\t0.98602\t36\t\n", "0.04\t0.12\t0.2\t\t\t-1435.58256\t0.98852\t12\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73498\t0.98824\t12\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73558\t0.98824\t12.0\t\n", "0.0\t0.0\t0.00147\t\t\t-3.94184\t0.98601\t36\t\n", "0.04\t0.12\t0.2\t\t\t-1435.5775\t0.98852\t12\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "*** numerical artefact: point dominated ***\n", "0.68\t0.12\t0.2\t\t\t-7280.88321\t0.993\t24\t\n", "*** numerical artefact: point dominated ***\n", "0.0\t0.12\t0.2\t\t\t-1094.73466\t0.98824\t12\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73455\t0.98824\t12\t\n", "0.03999\t0.12\t0.2\t\t\t-1435.47666\t0.98852\t12\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73553\t0.98824\t12\t\n", "0.68\t0.12\t0.2\t\t\t-7280.88383\t0.993\t24.0\t\n", "*** numerical artefact: point dominated ***\n", "0.99938\t0.0\t0.0\t\t\t-9378.94555\t0.993\t48\t\n", "7e-05\t0.00019\t0.0\t\t\t-1.39346\t0.986\t36\t\n", "0.68\t0.12\t0.2\t\t\t-7280.88365\t0.993\t24.0\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73325\t0.98824\t12.0\t\n", "0.0\t0.00099\t0.0\t\t\t-4.20481\t0.98601\t36\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "0.0015\t0.0\t0.0\t\t\t-12.69839\t0.98601\t36\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "0.00512\t0.0\t6e-05\t\t\t-43.61122\t0.98604\t36\t\n", "0.0\t0.12\t0.2\t\t\t-1094.7297\t0.98824\t12.00016\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "0.00318\t0.0\t0.0\t\t\t-26.97145\t0.98602\t36\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73494\t0.98824\t12\t\n", "0.0\t1e-05\t0.0\t\t\t-0.04931\t0.986\t36\t\n", "*** numerical artefact: point dominated ***\n", "0.00301\t0.00164\t0.0\t\t\t-32.54276\t0.98603\t36\t\n", "0.04\t0.12\t0.2\t\t\t-1435.55366\t0.98852\t12\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "*** numerical artefact: point dominated ***\n", "0.68\t0.12\t0.2\t\t\t-7280.88338\t0.993\t24\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "0.0\t0.00083\t0.0\t\t\t-3.53822\t0.98601\t36\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "0.99922\t0.0\t1e-05\t\t\t-9377.29425\t0.99299\t48\t\n", "*** numerical artefact: point dominated ***\n", "0.0\t0.12\t0.2\t\t\t-1094.73773\t0.98824\t12\t\n", "0.68\t0.12\t0.2\t\t\t-7280.885\t0.993\t24.00001\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "0.0\t0.12\t0.2\t\t\t-1094.73664\t0.98824\t12\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "0.99955\t0.0\t0.0\t\t\t-9380.65412\t0.993\t48\t\n", "0.99942\t0.0\t0.0\t\t\t-9379.27169\t0.993\t48\t\n", "*** numerical artefact: point dominated ***\n", "0.99967\t0.0\t0.00025\t\t\t-9382.57762\t0.993\t48\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "0.88\t0.12\t0.0\t\t\t-8686.08272\t0.993\t39\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "0.00106\t0.0\t0.0\t\t\t-8.98526\t0.98601\t36\t\n", "0.04\t0.12\t0.2\t\t\t-1435.58314\t0.98852\t12\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "0.0\t0.12\t0.2\t\t\t-1094.7421\t0.98824\t12\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "*** numerical artefact: point dominated ***\n", "0.0\t0.12\t0.2\t\t\t-1094.73924\t0.98824\t12\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "0.68\t0.12\t0.2\t\t\t-7280.8838\t0.993\t24.0\t\n", "*** numerical artefact: point dominated ***\n", "0.99965\t0.0\t0.0\t\t\t-9381.70645\t0.993\t48\t\n", "0.04\t0.12\t0.2\t\t\t-1435.58168\t0.98852\t12\t\n", "0.99948\t0.0\t0.0\t\t\t-9379.92322\t0.993\t48\t\n", "0.68\t0.12\t0.2\t\t\t-7280.88248\t0.993\t24.0\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "1e-05\t0.0\t2e-05\t\t\t-0.13682\t0.986\t36\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "0.0\t0.12\t0.2\t\t\t-1094.73383\t0.98824\t12.0\t\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "*** numerical artefact: point dominated ***\n", "0.0\t0.0\t0.0\t\t\t-0.02976\t0.986\t36\t\n", "0.00222\t0.0\t0.00038\t\t\t-19.89579\t0.98602\t36\t\n", "0.99999\t0.0\t0.0\t\t\t-9385.17432\t0.993\t48\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "0.00193\t2e-05\t0.0\t\t\t-16.4473\t0.98601\t36\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "0.04\t0.12\t0.2\t\t\t-1435.58373\t0.98852\t12\t\n", "0.04\t0.12\t0.2\t\t\t-1435.58337\t0.98852\t12\t\n", "*** numerical artefact: point dominated ***\n", "0.68\t0.12\t0.2\t\t\t-7280.88385\t0.993\t24.0\t\n", "*** numerical artefact: point dominated ***\n", "0.0\t0.00024\t0.0\t\t\t-1.0214\t0.986\t36\t\n", "*** numerical artefact: point dominated ***\n", "0.9998\t0.0\t0.00011\t\t\t-9383.49152\t0.993\t48\t\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "0.0\t0.12\t0.2\t\t\t-1094.73338\t0.98824\t12.00001\t\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "0.68\t0.12\t0.2\t\t\t-7280.88429\t0.993\t24.0\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "0.0094\t0.0\t0.0\t\t\t-79.81963\t0.98607\t36\t\n", "0.04\t0.12\t0.2\t\t\t-1435.58033\t0.98852\t12\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "1e-05\t0.0\t0.0\t\t\t-0.10724\t0.986\t36\t\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "0.0\t0.12\t0.2\t\t\t-1094.73516\t0.98824\t12.0\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "0.0\t0.12\t0.2\t\t\t-1094.7689\t0.98824\t12\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73531\t0.98824\t12\t\n", "0.68\t0.12\t0.2\t\t\t-7280.88385\t0.993\t24.0\t\n", "1.0\t0.0\t0.0\t\t\t-9385.27291\t0.993\t48\t\n", "*** numerical artefact: point dominated ***\n", "0.04\t0.12\t0.2\t\t\t-1435.57776\t0.98852\t12.0\t\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "0.0\t0.0\t0.0\t\t\t-0.00226\t0.986\t36\t\n", "*** numerical artefact: point dominated ***\n", "0.99975\t0.0\t1e-05\t\t\t-9382.68602\t0.993\t48\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "0.003\t0.00473\t0.0\t\t\t-45.56283\t0.98605\t36\t\n", "*** numerical artefact: point dominated ***\n", "0.99996\t0.0\t0.0\t\t\t-9384.8677\t0.993\t48\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "0.0\t0.0\t9e-05\t\t\t-0.23291\t0.986\t36\t\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "*** numerical artefact: point dominated ***\n", "0.99995\t0.0\t0.0\t\t\t-9384.76739\t0.993\t48\t\n", "*** numerical artefact: point dominated ***\n", "0.0\t0.12\t0.2\t\t\t-1094.73249\t0.98824\t12.00003\t\n", "0.68\t0.12\t0.2\t\t\t-7280.88541\t0.993\t24.00001\t\n", "0.00019\t0.12\t0.2\t\t\t-1096.33036\t0.98824\t12\t\n", "1e-05\t0.0\t5e-05\t\t\t-0.22532\t0.986\t36\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "0.0\t0.12\t0.2\t\t\t-1094.73474\t0.98824\t12.00003\t\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: new point dominates a pre-existing point ***\n", "*** numerical artefact: point dominated ***\n", "*** numerical artefact: point dominated ***\n", "0.0\t1e-05\t0.0\t\t\t-0.04608\t0.986\t36\t\n", "\n", "\n", "Hyperboxing:\n", "======\n", "\n", "0.6399\t\t0.12\t\t0.0927\t\t\t-6577.2723\t\t0.992\t\t28.6488\t\t\n", "0.0163\t\t0.1436\t\t0.2001\t\t\t-1338.993\t\t0.9885\t\t12\t\t\n", "0.2749\t\t0.1159\t\t0.0\t\t\t-2904.3557\t\t0.9887\t\t29.1508\t\t\n", "0.3231\t\t0.12\t\t0.2\t\t\t-3930.6191\t\t0.9905\t\t23.2078\t\t\n", "0.6422\t\t0.12\t\t0.1216\t\t\t-6681.9085\t\t0.9922\t\t27.4858\t\t\n", "0.2716\t\t0.1191\t\t0.0003\t\t\t-2890.3264\t\t0.9887\t\t28.4353\t\t\n", "0.6796\t\t0.0\t\t0.0\t\t\t-6182.391\t\t0.9908\t\t36.7845\t\t\n", "0.2309\t\t0.12\t\t0.2\t\t\t-3102.019\t\t0.9899\t\t19.6365\t\t\n", "0.1931\t\t0.12\t\t0.0775\t\t\t-2407.216\t\t0.9887\t\t23.4375\t\t\n", "0.0616\t\t0.12\t\t0.2\t\t\t-1620.4836\t\t0.9887\t\t12.8623\t\t\n", "0.0074\t\t0.1294\t\t0.2124\t\t\t-1237.1819\t\t0.9884\t\t12\t\t\n", "0.1882\t\t0.1145\t\t0.0\t\t\t-2126.6109\t\t0.9881\t\t28.2375\t\t\n", "0.3517\t\t0.0009\t\t0.0\t\t\t-3099.2337\t\t0.9885\t\t34.8117\t\t\n", "0.3243\t\t0.0003\t\t0.0367\t\t\t-2947.2218\t\t0.9885\t\t34.4981\t\t\n", "0.6516\t\t0.0004\t\t0.0\t\t\t-5912.9576\t\t0.9906\t\t35.6796\t\t\n", "0.0734\t\t0.12\t\t0.0\t\t\t-1149.468\t\t0.9874\t\t27.0038\t\t\n", "0.4605\t\t0.12\t\t0.19\t\t\t-5162.8563\t\t0.9914\t\t23.9825\t\t\n", "0.771\t\t0.0\t\t0.0\t\t\t-7076.9941\t\t0.9914\t\t40.4395\t\t\n", "0.1751\t\t0.12\t\t0.2\t\t\t-2607.6814\t\t0.9895\t\t17.4021\t\t\n", "0.642\t\t0.12\t\t0.1079\t\t\t-6640.8791\t\t0.9921\t\t28.0704\t\t\n", "0.3715\t\t0.0\t\t0.0\t\t\t-3276.3053\t\t0.9886\t\t34.5289\t\t\n", "0.345\t\t0.0007\t\t0.0\t\t\t-3037.1475\t\t0.9884\t\t35.0632\t\t\n", "0.3779\t\t0.12\t\t0.1146\t\t\t-4176.3264\t\t0.9903\t\t27.0461\t\t\n", "0.2783\t\t0.12\t\t0.2\t\t\t-3525.7834\t\t0.9902\t\t21.5315\t\t\n", "0.5707\t\t0.12\t\t0.2\t\t\t-6230.79\t\t0.9922\t\t23.8268\t\t\n", "0.2459\t\t0.12\t\t0.2\t\t\t-3236.0305\t\t0.99\t\t20.2376\t\t\n", "0.4894\t\t0.12\t\t0.2\t\t\t-5462.8893\t\t0.9917\t\t23.6235\t\t\n", "0.5404\t\t0.0\t\t0.0001\t\t\t-4848.0668\t\t0.9898\t\t34.9535\t\t\n", "0.2648\t\t0.12\t\t0.1911\t\t\t-3377.7919\t\t0.99\t\t21.3798\t\t\n", "0.1598\t\t0.12\t\t0.1712\t\t\t-2387.2532\t\t0.9892\t\t18.0406\t\t\n", "0.1387\t\t0.12\t\t0.2\t\t\t-2289.1016\t\t0.9892\t\t15.9487\t\t\n", "0.3248\t\t0.12\t\t0.1543\t\t\t-3808.3683\t\t0.9902\t\t25.1931\t\t\n", "0.4014\t\t0.0002\t\t0.0745\t\t\t-3756.6277\t\t0.9893\t\t33.0524\t\t\n", "0.1383\t\t0.12\t\t0.2\t\t\t-2285.5437\t\t0.9892\t\t15.9324\t\t\n", "0.276\t\t0.12\t\t0.2\t\t\t-3505.2201\t\t0.9902\t\t21.44\t\t\n", "0.0\t\t0.0\t\t0.168\t\t\t-476.1295\t\t0.9872\t\t23.6685\t\t\n", "0.0989\t\t0.12\t\t0.0691\t\t\t-1559.793\t\t0.988\t\t22.9052\t\t\n", "0.3923\t\t0.0001\t\t0.0\t\t\t-3467.7348\t\t0.9887\t\t34.585\t\t\n", "0.0066\t\t0.1353\t\t0.2017\t\t\t-1224.5487\t\t0.9884\t\t12\t\t\n", "0.5086\t\t0.0\t\t0.0001\t\t\t-4548.4627\t\t0.9896\t\t34.8764\t\t\n", "0.9891\t\t0.0047\t\t0.0\t\t\t-9292.8905\t\t0.993\t\t48\t\t\n", "0.2831\t\t0.0\t\t0.0\t\t\t-2473.9246\t\t0.988\t\t36\t\t\n", "0.4605\t\t0.0\t\t0.0005\t\t\t-4099.9159\t\t0.9892\t\t34.7698\t\t\n", "0.6042\t\t0.1096\t\t0.0\t\t\t-5931.0235\t\t0.991\t\t32.8389\t\t\n", "0.3461\t\t0.12\t\t0.1527\t\t\t-3997.1639\t\t0.9903\t\t25.3169\t\t\n", "0.2164\t\t0.116\t\t0.0002\t\t\t-2382.8898\t\t0.9883\t\t27.8956\t\t\n", "0.1416\t\t0.12\t\t0.1434\t\t\t-2144.6625\t\t0.9888\t\t18.5159\t\t\n", "0.5883\t\t0.0\t\t0.0001\t\t\t-5303.2822\t\t0.9901\t\t35.0743\t\t\n", "0.1214\t\t0.12\t\t0.0805\t\t\t-1787.1837\t\t0.9883\t\t21.9564\t\t\n", "0.0001\t\t0.12\t\t0.1818\t\t\t-1040.1355\t\t0.9881\t\t13.5152\t\t\n", "0.8942\t\t0.0026\t\t0.0229\t\t\t-8380.5748\t\t0.9924\t\t46.1459\t\t\n", "0.3466\t\t0.0\t\t0.0\t\t\t-3049.4906\t\t0.9884\t\t35.001\t\t\n", "0.5391\t\t0.0\t\t0.0\t\t\t-4835.5148\t\t0.9898\t\t34.9476\t\t\n", "0.7604\t\t0.12\t\t0.0591\t\t\t-7656.6154\t\t0.9926\t\t34.9231\t\t\n", "0.2071\t\t0.1203\t\t0.0643\t\t\t-2495.3615\t\t0.9887\t\t24.5777\t\t\n", "0.5377\t\t0.12\t\t0.1567\t\t\t-5787.4504\t\t0.9917\t\t25.6204\t\t\n", "0.1866\t\t0.12\t\t0.2\t\t\t-2708.9909\t\t0.9895\t\t17.862\t\t\n", "0.1163\t\t0.12\t\t0.2\t\t\t-2093.8584\t\t0.9891\t\t15.0525\t\t\n", "0.8119\t\t0.12\t\t0.0571\t\t\t-8160.6518\t\t0.9929\t\t35.9072\t\t\n", "0.9259\t\t0.0001\t\t0.0\t\t\t-8628.3095\t\t0.9925\t\t46.6382\t\t\n", "0.0813\t\t0.12\t\t0.0229\t\t\t-1280.2382\t\t0.9876\t\t26.7562\t\t\n", "0.3035\t\t0.1201\t\t0.0945\t\t\t-3442.2326\t\t0.9896\t\t27.1171\t\t\n", "0.0359\t\t0.0\t\t0.0003\t\t\t-306.7707\t\t0.9863\t\t36\t\t\n", "0.1545\t\t0.12\t\t0.0748\t\t\t-2060.2791\t\t0.9884\t\t22.4309\t\t\n", "0.8045\t\t0.0\t\t0.0\t\t\t-7409.1414\t\t0.9916\t\t41.781\t\t\n", "0.6999\t\t0.0\t\t0.052\t\t\t-6521.8973\t\t0.9913\t\t37.0126\t\t\n", "0.5464\t\t0.0\t\t0.0652\t\t\t-5083.7\t\t0.9903\t\t33.8087\t\t\n", "0.6384\t\t0.0\t\t0.0\t\t\t-5784.2605\t\t0.9905\t\t35.1961\t\t\n", "0.5354\t\t0.12\t\t0.2\t\t\t-5895.7258\t\t0.992\t\t23.7385\t\t\n", "0.6489\t\t0.0007\t\t0.0\t\t\t-5888.1373\t\t0.9905\t\t35.5853\t\t\n", "0.6689\t\t0.0001\t\t0.0\t\t\t-6078.3517\t\t0.9907\t\t36.3566\t\t\n", "0.4329\t\t0.12\t\t0.2\t\t\t-4936.6035\t\t0.9913\t\t23.4822\t\t\n", "0.5725\t\t0.0\t\t0.0544\t\t\t-5301.1864\t\t0.9904\t\t34.3404\t\t\n", "0.4924\t\t0.0\t\t0.0\t\t\t-4395.9339\t\t0.9894\t\t34.8309\t\t\n", "0.2277\t\t0.0\t\t0.0\t\t\t-1978.5546\t\t0.9876\t\t36\t\t\n", "0.2606\t\t0.12\t\t0.1962\t\t\t-3355.8492\t\t0.99\t\t20.9899\t\t\n", "0.2627\t\t0.0\t\t0.0\t\t\t-2291.6785\t\t0.9878\t\t36\t\t\n", "0.3178\t\t0.12\t\t0.2\t\t\t-3882.625\t\t0.9905\t\t23.1136\t\t\n", "0.5\t\t0.0\t\t0.0\t\t\t-4467.5737\t\t0.9895\t\t34.8501\t\t\n", "0.2845\t\t0.0\t\t0.0\t\t\t-2487.0268\t\t0.988\t\t36\t\t\n", "0.1027\t\t0.0\t\t0.0224\t\t\t-941.3528\t\t0.9869\t\t35.7991\t\t\n", "0.1126\t\t0.0003\t\t0.0528\t\t\t-1112.1021\t\t0.9872\t\t33.2667\t\t\n", "0.0221\t\t0.0057\t\t0.0\t\t\t-211.905\t\t0.9862\t\t36\t\t\n", "0.7175\t\t0.0001\t\t0.0\t\t\t-6551.9568\t\t0.991\t\t38.303\t\t\n", "0.6398\t\t0.0\t\t0.0\t\t\t-5797.2606\t\t0.9905\t\t35.1995\t\t\n", "0.4932\t\t0.0\t\t0.0001\t\t\t-4404.0101\t\t0.9895\t\t34.838\t\t\n", "0.1701\t\t0.12\t\t0.06\t\t\t-2155.5254\t\t0.9885\t\t23.6667\t\t\n", "0.6684\t\t0.0\t\t0.0\t\t\t-6073.641\t\t0.9907\t\t36.3364\t\t\n", "0.3642\t\t0.12\t\t0.2\t\t\t-4304.4556\t\t0.9908\t\t23.3105\t\t\n", "0.6087\t\t0.0\t\t0.0\t\t\t-5498.1521\t\t0.9903\t\t35.1219\t\t\n", "0.577\t\t0.0\t\t0.0744\t\t\t-5399.9551\t\t0.9906\t\t33.485\t\t\n", "0.4398\t\t0.0\t\t0.0\t\t\t-3906.0257\t\t0.9891\t\t34.6995\t\t\n", "0.7187\t\t0.12\t\t0.1088\t\t\t-7387.4662\t\t0.9926\t\t31.1003\t\t\n", "0.8537\t\t0.0\t\t0.0\t\t\t-7900.2558\t\t0.992\t\t43.7501\t\t\n", "0.1589\t\t0.0005\t\t0.0\t\t\t-1373.3619\t\t0.9871\t\t36\t\t\n", "0.5933\t\t0.12\t\t0.1903\t\t\t-6416.7379\t\t0.9923\t\t24.304\t\t\n", "0.322\t\t0.0\t\t0.0\t\t\t-2825.2968\t\t0.9883\t\t35.9262\t\t\n", "0.7803\t\t0.0\t\t0.0002\t\t\t-7169.1721\t\t0.9915\t\t40.8191\t\t\n", "0.2789\t\t0.12\t\t0.2\t\t\t-3531.3249\t\t0.9902\t\t21.5562\t\t\n", "0.4586\t\t0.0\t\t0.0\t\t\t-4080.3054\t\t0.9892\t\t34.7468\t\t\n", "0.1522\t\t0.0\t\t0.0615\t\t\t-1480.957\t\t0.9875\t\t32.5455\t\t\n", "0.2337\t\t0.0001\t\t0.0\t\t\t-2032.9701\t\t0.9876\t\t36\t\t\n", "0.129\t\t0.0017\t\t0.0\t\t\t-1116.836\t\t0.9869\t\t36\t\t\n", "0.265\t\t0.12\t\t0.2\t\t\t-3406.4791\t\t0.9901\t\t20.9998\t\t\n", "0.841\t\t0.0\t\t0.0595\t\t\t-7935.3026\t\t0.9923\t\t42.3257\t\t\n", "0.669\t\t0.0\t\t0.0002\t\t\t-6080.1893\t\t0.9907\t\t36.3687\t\t\n", "0.0084\t\t0.1351\t\t0.2117\t\t\t-1269.3187\t\t0.9885\t\t12\t\t\n", "*** numerical artefact: point dominated ***\n", "0.6616\t\t0.0\t\t0.0\t\t\t-6007.614\t\t0.9906\t\t36.0632\t\t\n", "0.8508\t\t0.0\t\t0.0004\t\t\t-7872.2587\t\t0.992\t\t43.6499\t\t\n", "0.1039\t\t0.12\t\t0.2\t\t\t-1985.9843\t\t0.989\t\t14.5556\t\t\n", "0.9757\t\t0.0006\t\t0.0\t\t\t-9137.8207\t\t0.9928\t\t48\t\t\n", "0.1699\t\t0.0003\t\t0.0\t\t\t-1468.8354\t\t0.9872\t\t36\t\t\n", "0.682\t\t0.0001\t\t0.0\t\t\t-6206.2954\t\t0.9908\t\t36.8845\t\t\n", "0.2609\t\t0.12\t\t0.2\t\t\t-3369.4464\t\t0.9901\t\t20.8344\t\t\n", "0.2145\t\t0.0\t\t0.0001\t\t\t-1861.9818\t\t0.9875\t\t36\t\t\n", "0.5943\t\t0.0\t\t0.0\t\t\t-5361.056\t\t0.9902\t\t35.0859\t\t\n", "0.2959\t\t0.0\t\t0.0\t\t\t-2589.245\t\t0.9881\t\t36\t\t\n", "0.5393\t\t0.0\t\t0.0\t\t\t-4838.0199\t\t0.9898\t\t34.9483\t\t\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "0.7705\t\t0.12\t\t0.1094\t\t\t-7898.316\t\t0.993\t\t31.5527\t\t\n", "0.2142\t\t0.12\t\t0.2\t\t\t-2953.7992\t\t0.9897\t\t18.969\t\t\n", "0.0\t\t0.1156\t\t0.0002\t\t\t-503.2525\t\t0.9868\t\t27.9789\t\t\n", "0.0037\t\t0.0\t\t0.0743\t\t\t-235.5765\t\t0.9865\t\t31.4756\t\t\n", "0.4382\t\t0.12\t\t0.1174\t\t\t-4740.2681\t\t0.9907\t\t27.0727\t\t\n", "0.783\t\t0.0\t\t0.0\t\t\t-7195.9418\t\t0.9915\t\t40.9208\t\t\n", "0.1539\t\t0.12\t\t0.2\t\t\t-2421.6454\t\t0.9893\t\t16.5547\t\t\n" ] } ], "source": [ "# compute the Pareto front\n", "#\n", "import math\n", "import random\n", "import numpy as np\n", "\n", "m = 3 # number of parameters\n", "n = 3 # number of objectives\n", "\n", "num_linear_points = 100 # points on Pareto front to be determined from linear combinations\n", "num_hyper_points = 125 # points on Pareto front to be determined by hyperboxing\n", "\n", "precision_x = 3.0e-07 # local optimizer settings\n", "global_sampling = 64 # global optimizer settings\n", "\n", "# contains Pareto optimal parameterizations, in parameter space\n", "# \n", "pareto_optimal_parameters = [[] for i in range(m)]\n", "\n", "# contains the points on the Pareto front, in objective space\n", "# \n", "pareto_optimal_compromises = [[] for i in range(n)]\n", "\n", "# size of the relevant range in objective space\n", "#\n", "objective_space_lower = [math.inf for i in range(n)]\n", "objective_space_upper = [-math.inf for i in range(n)]\n", "\n", "# now we determine Pareto optimal solutions from a sequence of linear combinations for the two criteria\n", "#\n", "print(\"Linear combinations:\\n======\\n\")\n", "for j in range(num_linear_points):\n", " iteration_complete = False\n", " while not iteration_complete:\n", " optimum = linear_combination_optimizer_global(random_weights(),\\\n", " precision_x, global_sampling, False)\n", " cost_measures = cost_function(optimum, False)\n", " if pareto_optimal(cost_measures, pareto_optimal_compromises):\n", " if not replace_dominated(cost_measures, optimum,\\\n", " pareto_optimal_compromises, pareto_optimal_parameters):\n", " for i in range(m):\n", " pareto_optimal_parameters[i].append(optimum[i])\n", " print(round(optimum[i], 5), end=\"\\t\")\n", " print(\"\\t\\t\", end=\"\")\n", " for i in range(n):\n", " if cost_measures[i] < objective_space_lower[i]:\n", " objective_space_lower[i] = cost_measures[i]\n", " if cost_measures[i] > objective_space_upper[i]:\n", " objective_space_upper[i] = cost_measures[i]\n", " pareto_optimal_compromises[i].append(cost_measures[i])\n", " print(round(cost_measures[i], 5), end=\"\\t\")\n", " iteration_complete = True\n", " print()\n", "\n", "print(\"\\n\\nHyperboxing:\\n======\\n\")\n", "for j in range(num_hyper_points):\n", " iteration_complete = False\n", " while not iteration_complete:\n", " random_offsets = [random.uniform(objective_space_lower[i], \\\n", " objective_space_upper[i]) for i in range(n)]\n", " optimum = hyperboxing_optimizer_global(random_weights(),\\\n", " random_offsets, precision_x, global_sampling)\n", " cost_measures = cost_function(optimum, False)\n", " if pareto_optimal(cost_measures, pareto_optimal_compromises):\n", " if not replace_dominated(cost_measures, optimum,\\\n", " pareto_optimal_compromises, pareto_optimal_parameters):\n", " for i in range(m):\n", " pareto_optimal_parameters[i].append(optimum[i])\n", " print(round(optimum[i], 4), end=\"\\t\\t\")\n", " print(\"\\t\", end=\"\")\n", " for i in range(n):\n", " if cost_measures[i] < objective_space_lower[i]:\n", " objective_space_lower[i] = cost_measures[i]\n", " if cost_measures[i] > objective_space_upper[i]:\n", " objective_space_upper[i] = cost_measures[i]\n", " pareto_optimal_compromises[i].append(cost_measures[i])\n", " print(round(cost_measures[i], 4), end=\"\\t\\t\")\n", " iteration_complete = True\n", " print()\n" ] }, { "cell_type": "code", "execution_count": 7, "id": "ff11eeba", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "Computed Pareto front:\n", "======\n", "\n", "0.68\t0.12\t0.2\t\t\t-7280.88359\t0.993\t24\t\n", "0.99994\t0.0\t0.0\t\t\t-9384.6522\t0.993\t48\t\n", "0.00027\t0.0\t0.0\t\t\t-2.29493\t0.986\t36\t\n", "0.04\t0.12\t0.2\t\t\t-1435.58421\t0.98852\t12.0\t\n", "0.00821\t0.0\t0.0\t\t\t-69.68761\t0.98606\t36\t\n", "0.04\t0.12\t0.2\t\t\t-1435.5819\t0.98852\t12\t\n", "0.00495\t0.0\t0.0\t\t\t-42.01969\t0.98603\t36\t\n", "1.0\t0.0\t0.0\t\t\t-9385.25194\t0.993\t48\t\n", "0.0\t0.12\t0.2\t\t\t-1094.74701\t0.98824\t12\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73392\t0.98824\t12.0\t\n", "0.04\t0.12\t0.2\t\t\t-1435.58302\t0.98852\t12\t\n", "1.0\t0.0\t0.0\t\t\t-9385.24766\t0.993\t48\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73485\t0.98824\t12\t\n", "0.68\t0.12\t0.2\t\t\t-7280.88381\t0.993\t24.0\t\n", "0.0029\t7e-05\t0.0\t\t\t-24.89955\t0.98602\t36\t\n", "0.6397\t0.0\t0.0\t\t\t-5796.36338\t0.99048\t35.19926\t\n", "0.00043\t0.0\t0.0\t\t\t-3.63891\t0.986\t36\t\n", "1.0\t0.0\t0.0\t\t\t-9385.27532\t0.993\t48\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73431\t0.98824\t12\t\n", "0.0005\t0.0\t0.0\t\t\t-4.22575\t0.986\t36\t\n", "0.00216\t0.0\t0.0\t\t\t-18.34989\t0.98602\t36\t\n", "0.88\t0.12\t0.0\t\t\t-8686.08259\t0.993\t39\t\n", "0.00312\t0.0\t0.0\t\t\t-26.46421\t0.98602\t36\t\n", "0.04\t0.12\t0.2\t\t\t-1435.58262\t0.98852\t12\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73516\t0.98824\t12\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73558\t0.98824\t12.0\t\n", "0.00107\t0.0\t0.0\t\t\t-9.05152\t0.98601\t36\t\n", "0.04\t0.12\t0.2\t\t\t-1435.5775\t0.98852\t12\t\n", "0.68\t0.12\t0.2\t\t\t-7280.88321\t0.993\t24\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73485\t0.98824\t12\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73455\t0.98824\t12\t\n", "0.03999\t0.12\t0.2\t\t\t-1435.47666\t0.98852\t12\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73583\t0.98824\t12\t\n", "0.68\t0.12\t0.2\t\t\t-7280.88383\t0.993\t24.0\t\n", "0.99938\t0.0\t0.0\t\t\t-9378.94555\t0.993\t48\t\n", "7e-05\t0.00019\t0.0\t\t\t-1.39346\t0.986\t36\t\n", "0.68\t0.12\t0.2\t\t\t-7280.88365\t0.993\t24.0\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73325\t0.98824\t12.0\t\n", "0.00065\t0.0\t0.0\t\t\t-5.5104\t0.986\t36\t\n", "0.0015\t0.0\t0.0\t\t\t-12.69839\t0.98601\t36\t\n", "0.00512\t0.0\t6e-05\t\t\t-43.61122\t0.98604\t36\t\n", "0.0\t0.12\t0.2\t\t\t-1094.7297\t0.98824\t12.00016\t\n", "0.00318\t0.0\t0.0\t\t\t-26.97145\t0.98602\t36\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73497\t0.98824\t12\t\n", "0.0\t1e-05\t0.0\t\t\t-0.04931\t0.986\t36\t\n", "0.00301\t0.00164\t0.0\t\t\t-32.54276\t0.98603\t36\t\n", "0.04\t0.12\t0.2\t\t\t-1435.55366\t0.98852\t12\t\n", "0.68\t0.12\t0.2\t\t\t-7280.88338\t0.993\t24\t\n", "0.0\t0.00083\t0.0\t\t\t-3.53822\t0.98601\t36\t\n", "0.99922\t0.0\t1e-05\t\t\t-9377.29425\t0.99299\t48\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73999\t0.98824\t12\t\n", "0.68\t0.12\t0.2\t\t\t-7280.885\t0.993\t24.00001\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73664\t0.98824\t12\t\n", "0.99955\t0.0\t0.0\t\t\t-9380.65412\t0.993\t48\t\n", "0.99942\t0.0\t0.0\t\t\t-9379.27169\t0.993\t48\t\n", "0.99979\t0.0\t0.0\t\t\t-9383.12112\t0.993\t48\t\n", "0.88\t0.12\t0.0\t\t\t-8686.08272\t0.993\t39\t\n", "0.00106\t0.0\t0.0\t\t\t-8.98526\t0.98601\t36\t\n", "0.04\t0.12\t0.2\t\t\t-1435.58381\t0.98852\t12\t\n", "0.0\t0.12\t0.2\t\t\t-1094.7421\t0.98824\t12\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73924\t0.98824\t12\t\n", "0.68\t0.12\t0.2\t\t\t-7280.8838\t0.993\t24.0\t\n", "0.99965\t0.0\t0.0\t\t\t-9381.70645\t0.993\t48\t\n", "0.04\t0.12\t0.2\t\t\t-1435.58168\t0.98852\t12\t\n", "0.99948\t0.0\t0.0\t\t\t-9379.92322\t0.993\t48\t\n", "0.68\t0.12\t0.2\t\t\t-7280.88248\t0.993\t24.0\t\n", "1e-05\t0.0\t2e-05\t\t\t-0.13682\t0.986\t36\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73383\t0.98824\t12.0\t\n", "0.0\t0.0\t0.0\t\t\t-0.02976\t0.986\t36\t\n", "0.00222\t0.0\t0.00038\t\t\t-19.89579\t0.98602\t36\t\n", "0.99999\t0.0\t0.0\t\t\t-9385.17432\t0.993\t48\t\n", "0.00193\t2e-05\t0.0\t\t\t-16.4473\t0.98601\t36\t\n", "0.04\t0.12\t0.2\t\t\t-1435.58373\t0.98852\t12\t\n", "0.04\t0.12\t0.2\t\t\t-1435.58349\t0.98852\t12\t\n", "0.68\t0.12\t0.2\t\t\t-7280.88385\t0.993\t24.0\t\n", "0.0\t0.00024\t0.0\t\t\t-1.0214\t0.986\t36\t\n", "0.9998\t0.0\t0.00011\t\t\t-9383.49152\t0.993\t48\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73338\t0.98824\t12.00001\t\n", "0.68\t0.12\t0.2\t\t\t-7280.88429\t0.993\t24.0\t\n", "0.0094\t0.0\t0.0\t\t\t-79.81963\t0.98607\t36\t\n", "0.04\t0.12\t0.2\t\t\t-1435.58033\t0.98852\t12\t\n", "1e-05\t0.0\t0.0\t\t\t-0.10724\t0.986\t36\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73516\t0.98824\t12.0\t\n", "0.0\t0.12\t0.2\t\t\t-1094.7689\t0.98824\t12\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73531\t0.98824\t12\t\n", "0.68\t0.12\t0.2\t\t\t-7280.88385\t0.993\t24.0\t\n", "1.0\t0.0\t0.0\t\t\t-9385.27291\t0.993\t48\t\n", "0.04\t0.12\t0.2\t\t\t-1435.57776\t0.98852\t12.0\t\n", "0.0\t0.0\t0.0\t\t\t-0.00226\t0.986\t36\t\n", "0.99975\t0.0\t0.0\t\t\t-9382.7148\t0.993\t48\t\n", "0.003\t0.00473\t0.0\t\t\t-45.56283\t0.98605\t36\t\n", "0.99996\t0.0\t0.0\t\t\t-9384.8677\t0.993\t48\t\n", "0.0\t0.0\t9e-05\t\t\t-0.23291\t0.986\t36\t\n", "0.99995\t0.0\t0.0\t\t\t-9384.76739\t0.993\t48\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73249\t0.98824\t12.00003\t\n", "0.68\t0.12\t0.2\t\t\t-7280.88541\t0.993\t24.00001\t\n", "0.00019\t0.12\t0.2\t\t\t-1096.33036\t0.98824\t12\t\n", "1e-05\t0.0\t5e-05\t\t\t-0.22532\t0.986\t36\t\n", "0.0\t0.12\t0.2\t\t\t-1094.73474\t0.98824\t12.00003\t\n", "0.0\t1e-05\t0.0\t\t\t-0.04608\t0.986\t36\t\n", "0.63994\t0.12\t0.09272\t\t\t-6577.27231\t0.99197\t28.64881\t\n", "0.01628\t0.14359\t0.20006\t\t\t-1338.99298\t0.98852\t12\t\n", "0.27488\t0.11592\t0.0\t\t\t-2904.35567\t0.98874\t29.15077\t\n", "0.32314\t0.12\t0.2\t\t\t-3930.61909\t0.9905\t23.20784\t\n", "0.64219\t0.12\t0.12158\t\t\t-6681.90846\t0.99219\t27.48579\t\n", "0.27164\t0.11914\t0.00028\t\t\t-2890.32638\t0.98874\t28.4353\t\n", "0.67961\t0.0\t0.0\t\t\t-6182.39096\t0.99076\t36.78452\t\n", "0.2309\t0.12\t0.20001\t\t\t-3102.01895\t0.98986\t19.63648\t\n", "0.19309\t0.11998\t0.07748\t\t\t-2407.216\t0.98873\t23.43749\t\n", "0.06156\t0.12\t0.2\t\t\t-1620.48361\t0.98867\t12.86234\t\n", "0.0074\t0.12935\t0.21238\t\t\t-1237.18194\t0.98844\t12\t\n", "0.18823\t0.1145\t0.0\t\t\t-2126.6109\t0.98812\t28.23749\t\n", "0.35169\t0.00088\t0.0\t\t\t-3099.23369\t0.98847\t34.81166\t\n", "0.32428\t0.0003\t0.03672\t\t\t-2947.2218\t0.98853\t34.49807\t\n", "0.65163\t0.00036\t0.0\t\t\t-5912.95764\t0.99056\t35.67956\t\n", "0.07338\t0.11998\t0.0\t\t\t-1149.46796\t0.98735\t27.00382\t\n", "0.4605\t0.12\t0.19005\t\t\t-5162.85628\t0.99139\t23.98246\t\n", "0.77098\t0.0\t0.0\t\t\t-7076.99413\t0.9914\t40.43945\t\n", "0.17505\t0.12\t0.2\t\t\t-2607.68143\t0.98947\t17.40211\t\n", "0.64202\t0.12\t0.10793\t\t\t-6640.87914\t0.99209\t28.07043\t\n", "0.37148\t0.0\t0.0\t\t\t-3276.30526\t0.9886\t34.52888\t\n", "0.34498\t0.00065\t0.0\t\t\t-3037.14749\t0.98842\t35.0632\t\n", "0.37788\t0.12\t0.11458\t\t\t-4176.32636\t0.99029\t27.04611\t\n", "0.27829\t0.12\t0.2\t\t\t-3525.78337\t0.99019\t21.53152\t\n", "0.57074\t0.12\t0.2\t\t\t-6230.79\t0.99224\t23.82685\t\n", "0.24594\t0.12\t0.2\t\t\t-3236.03054\t0.98996\t20.23756\t\n", "0.48939\t0.12\t0.2\t\t\t-5462.88934\t0.99167\t23.62347\t\n", "0.54036\t0.0\t7e-05\t\t\t-4848.06677\t0.98978\t34.95355\t\n", "0.26482\t0.12\t0.19107\t\t\t-3377.79191\t0.99003\t21.37984\t\n", "0.15985\t0.12\t0.17123\t\t\t-2387.25317\t0.98916\t18.04055\t\n", "0.13872\t0.12\t0.2\t\t\t-2289.10159\t0.98921\t15.94867\t\n", "0.32479\t0.12\t0.15428\t\t\t-3808.36831\t0.99019\t25.19305\t\n", "0.40138\t0.00023\t0.07447\t\t\t-3756.62774\t0.98933\t33.05239\t\n", "0.13831\t0.12\t0.2\t\t\t-2285.54371\t0.98921\t15.93238\t\n", "0.276\t0.12\t0.2\t\t\t-3505.22008\t0.99017\t21.43996\t\n", "0.0\t0.0\t0.16798\t\t\t-476.1295\t0.98718\t23.6685\t\n", "0.09889\t0.12\t0.06914\t\t\t-1559.79302\t0.98802\t22.90516\t\n", "0.3923\t0.00011\t0.0\t\t\t-3467.73484\t0.98875\t34.58499\t\n", "0.0066\t0.13531\t0.20174\t\t\t-1224.54869\t0.98841\t12\t\n", "0.50857\t0.0\t0.00012\t\t\t-4548.46266\t0.98956\t34.87638\t\n", "0.98905\t0.00473\t0.0\t\t\t-9292.89054\t0.99296\t48\t\n", "0.28306\t0.0\t0.0\t\t\t-2473.92458\t0.98798\t36\t\n", "0.46054\t0.0\t0.00046\t\t\t-4099.91586\t0.98923\t34.7698\t\n", "0.6042\t0.10958\t0.0\t\t\t-5931.02352\t0.991\t32.83895\t\n", "0.34609\t0.12\t0.15265\t\t\t-3997.16389\t0.99033\t25.31691\t\n", "0.21636\t0.11602\t0.00019\t\t\t-2382.88978\t0.98833\t27.89563\t\n", "0.14157\t0.12\t0.14339\t\t\t-2144.66253\t0.98883\t18.51591\t\n", "0.58826\t0.0\t9e-05\t\t\t-5303.28221\t0.99012\t35.07431\t\n", "0.12138\t0.12\t0.08052\t\t\t-1787.18366\t0.98825\t21.95638\t\n", "5e-05\t0.12\t0.18182\t\t\t-1040.13546\t0.98811\t13.51523\t\n", "0.89424\t0.00258\t0.02293\t\t\t-8380.5748\t0.99244\t46.14588\t\n", "0.34664\t0.0\t0.0\t\t\t-3049.49062\t0.98843\t35.00096\t\n", "0.53905\t0.0\t0.0\t\t\t-4835.51481\t0.98977\t34.94763\t\n", "0.76043\t0.12\t0.05909\t\t\t-7656.61538\t0.99258\t34.92313\t\n", "0.20708\t0.12031\t0.06426\t\t\t-2495.36149\t0.98874\t24.57768\t\n", "0.5377\t0.12\t0.1567\t\t\t-5787.4504\t0.9917\t25.62043\t\n", "0.18655\t0.12\t0.2\t\t\t-2708.99089\t0.98955\t17.86204\t\n", "0.11631\t0.12\t0.2\t\t\t-2093.85842\t0.98905\t15.05253\t\n", "0.81189\t0.12\t0.05711\t\t\t-8160.65182\t0.99292\t35.90724\t\n", "0.9259\t6e-05\t0.0\t\t\t-8628.30954\t0.99248\t46.63818\t\n", "0.08134\t0.12\t0.02293\t\t\t-1280.23824\t0.98757\t26.75622\t\n", "0.30349\t0.12012\t0.09448\t\t\t-3442.23262\t0.98963\t27.11711\t\n", "0.03592\t0.0\t0.00032\t\t\t-306.77066\t0.98625\t36\t\n", "0.15449\t0.12\t0.07483\t\t\t-2060.27913\t0.98845\t22.43086\t\n", "0.80452\t0.0\t0.0\t\t\t-7409.14138\t0.99163\t41.781\t\n", "0.69993\t0.0\t0.05196\t\t\t-6521.89733\t0.99126\t37.01261\t\n", "0.54639\t0.0\t0.06517\t\t\t-5083.69996\t0.99028\t33.80874\t\n", "0.63845\t0.0\t0.0\t\t\t-5784.26051\t0.99047\t35.19613\t\n", "0.5354\t0.12\t0.2\t\t\t-5895.72576\t0.99199\t23.7385\t\n", "0.64889\t0.00074\t0.0\t\t\t-5888.13728\t0.99055\t35.58534\t\n", "0.66886\t5e-05\t0.0\t\t\t-6078.35167\t0.99068\t36.35662\t\n", "0.43289\t0.12\t0.2\t\t\t-4936.60353\t0.99127\t23.48223\t\n", "0.57247\t0.0\t0.0544\t\t\t-5301.18643\t0.99039\t34.34038\t\n", "0.49235\t0.0\t0.0\t\t\t-4395.93395\t0.98945\t34.83089\t\n", "0.22768\t0.0\t0.0\t\t\t-1978.55458\t0.98759\t36\t\n", "0.26063\t0.12\t0.1962\t\t\t-3355.84919\t0.99004\t20.9899\t\n", "0.26274\t0.0\t5e-05\t\t\t-2291.67851\t0.98784\t36\t\n", "0.31784\t0.12\t0.2\t\t\t-3882.62496\t0.99046\t23.11365\t\n", "0.49999\t0.0\t0.0\t\t\t-4467.57367\t0.9895\t34.8501\t\n", "0.28451\t0.0\t0.0\t\t\t-2487.02681\t0.98799\t36\t\n", "0.10268\t0.0\t0.02241\t\t\t-941.3528\t0.98688\t35.79913\t\n", "0.11258\t0.0003\t0.0528\t\t\t-1112.10205\t0.98716\t33.26667\t\n", "0.02207\t0.00569\t0.0\t\t\t-211.90502\t0.98619\t36\t\n", "0.71752\t5e-05\t0.0\t\t\t-6551.95679\t0.99102\t38.30305\t\n", "0.6398\t0.0\t0.0\t\t\t-5797.26056\t0.99048\t35.1995\t\n", "0.49318\t0.0\t0.00012\t\t\t-4404.01011\t0.98945\t34.83799\t\n", "0.17008\t0.12\t0.06\t\t\t-2155.52542\t0.98845\t23.66673\t\n", "0.66839\t2e-05\t0.0\t\t\t-6073.64104\t0.99068\t36.33636\t\n", "0.3642\t0.12\t0.2\t\t\t-4304.45555\t0.99079\t23.3105\t\n", "0.60867\t0.0\t0.0\t\t\t-5498.15211\t0.99026\t35.12187\t\n", "0.57697\t0.0\t0.0744\t\t\t-5399.95509\t0.99056\t33.48502\t\n", "0.43981\t0.0\t0.0\t\t\t-3906.02568\t0.98908\t34.69954\t\n", "0.71867\t0.12\t0.10876\t\t\t-7387.46619\t0.99263\t31.10033\t\n", "0.85374\t1e-05\t0.0\t\t\t-7900.2558\t0.99198\t43.75013\t\n", "0.15889\t0.00053\t5e-05\t\t\t-1373.36185\t0.98712\t36\t\n", "0.59334\t0.12\t0.19029\t\t\t-6416.73792\t0.99233\t24.304\t\n", "0.32197\t0.0\t0.0\t\t\t-2825.29675\t0.98825\t35.9262\t\n", "0.78025\t0.0\t0.00023\t\t\t-7169.17208\t0.99146\t40.81912\t\n", "0.2789\t0.12\t0.2\t\t\t-3531.32494\t0.99019\t21.55618\t\n", "0.45856\t0.0\t1e-05\t\t\t-4080.30536\t0.98921\t34.74683\t\n", "0.15224\t0.0\t0.06145\t\t\t-1480.95695\t0.9875\t32.54546\t\n", "0.23372\t0.00014\t0.0\t\t\t-2032.97008\t0.98764\t36\t\n", "0.12898\t0.00175\t0.0\t\t\t-1116.836\t0.98692\t36\t\n", "0.26499\t0.12\t0.2\t\t\t-3406.47907\t0.99009\t20.99975\t\n", "0.84097\t0.0\t0.05953\t\t\t-7935.30265\t0.9923\t42.32573\t\n", "0.66902\t0.0\t0.0002\t\t\t-6080.18926\t0.99068\t36.3687\t\n", "0.0084\t0.13508\t0.21174\t\t\t-1269.31865\t0.98849\t12\t\n", "0.66158\t0.0\t0.0\t\t\t-6007.61399\t0.99063\t36.06322\t\n", "0.85084\t0.0\t0.00041\t\t\t-7872.25875\t0.99196\t43.64991\t\n", "0.10389\t0.12\t0.2\t\t\t-1985.98429\t0.98897\t14.55561\t\n", "0.97566\t0.00056\t0.0\t\t\t-9137.82072\t0.99283\t48\t\n", "0.16987\t0.00035\t0.0\t\t\t-1468.83543\t0.98719\t36\t\n", "0.68205\t7e-05\t0.0\t\t\t-6206.29535\t0.99077\t36.88446\t\n", "0.26086\t0.12\t0.2\t\t\t-3369.4464\t0.99007\t20.83441\t\n", "0.21452\t0.0\t0.00012\t\t\t-1861.98179\t0.9875\t36\t\n", "0.59434\t0.0\t0.0\t\t\t-5361.056\t0.99016\t35.08588\t\n", "0.29586\t1e-05\t0.0\t\t\t-2589.24496\t0.98807\t36\t\n", "0.53932\t0.0\t0.0\t\t\t-4838.01986\t0.98978\t34.94832\t\n", "0.77048\t0.12\t0.10937\t\t\t-7898.31601\t0.993\t31.55271\t\n", "0.21423\t0.12\t0.2\t\t\t-2953.79916\t0.98974\t18.96902\t\n", "0.0\t0.11565\t0.00021\t\t\t-503.25249\t0.98681\t27.97888\t\n", "0.00368\t0.0\t0.07429\t\t\t-235.57654\t0.98655\t31.47555\t\n", "0.43815\t0.12\t0.11745\t\t\t-4740.26809\t0.99073\t27.07275\t\n", "0.78302\t0.0\t0.0\t\t\t-7195.94183\t0.99148\t40.92078\t\n", "0.15387\t0.12\t0.2\t\t\t-2421.64537\t0.98932\t16.55472\t\n", "\n", "Relevant range in objective space:\n", "\tObjective y[0] from -9385.2753 to -0.0023\n", "\tObjective y[1] from 0.986 to 0.993\n", "\tObjective y[2] from 12 to 48\n" ] } ], "source": [ "print(\"\\n\\nComputed Pareto front:\\n======\\n\")\n", "for k in range(len(pareto_optimal_parameters[0])):\n", " for i in range(m):\n", " print(round(pareto_optimal_parameters[i][k], 5), end=\"\\t\")\n", " print(\"\\t\\t\", end=\"\")\n", " for i in range(n):\n", " print(round(pareto_optimal_compromises[i][k], 5), end=\"\\t\")\n", " print()\n", "\n", "print(\"\\nRelevant range in objective space:\")\n", "for i in range(n):\n", " print(\"\\tObjective y[\", i, \"] from \", round(objective_space_lower[i], 4), \" to \", \\\n", " round(objective_space_upper[i], 4), sep = \"\")" ] }, { "cell_type": "code", "execution_count": 8, "id": "e228e11e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# visualize the whole Pareto front, projected to y[0] and y[2], not showing y[1]\n", "#\n", "import seaborn as sbn\n", "import matplotlib.pyplot as plt\n", "\n", "fig, ax = plt.subplots()\n", "fig.set_size_inches(14, 6)\n", "plt.xticks(fontsize=18, color=\"#322300\")\n", "plt.yticks(fontsize=18, color=\"#322300\")\n", "ax.set_xlabel(\"cost measure y[0]\", fontsize=24, color=\"#322300\")\n", "ax.set_ylabel(\"cost measure y[2]\", fontsize=24, color=\"#322300\")\n", "\n", "# draw the points on the Pareto front jointly with a fifth-order regression\n", "#\n", "sbn.scatterplot(x=pareto_optimal_compromises[0], y=pareto_optimal_compromises[2], \\\n", " color=\"#002855\")" ] }, { "cell_type": "code", "execution_count": 9, "id": "acb76759", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "def square_arrangement(square_size, list_of_values, order_of_indices):\n", " matrix = np.ndarray((square_size, square_size))\n", " k = 0\n", " for i in range(square_size):\n", " for j in range(square_size-1, -1, -1):\n", " matrix[i][j] = list_of_values[order_of_indices[k]]\n", " k += 1\n", " return matrix\n", "\n", "def arrange_indices(square_size, number_of_lists, list_of_lists,\\\n", " primary_idx, secondary_idx):\n", " \n", " index_order_p_idx = [k for (v, k) in\\\n", " sorted([(v, k) for k, v in\\\n", " enumerate(list_of_lists[primary_idx])])]\n", " index_order_s_idx = [k for (v, k) in\\\n", " sorted([(v, k) for k, v in\\\n", " enumerate(list_of_lists[secondary_idx])])]\n", " \n", " index_rank_s = {index_order_s_idx[i]: i for i in range(len(index_order_s_idx))}\n", " \n", " order_of_indices = []\n", " for i in range(square_size-1, -1, -1):\n", " indices = index_order_p_idx[i*square_size: (i+1)*square_size]\n", " secondary_ranks = {idx: index_rank_s[idx] for idx in indices}\n", " secondary_order = [k for (v, k) in sorted([(v, k) for (k, v) in secondary_ranks.items()])]\n", " for idx in secondary_order:\n", " order_of_indices.append(idx)\n", " \n", " return order_of_indices" ] }, { "cell_type": "code", "execution_count": 13, "id": "5e812f4c", "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import seaborn as sbn\n", "import matplotlib.pyplot as plt\n", "\n", "fig, axs = plt.subplots(2, max(m, n))\n", "fig.set_size_inches(18, 12)\n", "\n", "square_size = 15\n", "horizontal_id, vertical_id = np.meshgrid(range(square_size), range(square_size-1, -1, -1))\n", "\n", "idx_order = arrange_indices(square_size, n, pareto_optimal_compromises, 0, 1)\n", "\n", "for i in range(m):\n", " # look up Pareto optimal parameter values\n", " #\n", " pareto_values = square_arrangement(square_size, pareto_optimal_parameters[i], idx_order)\n", "\n", " axs[0, i].set_title(\"Parameter x[\" + str(i) + \"]\")\n", " im = axs[0, i].imshow(pareto_values)\n", " cbar = axs[0, i].figure.colorbar(im, ax=axs[0, i])\n", "\n", "for i in range(n):\n", " # look up values from the Pareto front\n", " #\n", " pareto_values = square_arrangement(square_size, pareto_optimal_compromises[i], idx_order)\n", " axs[1, i].set_title(\"Objective y[\" + str(i) + \"]\")\n", " im = axs[1, i].imshow(pareto_values)\n", " cbar = axs[1, i].figure.colorbar(im, ax=axs[1, i])" ] }, { "cell_type": "code", "execution_count": null, "id": "dc5c5de4", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.7" } }, "nbformat": 4, "nbformat_minor": 5 }