{ "cells": [ { "cell_type": "markdown", "id": "33d91984-c9fa-4ecb-aedd-af44ec5d759e", "metadata": {}, "source": [ "# Example 1" ] }, { "cell_type": "code", "execution_count": 1, "id": "42bc699e-c488-45c0-a489-992d658884d6", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import hyveopt as h2\n", "from shilps.datasets import generate_solar_irradiance" ] }, { "cell_type": "markdown", "id": "3483ac6b-1736-4198-b534-0837285d4c69", "metadata": {}, "source": [ "### Create system components templates" ] }, { "cell_type": "code", "execution_count": 4, "id": "35ce34a9-937f-49cf-b32b-e8493a564682", "metadata": {}, "outputs": [], "source": [ "plant_template = h2.PlantTemplate(\n", " name=\"myplant\",\n", " location=(\"22°10'17.66\\\"S\", \"70° 5'23.50\\\"W\") # ~ Tocopilla, Chile.\n", ")\n", "\n", "electrolizer_efficiency = h2.Gain(\n", " breakpoints = [0.0, 0.1, 0.4, 0.7, 1], \n", " slopes = [0.,2., 0.5, 0.2], \n", " intercepts = [0.0, -0.1, 0.5, 0.8] \n", ")\n", "\n", "plant_template.add(h2.TemplateElectrolizer(\n", " name=\"electrolizer\",\n", " pnom_kW=h2.Range(0., 200.),\n", " gain=electrolizer_efficiency,\n", " inv_cost_per_kw=1500.\n", " )\n", ")\n", "\n", "plant_template.add(h2.TemplateESS(\n", " name=\"battery\",\n", " pnom_kW=h2.Range(0., 200.),\n", " soc_nom_kWh=h2.Range(0., 100.),\n", " inv_cost_per_kw=300.\n", "))\n", "\n", "plant_template.add(h2.TemplatePVSystem(\n", " name=\"pv_system\",\n", " snom_KVA=h2.Range(0., 200.),\n", " solar_irradiance=h2.TSParameter(tsname=\"si_pv_system\", default=0.0),\n", " inv_cost_per_kw=1500.\n", "))\n", "\n" ] }, { "cell_type": "markdown", "id": "b4a2a7f6-faa2-491b-9a95-8161a92392c9", "metadata": {}, "source": [ "### Planning horizon definition and time series data generation" ] }, { "cell_type": "code", "execution_count": 5, "id": "2d98b85d-8197-4f03-a5ef-332984fea386", "metadata": {}, "outputs": [], "source": [ "\n", "insample_start = '2025-01-01'\n", "planning_horizon_start = '2025-01-01'\n", "planning_horizon_end = '2025-01-02'\n", "freq = '1h'\n", "scenarios = list(range(1, 4))\n", "\n", "# Define time configuration\n", "time_config = h2.TimeConfig(\n", " start=planning_horizon_start,\n", " end=planning_horizon_end,\n", " freq=freq\n", ")\n", "\n", "\n", "tsdata = h2.DataTimeSeries(\n", " tsnames=plant_template.tsnames(), scenarios=scenarios,\n", " time_config=time_config)\n", "\n", "for scenario in scenarios:\n", "\n", " # Generate solar irradiance data\n", " solar_series = generate_solar_irradiance(\n", " start_date=time_config.start,\n", " end_date=time_config.end,\n", " frequency=time_config.freq,\n", " column_dimension=1\n", " )\n", "\n", " # Add data to time series data\n", " tsdata[scenario].loc[:, \"solar_irradiance_pv1\"] = solar_series\n", " " ] }, { "cell_type": "markdown", "id": "dd3d57e0-deb3-4c39-9fd2-244c8e24c79b", "metadata": {}, "source": [ "### Create and solve sizing model" ] }, { "cell_type": "code", "execution_count": 6, "id": "d60cb654-5a2c-4275-8fc6-3f88377ba5fd", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "gen\tnevals\tavg \tmin \tmax \n", "0 \t300 \t-14.2568\t(np.float64(-37.049834657776245),)\t(np.float64(-6.400403606924987),)\n", "1 \t181 \t-11.2196\t(np.float64(-35.1124400260609),) \t(np.float64(-6.400403606924987),)\n", "2 \t163 \t-10.0903\t(np.float64(-29.733630415577338),)\t(np.float64(-6.400403606924987),)\n", "3 \t175 \t-8.95495\t(np.float64(-26.14615432248884),) \t(np.float64(-4.669807719374384),)\n", "4 \t176 \t-8.2904 \t(np.float64(-26.908103670004298),)\t(np.float64(-5.137030699993553),)\n", "5 \t192 \t-7.50766\t(np.float64(-30.40538001871077),) \t(np.float64(-4.585239648039815),)\n", "6 \t178 \t-6.82837\t(np.float64(-25.006919665419275),)\t(np.float64(-3.6520816772347806),)\n", "7 \t183 \t-6.33379\t(np.float64(-31.127589928600244),)\t(np.float64(-2.3499866941002576),)\n", "8 \t182 \t-5.79749\t(np.float64(-21.316647591434233),)\t(np.float64(-2.3499866941002576),)\n", "9 \t194 \t-5.42077\t(np.float64(-29.620298226979727),)\t(np.float64(-2.3499866941002576),)\n", "10 \t163 \t-4.86271\t(np.float64(-30.675712466660535),)\t(np.float64(-1.538306585990291),) \n", "11 \t170 \t-4.41034\t(np.float64(-23.335768196695224),)\t(np.float64(-1.538306585990291),) \n", "12 \t214 \t-3.77383\t(np.float64(-21.73248137675386),) \t(np.float64(-1.1358958855328538),)\n", "13 \t190 \t-3.49369\t(np.float64(-30.250573120400368),)\t(np.float64(-0.9719171431486425),)\n", "14 \t185 \t-3.11407\t(np.float64(-29.306763929026026),)\t(np.float64(-0.9719171431486425),)\n", "15 \t184 \t-2.57984\t(np.float64(-31.74589384538956),) \t(np.float64(-0.9719171431486425),)\n", "16 \t201 \t-2.37726\t(np.float64(-26.661554921622187),)\t(np.float64(-0.05283649411353819),)\n", "17 \t195 \t-2.19856\t(np.float64(-27.20444214705944),) \t(np.float64(-0.05283649411353819),)\n", "18 \t181 \t-1.77483\t(np.float64(-27.926151638601432),)\t(np.float64(-0.05283649411353819),)\n", "19 \t189 \t-1.8508725689889949\t(np.float64(-27.848863628585683),)\t(Individual(12.54271916),) \n", "20 \t176 \t-1.6095947662888124\t(np.float64(-29.413865036357414),)\t(Individual(12.54271916),) \n", "21 \t172 \t-1.54571 \t(np.float64(-28.430304935058597),)\t(np.float64(-0.05283649411353819),)\n", "22 \t175 \t-0.7407094429089411\t(np.float64(-27.196052811510302),)\t(Individual(12.39170907),) \n", "23 \t170 \t-0.9629627516149749\t(np.float64(-29.00099313993263),) \t(Individual(12.39170907),) \n", "24 \t170 \t-0.3990138063044213\t(np.float64(-30.325095229917984),)\t(Individual(12.91519982),) \n", "25 \t165 \t0.047922468259401184\t(np.float64(-29.0),) \t(Individual(13.39170907),) \n", "26 \t181 \t0.8100040398187571 \t(np.float64(-29.062925984794443),)\t(Individual(13.39170907),) \n", "27 \t184 \t3.0630442132737965 \t(np.float64(-29.420524555607116),)\t(Individual(14.29029143),) \n", "28 \t163 \t6.578725612363231 \t(np.float64(-30.484703595350265),)\t(Individual(14.29029143),) \n", "29 \t163 \t8.942953503672927 \t(np.float64(-29.529732488525262),)\t(Individual(15.39170907),) \n", "30 \t170 \t9.311720754573882 \t(np.float64(-30.0),) \t(Individual(15.39170907),) \n", "31 \t181 \t9.789417276665402 \t(np.float64(-31.019718738980494),)\t(Individual(15.39170907),) \n", "32 \t182 \t10.046461830683567 \t(np.float64(-29.892880847742962),)\t(Individual(15.45071159),) \n", "33 \t170 \t11.380133402577446 \t(np.float64(-31.132522564451264),)\t(Individual(16.39170907),) \n", "34 \t176 \t11.377959543292713 \t(np.float64(-28.433066451283842),)\t(Individual(16.52888411),) \n", "35 \t165 \t11.222756785516406 \t(np.float64(-29.57558353121365),) \t(Individual(16.52888411),) \n", "36 \t155 \t12.48359388637221 \t(np.float64(-30.0),) \t(Individual(17.45071159),) \n", "37 \t174 \t11.8225920057278 \t(np.float64(-30.18310158011449),) \t(Individual(18.39170907),) \n", "38 \t169 \t12.574400143978439 \t(np.float64(-28.625922995315378),)\t(Individual(18.39170907),) \n", "39 \t166 \t13.898148831915671 \t(np.float64(-26.310362221526454),)\t(Individual(18.39170907),) \n", "40 \t193 \t12.417065575089008 \t(np.float64(-28.816074947614332),)\t(Individual(18.45071159),) \n", "41 \t197 \t13.100644048280397 \t(np.float64(-27.747901232468262),)\t(Individual(18.45071159),) \n", "42 \t182 \t12.056640351961642 \t(np.float64(-30.627066700558778),)\t(Individual(18.45071159),) \n", "43 \t169 \t14.527736021428552 \t(np.float64(-28.641604630457305),)\t(Individual(19.31353655),) \n", "44 \t182 \t14.08085628344299 \t(np.float64(-29.672623323138854),)\t(Individual(19.45071159),) \n", "45 \t183 \t14.185691989073781 \t(np.float64(-29.13804452027184),) \t(Individual(19.45071159),) \n", "46 \t190 \t13.481273359063845 \t(np.float64(-32.355466209089634),)\t(Individual(19.45071159),) \n", "47 \t187 \t13.777883979013938 \t(np.float64(-28.0),) \t(Individual(19.45071159),) \n", "48 \t185 \t14.560692919896473 \t(np.float64(-26.839637184411554),)\t(Individual(19.45071159),) \n", "49 \t198 \t13.717769210169475 \t(np.float64(-29.420524555607116),)\t(Individual(20.2064174),) \n", "50 \t184 \t13.718368151016284 \t(np.float64(-28.98298554466531),) \t(Individual(20.2064174),) \n", "51 \t155 \t14.885261654196778 \t(np.float64(-27.894247466054317),)\t(Individual(20.2064174),) \n", "52 \t168 \t15.63285403819514 \t(np.float64(-28.098209652546885),)\t(Individual(20.2064174),) \n", "53 \t162 \t16.27202097782293 \t(np.float64(-28.548489478718825),)\t(Individual(20.2064174),) \n", "54 \t178 \t15.447755261980705 \t(np.float64(-28.50030562188424),) \t(Individual(20.2064174),) \n", "55 \t183 \t15.771217385513971 \t(np.float64(-29.349034980881235),)\t(Individual(20.2064174),) \n", "56 \t178 \t15.327903568929223 \t(np.float64(-29.218123989231152),)\t(Individual(20.2064174),) \n", "57 \t170 \t15.840513707553013 \t(np.float64(-27.868656892763667),)\t(Individual(20.2064174),) \n", "58 \t173 \t14.997795192435214 \t(np.float64(-29.016809816669653),)\t(Individual(20.2064174),) \n", "59 \t184 \t15.321793607534753 \t(np.float64(-27.0),) \t(Individual(20.2064174),) \n", "60 \t173 \t15.986518817709591 \t(np.float64(-27.0),) \t(Individual(20.2064174),) \n", "61 \t180 \t15.789480759624036 \t(np.float64(-29.430744118419042),)\t(Individual(20.2064174),) \n", "62 \t171 \t15.99979957733594 \t(np.float64(-29.4069061767527),) \t(Individual(20.2064174),) \n", "63 \t185 \t15.693465762766989 \t(np.float64(-29.977681704683395),)\t(Individual(20.2064174),) \n", "64 \t190 \t17.133281022442695 \t(np.float64(-29.868656892763667),)\t(Individual(20.2064174),) \n", "65 \t166 \t16.70698599585068 \t(np.float64(-31.384394830435344),)\t(Individual(20.2064174),) \n", "66 \t202 \t15.276888757033085 \t(np.float64(-28.885898825019567),)\t(Individual(20.2064174),) \n", "67 \t184 \t16.39706147063292 \t(np.float64(-26.041378483030424),)\t(Individual(20.2064174),) \n", "68 \t167 \t15.777157248285388 \t(np.float64(-31.50571272608788),) \t(Individual(20.2064174),) \n", "69 \t192 \t15.586448539017619 \t(np.float64(-27.62715516876611),) \t(Individual(20.2064174),) \n", "70 \t175 \t14.282874466630279 \t(np.float64(-30.50030562188424),) \t(Individual(20.2064174),) \n", "71 \t193 \t14.889824326986194 \t(np.float64(-27.984820001028975),)\t(Individual(20.2064174),) \n", "72 \t164 \t15.524394127965227 \t(np.float64(-29.423967559807924),)\t(Individual(20.2064174),) \n", "73 \t195 \t15.140192539204897 \t(np.float64(-28.965679891296695),)\t(Individual(20.2064174),) \n", "74 \t192 \t15.504621528787778 \t(np.float64(-27.747901232468262),)\t(Individual(20.2064174),) \n", "75 \t196 \t16.402088104975608 \t(np.float64(-29.137997592551308),)\t(Individual(20.2064174),) \n", "76 \t181 \t15.646764605535843 \t(np.float64(-29.596285261062537),)\t(Individual(20.2064174),) \n", "77 \t186 \t14.719840925279119 \t(np.float64(-28.81440925029369),) \t(Individual(20.2064174),) \n", "78 \t185 \t15.12467685101024 \t(np.float64(-27.90585481718537),) \t(Individual(20.2064174),) \n", "79 \t182 \t15.251717541722359 \t(np.float64(-27.672623323138854),)\t(Individual(20.2064174),) \n", "80 \t179 \t16.56551522575386 \t(np.float64(-29.12098313721662),) \t(Individual(20.2064174),) \n", "81 \t163 \t16.917145344881913 \t(np.float64(-28.021871590470568),)\t(Individual(20.2064174),) \n", "82 \t173 \t15.354695520184269 \t(np.float64(-29.12150487971027),) \t(Individual(20.2064174),) \n", "83 \t187 \t15.366260664240324 \t(np.float64(-28.716667157955122),)\t(Individual(20.2064174),) \n", "84 \t185 \t15.725928551173107 \t(np.float64(-28.201945213744487),)\t(Individual(20.2064174),) \n", "85 \t184 \t14.963546164494431 \t(np.float64(-29.759903045854962),)\t(Individual(20.2064174),) \n", "86 \t171 \t15.079081688887678 \t(np.float64(-29.37896052199045),) \t(Individual(20.2064174),) \n", "87 \t187 \t16.1884038342693 \t(np.float64(-28.596285261062537),)\t(Individual(20.2064174),) \n", "88 \t154 \t15.531034814389134 \t(np.float64(-31.839637184411554),)\t(Individual(20.2064174),) \n", "89 \t193 \t15.099320570594049 \t(np.float64(-28.827682298745387),)\t(Individual(20.2064174),) \n", "90 \t178 \t15.682603009802936 \t(np.float64(-28.04385240973668),) \t(Individual(20.2064174),) \n", "91 \t184 \t14.443454276242344 \t(np.float64(-29.51226050755041),) \t(Individual(20.2064174),) \n", "92 \t163 \t15.406766086955573 \t(np.float64(-28.32172523667017),) \t(Individual(20.2064174),) \n", "93 \t184 \t15.70473762606089 \t(np.float64(-30.728622765637432),)\t(Individual(20.2064174),) \n", "94 \t174 \t14.758743366911977 \t(np.float64(-28.080126396679844),)\t(Individual(20.2064174),) \n", "95 \t176 \t15.673778782682838 \t(np.float64(-25.837875453267422),)\t(Individual(20.2064174),) \n", "96 \t191 \t15.817237982945501 \t(np.float64(-26.672623323138854),)\t(Individual(20.2064174),) \n", "97 \t167 \t16.59541187601737 \t(np.float64(-27.297924852922783),)\t(Individual(20.2064174),) \n", "98 \t179 \t16.007766361839696 \t(np.float64(-27.529667221008353),)\t(Individual(20.2064174),) \n", "99 \t178 \t15.635593899031079 \t(np.float64(-28.672623323138854),)\t(Individual(20.2064174),) \n", "100\t183 \t16.326321312395013 \t(np.float64(-26.85993850698008),) \t(Individual(20.2064174),) \n", "Best individual: [0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0.40327918 0.22907906 0.67575091 0. 0.6553646 0.\n", " 0. 0. 0. 0. 0. 0.\n", " 0. 0. 0. 0.86200241 1. 1.\n", " 0.40371474 0.9198736 1. 1. 1. 0.25209877\n", " 1. 0.95767896 0.93137163 0.85585016 0.57441367 0.92443067\n", " 0.92182748 0.62751934 1. 1. 0.95862152 0.32737668\n", " 0.68963778 1. 1. 0. ]\n", "Best fitness: 20.20641739649888\n", "|Index |Variable |Lower Bound |Upper Bound |Current Value\n", "0 cap_el[0] 0.00 - 0.0\n", "1 cap_pv[0] 0.00 - 0.0\n", "2 pg[0,0] 0.00 - 0.0\n", "3 pg[1,0] 0.00 - 0.0\n", "4 pg[2,0] 0.00 - 0.0\n", "5 pg[3,0] 0.00 - 0.0\n", "6 pg[4,0] 0.00 - 0.0\n", "7 pg[5,0] 0.00 - 0.0\n", "8 pg[6,0] 0.00 - 0.0\n", "9 pg[7,0] 0.00 - 0.0\n", "10 pg[8,0] 0.00 - 0.0\n", "11 pg[9,0] 0.00 - 0.0\n", "12 pg[10,0] 0.00 - 0.4032791837204919\n", "13 pg[11,0] 0.00 - 0.2290790581786939\n", "14 pg[12,0] 0.00 - 0.6757509065348477\n", "15 pg[13,0] 0.00 - 0.0\n", "16 pg[14,0] 0.00 - 0.6553645974907741\n", "17 pg[15,0] 0.00 - 0.0\n", "18 pg[16,0] 0.00 - 0.0\n", "19 pg[17,0] 0.00 - 0.0\n", "20 pg[18,0] 0.00 - 0.0\n", "21 pg[19,0] 0.00 - 0.0\n", "22 pg[20,0] 0.00 - 0.0\n", "23 pg[21,0] 0.00 - 0.0\n", "24 pg[22,0] 0.00 - 0.0\n", "25 pg[23,0] 0.00 - 0.0\n", "26 pg[24,0] 0.00 - 0.0\n", "27 y[0,0] 0.00 - 0.8620024074486927\n", "28 y[1,0] 0.00 - 1.0\n", "29 y[2,0] 0.00 - 1.0\n", "30 y[3,0] 0.00 - 0.403714738937464\n", "31 y[4,0] 0.00 - 0.9198736033201538\n", "32 y[5,0] 0.00 - 1.0\n", "33 y[6,0] 0.00 - 1.0\n", "34 y[7,0] 0.00 - 1.0\n", "35 y[8,0] 0.00 - 0.25209876753173877\n", "36 y[9,0] 0.00 - 1.0\n", "37 y[10,0] 0.00 - 0.9576789637539306\n", "38 y[11,0] 0.00 - 0.9313716259297596\n", "39 y[12,0] 0.00 - 0.8558501572429695\n", "40 y[13,0] 0.00 - 0.5744136705919701\n", "41 y[14,0] 0.00 - 0.924430672302241\n", "42 y[15,0] 0.00 - 0.9218274815600159\n", "43 y[16,0] 0.00 - 0.6275193355756751\n", "44 y[17,0] 0.00 - 1.0\n", "45 y[18,0] 0.00 - 1.0\n", "46 y[19,0] 0.00 - 0.9586215169695768\n", "47 y[20,0] 0.00 - 0.32737667686114547\n", "48 y[21,0] 0.00 - 0.689637778473545\n", "49 y[22,0] 0.00 - 1.0\n", "50 y[23,0] 0.00 - 1.0\n", "51 y[24,0] 0.00 - 0.0\n" ] } ], "source": [ "model = h2.HydrogenPlantDesign(plant_template, time_config, tsdata)\n", "\n", "ret = model.check_constraints(model.x)\n", "\n", "model.optimize()\n", "model.display_variables()" ] } ], "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.12.5" } }, "nbformat": 4, "nbformat_minor": 5 }