From 0528b858c4f88b6437d0bb5c18fcdd3219865f2e Mon Sep 17 00:00:00 2001 From: Steinmann Victor <victor.steinmann@arcor.de> Date: Sun, 2 Feb 2025 22:51:03 +0100 Subject: [PATCH] tidied up functions used to express constraints --- optimierung_pymoo.ipynb | 189 +++++++++++++++++++++++++--------------- 1 file changed, 120 insertions(+), 69 deletions(-) diff --git a/optimierung_pymoo.ipynb b/optimierung_pymoo.ipynb index 6d28256..1ba4db9 100644 --- a/optimierung_pymoo.ipynb +++ b/optimierung_pymoo.ipynb @@ -58,8 +58,17 @@ "output_type": "stream", "text": [ "Defaulting to user installation because normal site-packages is not writeable\n", - "Requirement already satisfied: pyomo in c:\\users\\steinmann\\appdata\\roaming\\python\\python312\\site-packages (6.8.2)\n", - "Requirement already satisfied: ply in c:\\users\\steinmann\\appdata\\roaming\\python\\python312\\site-packages (from pyomo) (3.11)\n" + "Collecting pyomo\n", + " Downloading Pyomo-6.8.2-py3-none-any.whl.metadata (8.0 kB)\n", + "Collecting ply (from pyomo)\n", + " Downloading ply-3.11-py2.py3-none-any.whl.metadata (844 bytes)\n", + "Downloading Pyomo-6.8.2-py3-none-any.whl (3.7 MB)\n", + " ---------------------------------------- 0.0/3.7 MB ? eta -:--:--\n", + " ---------------------------- ----------- 2.6/3.7 MB 12.6 MB/s eta 0:00:01\n", + " ---------------------------------------- 3.7/3.7 MB 11.6 MB/s eta 0:00:00\n", + "Downloading ply-3.11-py2.py3-none-any.whl (49 kB)\n", + "Installing collected packages: ply, pyomo\n", + "Successfully installed ply-3.11 pyomo-6.8.2\n" ] }, { @@ -67,8 +76,8 @@ "output_type": "stream", "text": [ "\n", - "[notice] A new release of pip is available: 24.2 -> 25.0\n", - "[notice] To update, run: C:\\Program Files\\Python312\\python.exe -m pip install --upgrade pip\n" + "[notice] A new release of pip is available: 24.3.1 -> 25.0\n", + "[notice] To update, run: C:\\Users\\Victor\\AppData\\Local\\Microsoft\\WindowsApps\\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\\python.exe -m pip install --upgrade pip\n" ] } ], @@ -78,7 +87,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -108,7 +117,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -164,7 +173,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -174,7 +183,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -207,17 +216,9 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{None: {'nodes': ['source', 'pump1', 'pump2', 'valveA', 'valveB', 'valveC'], 'pumps': ['pump1', 'pump2'], 'valves': ['valveA', 'valveB', 'valveC'], 'Q_valve': {'valveA': 1.0, 'valveB': 1.0, 'valveC': 2.0}}}\n" - ] - } - ], + "outputs": [], "source": [ "#defining abstract modell for given Network\n", "import pyomo.environ as pyo\n", @@ -237,23 +238,21 @@ "\n", "#Optimierungsvariable\n", "modell.n = pyo.Var(modell.pumps,bounds=(750/3600,1))\n", - "modell.Q = pyo.Var(modell.nodes)\n", + "modell.Q = pyo.Var(modell.nodes,bounds=(0.,10.))\n", "\n", "#expressions for constraints:\n", "def PumpFlow(modell,pump):\n", - " return np.dot(np.array([modell.Q[pump]**2,modell.n[pump]*modell.Q[pump],modell.n[pump]**2]),LR_H.coef_)\n", + " return pyo.summation(np.array([modell.Q[pump]**2, modell.n[pump]*modell.Q[pump], modell.n[pump]**2]),LR_H.coef_,index=[0,1,2])\n", "def Pump_delivery_req(modell,pump):\n", " return PumpFlow(modell,pump) ==pyo.summation(modell.Q,index=graph.successors(pump))\n", "\n", - "\n", "def valve_req_rule(modell,valve):\n", " return modell.Q[valve]>=modell.Q_valve[valve]\n", "\n", - "#modell.Flow_Objective = pyo.Objective(modell.pumps,rule=Flow_req,sense=pyo.minimize)\n", - "\n", - "#Constaints\n", - "def continuityRule(modell,node):\n", - " return pyo.summation(modell.Q, index=graph.predecessors(node))==pyo.summation(modell.Q, index=graph.successors(node))\n", + "def continuity_inflow(modell,node):\n", + " return modell.Q[node]==pyo.summation(modell.Q, index=graph.successors(node))\n", + "def continuity_outflow(modell,node):\n", + " return modell.Q[node]==pyo.summation(modell.Q,index=graph.predecessors(node))\n", "\n", "#Objective\n", "def PumpPower(modell):\n", @@ -262,18 +261,7 @@ " [modell.Q[i]**3,(modell.Q[i]**2)*modell.n[i],modell.Q[i]*modell.n[i]**2,modell.n[i]**3]\n", " ),LR_P.coef_\n", " ) for i in modell.pumps)\n", - "modell.Power_Objective = pyo.Objective(rule=PumpPower,sense=pyo.minimize)\n", - "\n", - "TestData={\n", - " None:{\n", - " \n", - " 'nodes':[key for key in graph.nodes.keys()],\n", - " 'pumps':[key for key in graph.nodes.keys() if 'pump' in key],\n", - " 'valves':[key for key in graph.nodes.keys() if 'valve' in key],\n", - " 'Q_valve':{'valveA':1.,'valveB':1.,'valveC':2.},\n", - " }\n", - "}\n", - "print(TestData)" + "modell.Power_Objective = pyo.Objective(rule=PumpPower,sense=pyo.minimize)" ] }, { @@ -289,79 +277,142 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 87, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "SCIP version 9.2.0 [precision: 8 byte] [memory: block] [mode: optimized] [LP solver: Soplex 7.1.2] [GitHash: 74cea9222e]\n", - "Copyright (c) 2002-2024 Zuse Institute Berlin (ZIB)\n", + "SCIP version 9.2.1 [precision: 8 byte] [memory: block] [mode: optimized] [LP solver: Soplex 7.1.3] [GitHash: 0d2d3c7c2d]\n", + "Copyright (c) 2002-2025 Zuse Institute Berlin (ZIB)\n", "\n", "External libraries: \n", - " Soplex 7.1.2 Linear Programming Solver developed at Zuse Institute Berlin (soplex.zib.de) [GitHash: b040369c]\n", + " Soplex 7.1.3 Linear Programming Solver developed at Zuse Institute Berlin (soplex.zib.de) [GitHash: 60fd96f2]\n", " CppAD 20180000.0 Algorithmic Differentiation of C++ algorithms developed by B. Bell (github.com/coin-or/CppAD)\n", " TinyCThread 1.2 small portable implementation of the C11 threads API (tinycthread.github.io)\n", " MPIR 3.0.0 Multiple Precision Integers and Rationals Library developed by W. Hart (mpir.org)\n", " ZIMPL 3.6.2 Zuse Institute Mathematical Programming Language developed by T. Koch (zimpl.zib.de)\n", " AMPL/MP 690e9e7 AMPL .nl file reader library (github.com/ampl/mp)\n", - " PaPILO 2.4.0 parallel presolve for integer and linear optimization (github.com/scipopt/papilo) (built with TBB) [GitHash: 2d9fe29f]\n", + " PaPILO 2.4.1 parallel presolve for integer and linear optimization (github.com/scipopt/papilo) (built with TBB) [GitHash: 11974394]\n", " Nauty 2.8.8 Computing Graph Automorphism Groups by Brendan D. McKay (users.cecs.anu.edu.au/~bdm/nauty)\n", " sassy 1.1 Symmetry preprocessor by Markus Anders (github.com/markusa4/sassy)\n", " Ipopt 3.14.16 Interior Point Optimizer developed by A. Waechter et.al. (github.com/coin-or/Ipopt)\n", "\n", "user parameter file <scip.set> not found - using default parameters\n", - "read problem <C:\\Users\\STEINM~1\\AppData\\Local\\Temp\\tmprv0ikbwh.pyomo.nl>\n", + "read problem <C:\\Users\\Victor\\AppData\\Local\\Temp\\tmpfcunk5gi.pyomo.nl>\n", "============\n", "\n", - "original problem has 9 variables (0 bin, 0 int, 0 impl, 9 cont) and 12 constraints\n", + "original problem has 8 variables (0 bin, 0 int, 0 impl, 8 cont) and 6 constraints\n", "\n", "solve problem\n", "=============\n", "\n", "presolving:\n", - "(round 1, fast) 2 del vars, 6 del conss, 0 add conss, 12 chg bounds, 0 chg sides, 0 chg coeffs, 0 upgd conss, 0 impls, 0 clqs\n", - "presolving (2 rounds: 2 fast, 0 medium, 0 exhaustive):\n", - " 2 deleted vars, 6 deleted constraints, 0 added constraints, 16 tightened bounds, 0 added holes, 0 changed sides, 0 changed coefficients\n", + "(round 1, fast) 0 del vars, 3 del conss, 0 add conss, 11 chg bounds, 0 chg sides, 0 chg coeffs, 0 upgd conss, 0 impls, 0 clqs\n", + " (0.0s) symmetry computation started: requiring (bin +, int +, cont +), (fixed: bin -, int -, cont -)\n", + " (0.0s) symmetry computation finished: 1 generators found (max: 1500, log10 of symmetry group size: 0.0) (symcode time: 0.00)\n", + "dynamic symmetry handling statistics:\n", + " orbitopal reduction: no components\n", + " orbital reduction: no components\n", + " lexicographic reduction: no permutations\n", + "handled 1 out of 1 symmetry components\n", + "(round 2, exhaustive) 0 del vars, 3 del conss, 1 add conss, 11 chg bounds, 0 chg sides, 0 chg coeffs, 0 upgd conss, 0 impls, 0 clqs\n", + "presolving (3 rounds: 3 fast, 2 medium, 2 exhaustive):\n", + " 0 deleted vars, 3 deleted constraints, 0 added constraints, 11 tightened bounds, 0 added holes, 0 changed sides, 0 changed coefficients\n", " 0 implications, 0 cliques\n", - "presolving detected infeasibility\n", + "presolved problem has 8 variables (0 bin, 0 int, 0 impl, 8 cont) and 4 constraints\n", + " 1 constraints of type <linear>\n", + " 3 constraints of type <nonlinear>\n", "Presolving Time: 0.00\n", "\n", - "SCIP Status : problem is solved [infeasible]\n", + " time | node | left |LP iter|LP it/n|mem/heur|mdpt |vars |cons |rows |cuts |sepa|confs|strbr| dualbound | primalbound | gap | compl. \n", + " 0.0s| 1 | 0 | 22 | - | 914k | 0 | 25 | 4 | 36 | 0 | 0 | 0 | 0 |-3.474607e+01 | -- | Inf | unknown\n", + "L 0.0s| 1 | 0 | 22 | - | subnlp| 0 | 25 | 4 | 36 | 0 | 0 | 0 | 0 |-3.474607e+01 | 1.151406e+01 | Inf | unknown\n", + " 0.0s| 1 | 0 | 22 | - | 914k | 0 | 25 | 4 | 36 | 0 | 0 | 0 | 0 |-3.474607e+01 | 1.151406e+01 | Inf | unknown\n", + " 0.0s| 1 | 0 | 22 | - | 914k | 0 | 25 | 4 | 36 | 0 | 0 | 0 | 0 |-3.474607e+01 | 1.151406e+01 | Inf | unknown\n", + " 0.0s| 1 | 0 | 26 | - | 920k | 0 | 25 | 4 | 39 | 3 | 1 | 0 | 0 |-1.963132e+01 | 1.151406e+01 | Inf | unknown\n", + " 0.0s| 1 | 0 | 26 | - | 920k | 0 | 25 | 4 | 39 | 3 | 1 | 0 | 0 |-1.963132e+01 | 1.151406e+01 | Inf | unknown\n", + " 0.0s| 1 | 0 | 30 | - | 935k | 0 | 25 | 4 | 42 | 6 | 2 | 0 | 0 |-1.885311e+01 | 1.151406e+01 | Inf | unknown\n", + " 0.0s| 1 | 0 | 33 | - | 939k | 0 | 25 | 4 | 45 | 9 | 3 | 0 | 0 |-1.766937e+01 | 1.151406e+01 | Inf | unknown\n", + " 0.0s| 1 | 0 | 33 | - | 939k | 0 | 25 | 4 | 45 | 9 | 3 | 0 | 0 |-1.766937e+01 | 1.151406e+01 | Inf | unknown\n", + " 0.0s| 1 | 0 | 36 | - | 939k | 0 | 25 | 4 | 47 | 11 | 4 | 0 | 0 |-1.728948e+01 | 1.151406e+01 | Inf | unknown\n", + " 0.0s| 1 | 0 | 37 | - | 941k | 0 | 25 | 4 | 48 | 12 | 5 | 0 | 0 |-1.712829e+01 | 1.151406e+01 | Inf | unknown\n", + " 0.0s| 1 | 0 | 38 | - | 941k | 0 | 25 | 4 | 49 | 13 | 6 | 0 | 0 |-1.701866e+01 | 1.151406e+01 | Inf | unknown\n", + " 0.0s| 1 | 0 | 39 | - | 943k | 0 | 25 | 4 | 50 | 14 | 7 | 0 | 0 |-1.701746e+01 | 1.151406e+01 | Inf | unknown\n", + " 0.0s| 1 | 0 | 41 | - | 951k | 0 | 25 | 4 | 52 | 16 | 8 | 0 | 0 |-1.695801e+01 | 1.151406e+01 | Inf | unknown\n", + " 0.0s| 1 | 0 | 332 | - | 957k | 0 | 25 | 4 | 52 | 16 | 9 | 0 | 0 | 1.150982e+01 | 1.151406e+01 | 0.04%| unknown\n", + " time | node | left |LP iter|LP it/n|mem/heur|mdpt |vars |cons |rows |cuts |sepa|confs|strbr| dualbound | primalbound | gap | compl. \n", + " 0.0s| 1 | 0 | 334 | - | 957k | 0 | 25 | 4 | 54 | 18 | 10 | 0 | 0 | 1.150982e+01 | 1.151406e+01 | 0.04%| unknown\n", + " 0.0s| 1 | 0 | 346 | - | 957k | 0 | 25 | 4 | 37 | 20 | 11 | 0 | 0 | 1.151405e+01 | 1.151406e+01 | 0.00%| unknown\n", + " 0.0s| 1 | 0 | 346 | - | 957k | 0 | 25 | 4 | 20 | 20 | 11 | 0 | 0 | 1.151405e+01 | 1.151406e+01 | 0.00%| unknown\n", + " 0.0s| 1 | 0 | 347 | - | 957k | 0 | 25 | 4 | 21 | 21 | 12 | 0 | 0 | 1.151406e+01 | 1.151406e+01 | 0.00%| unknown\n", + "L 0.0s| 1 | 0 | 347 | - | subnlp| 0 | 25 | 4 | 21 | 21 | 13 | 0 | 0 | 1.151406e+01 | 1.151406e+01 | 0.00%| unknown\n", + " 0.0s| 1 | 0 | 347 | - | 958k | 0 | 25 | 4 | 21 | 21 | 13 | 0 | 0 | 1.151406e+01 | 1.151406e+01 | 0.00%| unknown\n", + "* 0.0s| 1 | 0 | 347 | - | LP | 0 | 25 | 4 | 21 | 21 | 14 | 0 | 0 | 1.151406e+01 | 1.151406e+01 | 0.00%| unknown\n", + "\n", + "SCIP Status : problem is solved [optimal solution found]\n", "Solving Time (sec) : 0.00\n", - "Solving Nodes : 0\n", - "Primal Bound : +1.00000000000000e+20 (0 solutions)\n", - "Dual Bound : +1.00000000000000e+20\n", + "Solving Nodes : 1\n", + "Primal Bound : +1.15140564709997e+01 (3 solutions)\n", + "Dual Bound : +1.15140564709997e+01\n", "Gap : 0.00 %\n", - "WARNING: Loading a SolverResults object with a warning status into\n", - "model.name=\"unknown\";\n", - " - termination condition: infeasible\n", - " - message from solver: infeasible\n", + "\n", + "Problem: \n", + "- Lower bound: -inf\n", + " Upper bound: inf\n", + " Number of objectives: 1\n", + " Number of constraints: 0\n", + " Number of variables: 7\n", + " Sense: unknown\n", + "Solver: \n", + "- Status: ok\n", + " Message: optimal solution found\n", + " Termination condition: optimal\n", + " Id: 0\n", + " Error rc: 0\n", + " Time: 0.3383963108062744\n", + "Solution: \n", + "- number of solutions: 0\n", + " number of solutions displayed: 0\n", + "\n", "n : Size=2, Index=pumps\n", - " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", - " pump1 : 0.20833333333333334 : None : 1 : False : True : Reals\n", - " pump2 : 0.20833333333333334 : None : 1 : False : True : Reals\n", + " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", + " pump1 : 0.20833333333333334 : 0.34519801810114614 : 1 : False : False : Reals\n", + " pump2 : 0.20833333333333334 : 0.4881837415314729 : 1 : False : False : Reals\n", "Q : Size=6, Index=nodes\n", " Key : Lower : Value : Upper : Fixed : Stale : Domain\n", - " pump1 : None : None : None : False : True : Reals\n", - " pump2 : None : None : None : False : True : Reals\n", - " source : None : None : None : False : True : Reals\n", - " valveA : None : None : None : False : True : Reals\n", - " valveB : None : None : None : False : True : Reals\n", - " valveC : None : None : None : False : True : Reals\n" + " pump1 : 0.0 : 0.0 : 10.0 : False : False : Reals\n", + " pump2 : 0.0 : 0.0 : 10.0 : False : False : Reals\n", + " source : 0.0 : None : 10.0 : False : True : Reals\n", + " valveA : 0.0 : 1.0 : 10.0 : False : False : Reals\n", + " valveB : 0.0 : 1.0 : 10.0 : False : False : Reals\n", + " valveC : 0.0 : 1.0 : 10.0 : False : False : Reals\n" ] } ], "source": [ "from pyomo.opt import SolverFactory\n", "\n", - "opt = pyo.SolverFactory('scipampl', executable=r'C:\\Program Files\\SCIPOptSuite 9.2.0\\bin\\scip.exe')\n", + "TestData={\n", + " None:{\n", + " \n", + " 'nodes':[key for key in graph.nodes.keys()],\n", + " 'pumps':[key for key in graph.nodes.keys() if 'pump' in key],\n", + " 'valves':[key for key in graph.nodes.keys() if 'valve' in key],\n", + " 'Q_valve':{'valveA':1.,'valveB':1.,'valveC':1.},\n", + " \n", + " }\n", + "}\n", + "\n", + "opt = pyo.SolverFactory('scipampl', executable=r'C:\\Program Files\\SCIPOptSuite 9.2.1\\bin\\scip.exe')\n", "instance = modell.create_instance(TestData)\n", - "instance.Continuity_constaint=pyo.Constraint(instance.nodes, rule=continuityRule)\n", "instance.Flow_constraint=pyo.Constraint(instance.valves,rule=valve_req_rule)\n", "instance.pump_Flow_constraint=pyo.Constraint(instance.pumps,rule=Pump_delivery_req)\n", + "#instance.flow_constraint=pyo.Constraint(instance.nodes,rule=continuity_inflow)\n", + "#instance.flow_constraint=pyo.Constraint(instance.nodes,rule=continuity_outflow)\n", "result=opt.solve(instance, tee=True)\n", + "print(result)\n", "instance.n.pprint()\n", "instance.Q.pprint()\n" ] @@ -383,7 +434,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.5" + "version": "3.12.8" } }, "nbformat": 4, -- GitLab