{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# setup needed Py packages:\n", "import numpy as np\n", "import win32com.client\n", "import deap\n", "from deap import algorithms, base, creator, tools\n", "import matplotlib.pyplot as plt\n", "import random\n", "import pandas as pd\n", "import seaborn\n", "seaborn.set(style='whitegrid')\n", "seaborn.set_context('notebook')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Instantiate the main OpenDSS Object:\n", "try:\n", " dssObj = win32com.client.Dispatch(\"OpenDSSengine.DSS\")\n", "except:\n", " print (\"Unable to start the OpenDSS Engine\")\n", " raise SystemExit" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Instantiate the other OpenDSS Object:\n", "dssText = dssObj.Text # Definiranje tekstualnog objekta\n", "dssCircuit = dssObj.ActiveCircuit # Definiranje objekta mreze\n", "dssSolution = dssCircuit.Solution # Definiranje objekta rjesenja\n", "dssElem = dssCircuit.ActiveCktElement # Definiranje objekta elementa mreze" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "# Compail the OpenDSS file\n", "dssText.Command = r\"Compile 'C:\\Users\\mimit1\\Documents\\OpenDSS\\Exercise3dss.dss'\"\n", "#dssText.Command = r\"Compile 'C:\\Users\\Barukcic\\Documents\\OpenDSS\\Exercise3dss.dss'\"" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('sour.1', 'sour.2', 'sour.3', 'b2.1', 'b2.2', 'b2.3', 'b3.1', 'b3.2', 'b3.3', 'b4.1', 'b4.2', 'b4.3', 'b5.1', 'b5.2', 'b5.3', 'b6.1', 'b6.2', 'b6.3', 'b7.1', 'b7.2', 'b7.3', 'b8.1', 'b8.2', 'b8.3', 'b9.1', 'b9.2', 'b9.3', 'b10.1', 'b10.2', 'b10.3', 'b11.1', 'b11.2', 'b11.3', 'b12.1', 'b12.2', 'b12.3', 'b13.1', 'b13.2', 'b13.3', 'b14.1', 'b14.2', 'b14.3', 'b15.1', 'b15.2', 'b15.3', 'b16.1', 'b16.2', 'b16.3', 'b17.1', 'b17.2', 'b17.3', 'b18.1', 'b18.2', 'b18.3', 'b19.1', 'b19.2', 'b19.3', 'b20.1', 'b20.2', 'b20.3', 'b21.1', 'b21.2', 'b21.3', 'b22.1', 'b22.2', 'b22.3', 'b23.1', 'b23.2', 'b23.3', 'b24.1', 'b24.2', 'b24.3', 'b25.1', 'b25.2', 'b25.3', 'b26.1', 'b26.2', 'b26.3', 'b27.1', 'b27.2', 'b27.3', 'b28.1', 'b28.2', 'b28.3', 'b29.1', 'b29.2', 'b29.3', 'b30.1', 'b30.2', 'b30.3', 'b31.1', 'b31.2', 'b31.3', 'b32.1', 'b32.2', 'b32.3', 'b33.1', 'b33.2', 'b33.3', 'b34.1', 'b34.2', 'b34.3')\n" ] } ], "source": [ "# Get node names:\n", "NodeN = dssCircuit.AllNodeNames\n", "# and print them:\n", "print (NodeN)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('sour', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'b10', 'b11', 'b12', 'b13', 'b14', 'b15', 'b16', 'b17', 'b18', 'b19', 'b20', 'b21', 'b22', 'b23', 'b24', 'b25', 'b26', 'b27', 'b28', 'b29', 'b30', 'b31', 'b32', 'b33', 'b34')\n" ] } ], "source": [ "# Repeat for bus names:\n", "BusN = dssCircuit.AllBusNames\n", "print (BusN)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Nominal voltage of load L2 is: 11.0 kV \n", " Nominal active power of L2 is: 230.0 kW \n", " Nominal reactive power of L2 is: 142.5 kvar \n", " and complex power of L2 is: (230+142.5j) kVA\n" ] } ], "source": [ "# Get some properties of the load element:\n", "dssCircuit.Loads.Name = 'L2'\n", "VL2 = dssCircuit.Loads.kV\n", "PL2 = dssCircuit.Loads.kW\n", "QL2 = dssCircuit.Loads.kvar\n", "# and print them:\n", "print ('Nominal voltage of load L2 is: ', VL2, 'kV \\n',\n", " 'Nominal active power of L2 is: ', PL2, 'kW \\n',\n", " 'Nominal reactive power of L2 is: ', QL2, 'kvar \\n',\n", " 'and complex power of L2 is: ', complex(PL2, QL2), 'kVA')" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [], "source": [ "# Let's make the objective function of the optimization problem of optimal allocation of DG in the distribution network in form of PY function:\n", "def FC(ind, *addtnP):\n", " # decoding DG allocation from DE individual\n", " LOCdg = int(round(ind[0])) # decode DG location from DE individual\n", " # print (type(LOCdg)) - control line\n", " Pdg = ind[1] # decode DG powers from DE individual\n", " Qdg = ind[2]\n", " \n", " # change DG location and power in OpenDSS script:\n", " dssText.Command = 'Edit generator.DG' + ' bus1=' + BusN[LOCdg] + ' kw=' + str(Pdg) + ' kvar=' + str(Qdg)\n", "\n", " # execute simulation with changed DG location and powers:\n", " dssSolution.Solve()\n", " \n", " # get nodal voltages, maximum and minimum voltages in [p.u]\n", " Vpu = dssCircuit.AllBusVmagPU\n", " Vmax = max(Vpu)\n", " Vmin = min(Vpu)\n", " \n", " # get network loosses\n", " # this is the first objective function in MOOP\n", " f1 = dssCircuit.Losses[0]/1000 # divide by 1000 to get numerical value in [kW]\n", " \n", " # check inequality constraints and penalize OF if they not satisfied (soft penalisation):\n", " if Vmax > Vu:\n", " NL = (1+Vmax-Vu)*NL\n", " if Vmin < Vl:\n", " NL = (1+Vl-Vmin)*NL\n", " # define measure of voltage profile flatness as the secodne objective in MOOP\n", " f2 = Pdg #Qdg #Vmax - Vmin\n", " \n", " # use network losses as objective function value\n", " return f1, f2, Vmin, Vmax\n", "\n", "def OF(ind, addtnP):\n", " FNC = FC(ind, *addtnP)\n", " return FNC[0], FNC[1]" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [], "source": [ "# set voltage limits in [p.u] (inequality constraints)\n", "Vl = 0.9\n", "Vu = 1.1\n", "\n", "# and forward them as additional parameters of objective function\n", "addtnP = (Vl, Vu)" ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Active network losses are: 175.67334769486146 [kW] and Vmax-Vmin is: 500.0 p.u.\n", "Active network losses, min and max voltages are: (175.67490214546783, 500.0, 0.9437485995484897, 0.9982302021953554) [kW, p.u., p.u., p.u.]\n" ] } ], "source": [ "# Control cell, check if objective function work well\n", "indp = [9.8, 500.0, 350.0]\n", "NLp = OF(indp, addtnP)\n", "NLpp = FC(indp, addtnP)\n", "\n", "# total network losses are:\n", "print ('Active network losses are: ', NLp[0], '[kW] and Vmax-Vmin is: ', NLp[1], 'p.u.')\n", "print ('Active network losses, min and max voltages are: ', NLpp, '[kW, p.u., p.u., p.u.]')" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\mimit1\\Anaconda3\\lib\\site-packages\\deap\\creator.py:141: RuntimeWarning: A class named 'FitnessMin' has already been created and it will be overwritten. Consider deleting previous creation of that class or rename it.\n", " RuntimeWarning)\n", "C:\\Users\\mimit1\\Anaconda3\\lib\\site-packages\\deap\\creator.py:141: RuntimeWarning: A class named 'Individual' has already been created and it will be overwritten. Consider deleting previous creation of that class or rename it.\n", " RuntimeWarning)\n" ] } ], "source": [ "# create fintess and individual DEAP classes:\n", "creator.create(\"FitnessMin\", base.Fitness, weights=(-1.0,-1.0)) # two objectives, both minimization\n", "creator.create(\"Individual\", list, fitness=creator.FitnessMin) # EA individual is in form of Python list\n", "\n", "# instantiate toolbox class:\n", "toolbox = base.Toolbox()" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [], "source": [ "# define decision variable limits\n", "Ndv = 3 # number of decision variables\n", "# number of busess avaliable for DG instalation\n", "Lmin, Lmax = 0, len(BusN)-1\n", "# Power limits of DG\n", "PDGmin, PDGmax = 0.0, 5000.0\n", "QDGmin, QDGmax = -2000.0, 2000.0\n", "\n", "# register decision variables\n", "toolbox.register(\"LOC\", random.randint, Lmin, Lmax) # integer type\n", "toolbox.register(\"PDG\", random.uniform, PDGmin, PDGmax) # float type\n", "toolbox.register(\"QDG\", random.uniform, QDGmin, QDGmax) # float type\n", "\n", "# build EA individual:\n", "toolbox.register(\"ind\", tools.initCycle, creator.Individual, (toolbox.LOC, toolbox.PDG, toolbox.QDG), n=1) # individual as sequence of decision variables\n", "\n", "# generate initial EA population:\n", "toolbox.register(\"population\", tools.initRepeat, list, toolbox.ind)" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [], "source": [ "# setting EA operators\n", "# crossover (mate):\n", "toolbox.register('mate', tools.cxUniform, indpb=0.5) # uniform crossover with probability of 0.5 for choosing gene from soem of parents\n", "\n", "# mutation:\n", "toolbox.register(\"mutate\", tools.mutPolynomialBounded, low=[Lmin, PDGmin, QDGmin], up=[Lmax, PDGmax, QDGmax], eta=2.0, indpb=0.1)\n", "\n", "# selection:\n", "toolbox.register(\"select\", tools.selNSGA2) # Pareto ranking sorting from NSGA method" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [], "source": [ "# registre objective function:\n", "toolbox.register(\"evaluate\", OF, addtnP = addtnP) # OF is name of the function in Python and addtnP are additional parameters need for OF calculation" ] }, { "cell_type": "code", "execution_count": 131, "metadata": {}, "outputs": [], "source": [ "# performe optimization by using DEAP\n", "toolbox.max_gen = 200 # define maximum number of generations in EA\n", "toolbox.pop_size = 20 # define population size (number of individuals in population)\n", "toolbox.mut_prob = 1/Ndv # probability of gene mutation\n", "\n", "pop = toolbox.population(toolbox.pop_size)\n", "# start EA\n", "res, log = algorithms.eaMuPlusLambda(pop, toolbox, mu=toolbox.pop_size,\n", " lambda_=toolbox.pop_size,\n", " cxpb=1-toolbox.mut_prob,\n", " mutpb=toolbox.mut_prob,\n", " stats=None, #s, #None,\n", " ngen=toolbox.max_gen,\n", " verbose=False)\n", "#res" ] }, { "cell_type": "code", "execution_count": 132, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " number of ranks is: 1\n", "\n", " The Pareto front of rank 1 is: [(46.96850779564804, 2886.405054830937), (48.07626358459516, 2643.4848631150126), (50.34901465522121, 2380.935746032592), (53.04435785186067, 2180.5681004294893), (58.325821802062976, 1926.9756327909847), (64.90796529020753, 1674.2901779645808), (71.48073348805323, 1482.3320594806082), (77.55107411995114, 1334.1608283940936), (83.89973461791139, 1197.9622158369414), (90.18493820072115, 1076.6844571677348), (99.4829833465784, 915.6438590655564), (108.137351331647, 780.0682325825392), (112.0063575680241, 722.9230309837525), (119.80452158088693, 613.6006654070917), (127.57369718428576, 511.4431022311144), (131.43280784536873, 463.0325653190855), (141.07282917953685, 347.0780237347424), (150.72970167687552, 237.4242638857229), (162.16318872016586, 109.68638761046944), (171.41206870587416, 1.2143716326298204)] \n", "\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Show Pareto front\n", "fronts = tools.emo.sortLogNondominated(res, len(res))\n", "plot_colors = seaborn.color_palette(\"Set1\", n_colors=20)\n", "fig, ax = plt.subplots(1)\n", "\n", "PFL =[]\n", "for i,inds in enumerate(fronts):\n", " PFs = [toolbox.evaluate(ind) for ind in inds] # calculate OF value for Pareto set i.e. calculate Pareto fronts (of all ranks)\n", " df = pd.DataFrame(PFs)\n", " df.plot(ax=ax, kind='scatter', label='Front ' + str(i+1), \n", " x=df.columns[0], y=df.columns[1], color=plot_colors[i])#, color=plot_colors[i])\n", " PFL.append(PFs)\n", "plt.xlabel('f_1 value');plt.ylabel('f_2 value'); plt.title('Pareto fronts, NSGA-II, DEAP')\n", "#ax.set_xlim(46, 48)\n", "#ax.set_ylim(0.01, 0.02)\n", "print('\\n number of ranks is: ', len(PFL))\n", "print ('\\n The Pareto front of rank 1 is: ', PFL[0], '\\n')\n", "if len(PFL) > 1:\n", " print ('\\n The Pareto front of rank 2 is: ', PFL[1], '\\n')" ] }, { "cell_type": "code", "execution_count": 133, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[19.603516970473542, 2886.405054830937, 1782.6243333071354], [19.603516970473542, 2643.4848631150126, 1782.6243333071354], [21.300277928394927, 2380.935746032592, 1687.7437150412095], [21.300277928394927, 2180.5681004294893, 1687.7437150412095], [21.300277928394927, 1926.9756327909847, 1687.7437150412095], [22.347498054007886, 1674.2901779645808, 1522.9731655941152], [22.347498054007886, 1482.3320594806082, 1522.9731655941152], [22.347498054007886, 1334.1608283940936, 1522.9731655941152], [22.347498054007886, 1197.9622158369414, 1522.9731655941152], [22.347498054007886, 1076.6844571677348, 1522.9731655941152], [22.347498054007886, 915.6438590655564, 1522.9731655941152], [22.347498054007886, 780.0682325825392, 1522.9731655941152], [22.347498054007886, 722.9230309837525, 1522.9731655941152], [22.347498054007886, 613.6006654070917, 1522.9731655941152], [22.347498054007886, 511.4431022311144, 1522.9731655941152], [22.347498054007886, 463.0325653190855, 1522.9731655941152], [22.347498054007886, 347.0780237347424, 1522.9731655941152], [22.347498054007886, 237.4242638857229, 1522.9731655941152], [21.300277928394927, 109.68638761046944, 1687.7437150412095], [19.603516970473542, 1.2143716326298204, 1746.439395353482]]\n" ] } ], "source": [ "# Show the Pareto set as solution of MOOP\n", "print (fronts[0])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }