{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Multipurpose Fermentation Plant (not finished)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Problem Statement\n", "\n", "A few months ago you were given process development responsibilities for a start-up company that is attempting to commercialize a novel fermentation technology. The fermentation produces high-value medicinal products based on an engineered micro-organism. \n", "\n", "During you short time on the job, you have already developed and commissioned a pilot plant comprised of the following basic operations:\n", "\n", "\n", "Enzymatic digestion of the fermentation substrate. This operation requires a feed of 20% substrate (S), 79% water (W), and 1% enzyme (E). The digestion requires 1 working day to complete all steps. Assume the substrate costs $2/kg, the enzyme is $20/kg, and water is essentially free. You acquired a mixer/blender unit for this purpose that can operate on any quantity up to 100 kg. The product of the digestion operation is called the “wort”. To avoid contamination of the process, wort cannot be stored before use. \n", "Digestion is followed by fermentation. The fermentation requires four working day for completion upon which the substrate is entirely consumed. For this operation, you purchased a 100 liter (kg) fermentor that is working quite well. The product is an unseparated turbid suspension that is 20% solids.\n", "A batch filtration operation separate the turbid suspension into a clarified intermediate product called “beer” (80%) and a solid by-product (20%) that can be sold for $2/kg. The filtration device you purchased can handle 100 kg/batch. But the operation has turned out to be messy with frequent equipment breakdown. For planning purposes, you can plan on both products to be ready in 1 working day, but need to plan for additional working day for cleanup and maintenance of the equipment.\n", "Following coarse filtration, a novel selective membrane separator is used to separate the beer into a product (P) valued at $200/kg and a contaminated waste-water stream that costs $2/kg to dispose. The product recovery is 5 mass % of the incoming liquid. The membrane separator was designed to handle 100 kg/day.\n", "\n", "Assignment Part I. (You can do this part by hand. Due 9/22)\n", "\n", "Create a State-Task Network describing the pilot plant operation as it exists today. \n", "What is the minimum time needed to produce the first batch of product? Sketch a Gantt chart to illustrate your analysis.\n", "Does the process generate a profit or loss? How much per batch?\n", "What is the minimum cycle time for the process? Sketch a Gantt chart to show your reasoning. \n", "Where is the bottleneck in this process? What piece of equipment would recommend? How big does it need to be to completely remove the bottleneck? Show the results in form of a Gantt chart.\n", "\n", "Assignment Part II. (Use the Python/Pyomo model to solve this part, Due 9/29.)\n", "\n", "Life is turning out pretty well for this start-up company. \n", "\n", "The good news is that that pilot plant has convinced customers of the value of your product. Furthermore, the R&D team has come up with a second organism that produces an even more valuable product valued at $500/kg, but otherwise follows the same recipe and can use the same equipment provided you add one day of cleanup after any use of the fermentors. Because the market is uncertain, the company wants to hedge risk by producing equal amounts of both products for continued customer testing.\n", "\n", "The small piece of bad news is that wastewater treatment charges have gone up to $8/kg which seriously cuts into the process economics. You could, however, address this issue with a batch water treatment device which can recycle 50% of the water for reuse.\n", "\n", "Given these changes, you have now been authorized to purchase additional equipment for the pilot plant. You decide to add an additional fermentor which can be any size needed, to add an additional 100 kg coarse filtration device that doesn’t require the extra day of cleanup and maintenance after use, and a new water treatment unit with a capacity of 200 kg/day.\n", "\n", "Create a new State-Task Network diagram that includes production of the second fermentation product and provides for waste-water recycle. \n", "Determine a size for additional fermentor that avoids bottlenecking the operation. How much profit can be expected in 14 days of operation?\n", "Would it be beneficial to add a third fermentor?\n", "\n", " \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Encoding the STN data\n", "\n", "The basic data structure specifies the states, tasks, and units comprising a state-task network. The intention is for all relevant problem data to be contained in a single JSON-like structure." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "H = 14\n", "\n", "Part1 = {\n", " 'TIME': range(0,H+1),\n", " 'STATES': {\n", " 'Enzyme' : {'capacity': 500, 'initial': 500, 'price': 20},\n", " 'Substrate' : {'capacity': 500, 'initial': 500, 'price': 2},\n", " 'Water' : {'capacity': 500, 'initial': 500, 'price': 0},\n", " 'Wort' : {'capacity': 0, 'initial': 0, 'price': 0},\n", " 'TurbidS' : {'capacity': 100, 'initial': 0, 'price': 0},\n", " 'Beer' : {'capacity': 100, 'initial': 0, 'price': 0},\n", " 'SBP' : {'capacity': 500, 'initial': 0, 'price': 2},\n", " 'Product' : {'capacity': 500, 'initial': 0, 'price': 200},\n", " 'WasteW' : {'capacity': 500, 'initial': 0, 'price': -2},\n", " },\n", " 'ST_ARCS': {\n", " ('Enzyme', 'Digestion' ): {'rho': 0.01},\n", " ('Substrate', 'Digestion' ): {'rho': 0.20},\n", " ('Water', 'Digestion' ): {'rho': 0.79},\n", " ('Wort', 'Fermentation'): {'rho': 1.00},\n", " ('TurbidS', 'Filtration' ): {'rho': 1.00},\n", " ('Beer', 'Separation' ): {'rho': 1.00},\n", " },\n", " 'TS_ARCS': {\n", " ('Digestion', 'Wort') : {'dur': 1, 'rho': 1.0},\n", " ('Fermentation', 'TurbidS') : {'dur': 4, 'rho': 1.0},\n", " ('Filtration', 'Beer') : {'dur': 1, 'rho': 0.8},\n", " ('Filtration', 'SBP') : {'dur': 1, 'rho': 0.2},\n", " ('Separation', 'Product') : {'dur': 1, 'rho': 0.05},\n", " ('Separation', 'WasteW') : {'dur': 1, 'rho': 0.95},\n", " },\n", " 'UNIT_TASKS': {\n", " ('Blender', 'Digestion') : {'Bmin': 0, 'Bmax': 100, 'Cost': 1, 'vCost': 0, 'Tclean': 0},\n", " ('Fermentor', 'Fermentation'): {'Bmin': 0, 'Bmax': 100, 'Cost': 1, 'vCost': 0, 'Tclean': 0},\n", " ('Filter', 'Filtration') : {'Bmin': 0, 'Bmax': 100, 'Cost': 1, 'vCost': 0, 'Tclean': 1},\n", " ('MembraneS', 'Separation') : {'Bmin': 0, 'Bmax': 100, 'Cost': 1, 'vCost': 0, 'Tclean': 0},\n", " },\n", "}" ] }, { "cell_type": "code", "execution_count": 419, "metadata": { "collapsed": true }, "outputs": [], "source": [ "H = 14\n", "\n", "Part2 = {\n", " 'TIME': range(0,H+1),\n", " 'STATES': {\n", " 'Enzyme' : {'capacity': 500, 'initial': 500, 'price': 20},\n", " 'Substrate' : {'capacity': 500, 'initial': 500, 'price': 2},\n", " 'Water' : {'capacity': 500, 'initial': 500, 'price': 0},\n", " 'Wort' : {'capacity': 0, 'initial': 0, 'price': 0},\n", " 'TurbidS_1' : {'capacity': 100, 'initial': 0, 'price': 0},\n", " 'Beer_1' : {'capacity': 100, 'initial': 0, 'price': 0},\n", " 'SBP' : {'capacity': 500, 'initial': 0, 'price': 2},\n", " 'Product_1' : {'capacity': 500, 'initial': 0, 'price': 200},\n", " 'TurbidS_2' : {'capacity': 100, 'initial': 0, 'price': 0},\n", " 'Beer_2' : {'capacity': 100, 'initial': 0, 'price': 0},\n", " 'Product_2' : {'capacity': 500, 'initial': 0, 'price': 500},\n", " 'RawWasteW' : {'capacity': 500, 'initial': 0, 'price': -8},\n", " 'WasteWater': {'capacity': 500, 'initial': 0, 'price': -8},\n", " },\n", " 'ST_ARCS': {\n", " ('Enzyme', 'Digestion' ): {'rho': 0.01},\n", " ('Substrate', 'Digestion' ): {'rho': 0.20},\n", " ('Water', 'Digestion' ): {'rho': 0.79},\n", " ('Wort', 'Fermentation_1'): {'rho': 1.00},\n", " ('TurbidS_1', 'Filtration_1' ): {'rho': 1.00},\n", " ('Beer_1', 'Separation_1' ): {'rho': 1.00},\n", " ('Wort', 'Fermentation_2'): {'rho': 1.00},\n", " ('TurbidS_2', 'Filtration_2' ): {'rho': 1.00},\n", " ('Beer_2', 'Separation_2' ): {'rho': 1.00},\n", " ('RawWasteW', 'WaterTreat') : {'rho': 1.00},\n", " },\n", " 'TS_ARCS': {\n", " ('Digestion', 'Wort') : {'dur': 1, 'rho': 1.0},\n", " ('Fermentation_1', 'TurbidS_1') : {'dur': 4, 'rho': 1.0},\n", " ('Filtration_1', 'Beer_1') : {'dur': 1, 'rho': 0.8},\n", " ('Filtration_1', 'SBP') : {'dur': 1, 'rho': 0.2},\n", " ('Separation_1', 'Product_1') : {'dur': 1, 'rho': 0.05},\n", " ('Separation_1', 'RawWasteW') : {'dur': 1, 'rho': 0.95},\n", " ('Fermentation_2', 'TurbidS_2') : {'dur': 4, 'rho': 1.0},\n", " ('Filtration_2', 'Beer_2') : {'dur': 1, 'rho': 0.8},\n", " ('Filtration_2', 'SBP') : {'dur': 1, 'rho': 0.2},\n", " ('Separation_2', 'Product_2') : {'dur': 1, 'rho': 0.05},\n", " ('Separation_2', 'RawWasteW') : {'dur': 1, 'rho': 0.95},\n", " ('WaterTreat', 'Water') : {'dur': 1, 'rho': 0.50},\n", " ('WaterTreat', 'WasteWater') : {'dur': 1, 'rho': 0.50},\n", " },\n", " 'UNIT_TASKS': {\n", " ('Blender', 'Digestion') : {'Bmin': 0, 'Bmax': 100, 'Cost': 1, 'vCost': 0, 'Tclean': 0},\n", " ('Fermentor_1', 'Fermentation_1'): {'Bmin': 0, 'Bmax': 100, 'Cost': 1, 'vCost': 0, 'Tclean': 1},\n", " ('Fermentor_2', 'Fermentation_1'): {'Bmin': 0, 'Bmax': 100, 'Cost': 1, 'vCost': 0, 'Tclean': 1},\n", " ('Fermentor_3', 'Fermentation_1'): {'Bmin': 0, 'Bmax': 100, 'Cost': 1, 'vCost': 0, 'Tclean': 1},\n", " ('Filter_1', 'Filtration_1') : {'Bmin': 0, 'Bmax': 100, 'Cost': 1, 'vCost': 0, 'Tclean': 1},\n", " ('Filter_2', 'Filtration_1') : {'Bmin': 0, 'Bmax': 100, 'Cost': 1, 'vCost': 0, 'Tclean': 0},\n", " ('MembraneS', 'Separation_1') : {'Bmin': 0, 'Bmax': 100, 'Cost': 1, 'vCost': 0, 'Tclean': 0},\n", " ('Fermentor_1', 'Fermentation_2'): {'Bmin': 0, 'Bmax': 100, 'Cost': 1, 'vCost': 0, 'Tclean': 1},\n", " ('Fermentor_2', 'Fermentation_2'): {'Bmin': 0, 'Bmax': 100, 'Cost': 1, 'vCost': 0, 'Tclean': 1},\n", " ('Fermentor_3', 'Fermentation_2'): {'Bmin': 0, 'Bmax': 100, 'Cost': 1, 'vCost': 0, 'Tclean': 1},\n", " ('Filter_1', 'Filtration_2') : {'Bmin': 0, 'Bmax': 100, 'Cost': 1, 'vCost': 0, 'Tclean': 1},\n", " ('Filter_2', 'Filtration_2') : {'Bmin': 0, 'Bmax': 100, 'Cost': 1, 'vCost': 0, 'Tclean': 0},\n", " ('MembraneS', 'Separation_2') : {'Bmin': 0, 'Bmax': 100, 'Cost': 1, 'vCost': 0, 'Tclean': 0},\n", " ('RO_System', 'WaterTreat') : {'Bmin': 0, 'Bmax': 200, 'Cost': 1, 'vCost': 0, 'Tclean': 0},\n", " },\n", "}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Characterization of Tasks" ] }, { "cell_type": "code", "execution_count": 420, "metadata": { "collapsed": true }, "outputs": [], "source": [ "STN = Part2\n", "\n", "STATES = STN['STATES']\n", "ST_ARCS = STN['ST_ARCS']\n", "TS_ARCS = STN['TS_ARCS']\n", "UNIT_TASKS = STN['UNIT_TASKS']\n", "TIME = STN['TIME']\n", "H = max(TIME)" ] }, { "cell_type": "code", "execution_count": 421, "metadata": { "collapsed": true }, "outputs": [], "source": [ "TASKS = set([i for (j,i) in UNIT_TASKS]) # set of all tasks \n", "\n", "S = {i: set() for i in TASKS} # S[i] input set of states which feed task i\n", "for (s,i) in ST_ARCS:\n", " S[i].add(s)\n", "\n", "S_ = {i: set() for i in TASKS} # S_[i] output set of states fed by task i\n", "for (i,s) in TS_ARCS:\n", " S_[i].add(s)\n", "\n", "rho = {(i,s): ST_ARCS[(s,i)]['rho'] for (s,i) in ST_ARCS} # rho[(i,s)] input fraction of task i from state s\n", "\n", "rho_ = {(i,s): TS_ARCS[(i,s)]['rho'] for (i,s) in TS_ARCS} # rho_[(i,s)] output fraction of task i to state s\n", "\n", "P = {(i,s): TS_ARCS[(i,s)]['dur'] for (i,s) in TS_ARCS} # P[(i,s)] time for task i output to state s \n", "\n", "p = {i: max([P[(i,s)] for s in S_[i]]) for i in TASKS} # p[i] completion time for task i\n", "\n", "K = {i: set() for i in TASKS} # K[i] set of units capable of task i\n", "for (j,i) in UNIT_TASKS:\n", " K[i].add(j) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Characterization of States" ] }, { "cell_type": "code", "execution_count": 422, "metadata": { "collapsed": true }, "outputs": [], "source": [ "T = {s: set() for s in STATES} # T[s] set of tasks receiving material from state s \n", "for (s,i) in ST_ARCS:\n", " T[s].add(i)\n", "\n", "T_ = {s: set() for s in STATES} # set of tasks producing material for state s\n", "for (i,s) in TS_ARCS:\n", " T_[s].add(i)\n", "\n", "C = {s: STATES[s]['capacity'] for s in STATES} # C[s] storage capacity for state s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Characterization of Units" ] }, { "cell_type": "code", "execution_count": 423, "metadata": { "collapsed": true }, "outputs": [], "source": [ "UNITS = set([j for (j,i) in UNIT_TASKS])\n", "\n", "I = {j: set() for j in UNITS} # I[j] set of tasks performed with unit j\n", "for (j,i) in UNIT_TASKS:\n", " I[j].add(i)\n", "\n", "Bmax = {(i,j):UNIT_TASKS[(j,i)]['Bmax'] for (j,i) in UNIT_TASKS} # Bmax[(i,j)] maximum capacity of unit j for task i\n", "Bmin = {(i,j):UNIT_TASKS[(j,i)]['Bmin'] for (j,i) in UNIT_TASKS} # Bmin[(i,j)] minimum capacity of unit j for task i" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Pyomo Model" ] }, { "cell_type": "code", "execution_count": 424, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# ==========================================================\n", "# = Solver Results =\n", "# ==========================================================\n", "# ----------------------------------------------------------\n", "# Problem Information\n", "# ----------------------------------------------------------\n", "Problem: \n", "- Name: x2238\n", " Lower bound: 17126.0\n", " Upper bound: 17127.3\n", " Number of objectives: 1\n", " Number of constraints: 1062\n", " Number of variables: 738\n", " Number of binary variables: 210\n", " Number of integer variables: 210\n", " Number of continuous variables: 528\n", " Number of nonzeros: 3106\n", " Sense: maximize\n", "# ----------------------------------------------------------\n", "# Solver Information\n", "# ----------------------------------------------------------\n", "Solver: \n", "- Status: ok\n", " Return code: 0\n", " Message: Model was solved to optimality (subject to tolerances), and an optimal solution is available.\n", " Termination condition: optimal\n", " Termination message: Model was solved to optimality (subject to tolerances), and an optimal solution is available.\n", " Wall time: 0.021910905838\n", " Error rc: 0\n", " Time: 0.09975719451904297\n", "# ----------------------------------------------------------\n", "# Solution Information\n", "# ----------------------------------------------------------\n", "Solution: \n", "- number of solutions: 0\n", " number of solutions displayed: 0\n" ] } ], "source": [ "from pyomo.environ import *\n", "import numpy as np\n", "\n", "TIME = np.array(TIME)\n", "\n", "model = ConcreteModel()\n", "\n", "model.W = Var(TASKS, UNITS, TIME, domain=Boolean) # W[i,j,t] 1 if task i starts in unit j at time t\n", "model.B = Var(TASKS, UNITS, TIME, domain=NonNegativeReals) # B[i,j,t,] size of batch assigned to task i in unit j at time t\n", "model.S = Var(STATES.keys(), TIME, domain=NonNegativeReals) # S[s,t] inventory of state s at time t\n", "model.Q = Var(UNITS, TIME, domain=NonNegativeReals) # Q[j,t] inventory of unit j at time t\n", "model.Cost = Var(domain=NonNegativeReals)\n", "model.Value = Var(domain=NonNegativeReals)\n", "\n", "# Objective is to maximize the value of the final state (see Kondili, Sec. 5)\n", "model.Obj = Objective(expr = model.Value - model.Cost, sense = maximize)\n", "\n", "# Constraints\n", "model.cons = ConstraintList()\n", "model.cons.add(model.Value == sum([STATES[s]['price']*model.S[s,H] for s in STATES]))\n", "model.cons.add(model.Cost == sum([UNIT_TASKS[(j,i)]['Cost']*model.W[i,j,t] +\n", " UNIT_TASKS[(j,i)]['vCost']*model.B[i,j,t] for i in TASKS for j in K[i] for t in TIME])) \n", "\n", "# unit constraints\n", "for j in UNITS:\n", " rhs = 0\n", " for t in TIME:\n", " # a unit can only be allocated to one task \n", " lhs = 0\n", " for i in I[j]:\n", " for tprime in TIME:\n", " if tprime >= (t-p[i]+1-UNIT_TASKS[(j,i)]['Tclean']) and tprime <= t:\n", " lhs += model.W[i,j,tprime]\n", " model.cons.add(lhs <= 1)\n", "\n", " # capacity constraints (see Konkili, Sec. 3.1.2)\n", " for i in I[j]:\n", " model.cons.add(model.W[i,j,t]*Bmin[i,j] <= model.B[i,j,t])\n", " model.cons.add(model.B[i,j,t] <= model.W[i,j,t]*Bmax[i,j])\n", "\n", " # unit mass balance\n", " rhs += sum([model.B[i,j,t] for i in I[j]])\n", " for i in I[j]:\n", " for s in S_[i]:\n", " if t >= P[(i,s)]:\n", " rhs -= rho_[(i,s)]*model.B[i,j,max(TIME[TIME <= t-P[(i,s)]])]\n", " model.cons.add(model.Q[j,t] == rhs)\n", " rhs = model.Q[j,t]\n", " \n", " # terminal condition \n", " model.cons.add(model.Q[j,H] == 0)\n", "\n", "# state constraints\n", "for s in STATES.keys():\n", " rhs = STATES[s]['initial']\n", " for t in TIME:\n", " # state capacity constraint\n", " model.cons.add(model.S[s,t] <= C[s])\n", " \n", " # state mass balanace\n", " for i in T_[s]:\n", " for j in K[i]:\n", " if t >= P[(i,s)]: \n", " rhs += rho_[(i,s)]*model.B[i,j,max(TIME[TIME <= t-P[(i,s)]])] \n", " for i in T[s]:\n", " rhs -= rho[(i,s)]*sum([model.B[i,j,t] for j in K[i]])\n", " model.cons.add(model.S[s,t] == rhs)\n", " rhs = model.S[s,t] \n", " \n", "model.cons.add(model.S['Product_2',H]==model.S['Product_1',H])\n", " \n", "SolverFactory('gurobi').solve(model).write()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Analysis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Profitability\n", "\n" ] }, { "cell_type": "code", "execution_count": 425, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Value of State Inventories = 17152.00\n", " Cost of Unit Assignments = 26.00\n", " Net Objective = 17126.00\n" ] } ], "source": [ "print(\"Value of State Inventories = {0:12.2f}\".format(model.Value()))\n", "print(\" Cost of Unit Assignments = {0:12.2f}\".format(model.Cost()))\n", "print(\" Net Objective = {0:12.2f}\".format(model.Value() - model.Cost()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### State Inventories" ] }, { "cell_type": "code", "execution_count": 426, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
EnzymeSubstrateWaterWortTurbidS_1Beer_1SBPProduct_1TurbidS_2Beer_2Product_2RawWasteWWasteWater
0499.0480.0421.00.00.00.00.00.00.00.00.00.00.0
1498.0460.0342.00.00.00.00.00.00.00.00.00.00.0
2497.0440.0263.00.00.00.00.00.00.00.00.00.00.0
3497.0440.0263.00.00.00.00.00.00.00.00.00.00.0
4497.0440.0263.00.00.00.00.00.00.00.00.00.00.0
5496.0420.0184.00.00.00.00.00.00.00.00.00.00.0
6495.0400.0105.00.00.080.020.00.00.00.00.00.00.0
7494.0380.026.00.0100.080.040.00.00.080.00.00.00.0
8494.0380.026.00.0100.00.040.00.00.080.00.00.00.0
9494.0380.026.00.00.00.040.04.00.00.00.076.00.0
10494.0380.026.00.00.00.060.04.00.00.04.0152.00.0
11494.0380.026.00.00.00.080.08.00.00.04.0228.00.0
12494.0380.026.00.00.00.0100.08.00.00.08.0104.00.0
13494.0380.0126.00.00.00.0120.012.00.00.08.00.0100.0
14494.0380.0216.00.00.00.0120.012.00.00.012.076.0190.0
\n", "
" ], "text/plain": [ " Enzyme Substrate Water Wort TurbidS_1 Beer_1 SBP Product_1 \\\n", "0 499.0 480.0 421.0 0.0 0.0 0.0 0.0 0.0 \n", "1 498.0 460.0 342.0 0.0 0.0 0.0 0.0 0.0 \n", "2 497.0 440.0 263.0 0.0 0.0 0.0 0.0 0.0 \n", "3 497.0 440.0 263.0 0.0 0.0 0.0 0.0 0.0 \n", "4 497.0 440.0 263.0 0.0 0.0 0.0 0.0 0.0 \n", "5 496.0 420.0 184.0 0.0 0.0 0.0 0.0 0.0 \n", "6 495.0 400.0 105.0 0.0 0.0 80.0 20.0 0.0 \n", "7 494.0 380.0 26.0 0.0 100.0 80.0 40.0 0.0 \n", "8 494.0 380.0 26.0 0.0 100.0 0.0 40.0 0.0 \n", "9 494.0 380.0 26.0 0.0 0.0 0.0 40.0 4.0 \n", "10 494.0 380.0 26.0 0.0 0.0 0.0 60.0 4.0 \n", "11 494.0 380.0 26.0 0.0 0.0 0.0 80.0 8.0 \n", "12 494.0 380.0 26.0 0.0 0.0 0.0 100.0 8.0 \n", "13 494.0 380.0 126.0 0.0 0.0 0.0 120.0 12.0 \n", "14 494.0 380.0 216.0 0.0 0.0 0.0 120.0 12.0 \n", "\n", " TurbidS_2 Beer_2 Product_2 RawWasteW WasteWater \n", "0 0.0 0.0 0.0 0.0 0.0 \n", "1 0.0 0.0 0.0 0.0 0.0 \n", "2 0.0 0.0 0.0 0.0 0.0 \n", "3 0.0 0.0 0.0 0.0 0.0 \n", "4 0.0 0.0 0.0 0.0 0.0 \n", "5 0.0 0.0 0.0 0.0 0.0 \n", "6 0.0 0.0 0.0 0.0 0.0 \n", "7 0.0 80.0 0.0 0.0 0.0 \n", "8 0.0 80.0 0.0 0.0 0.0 \n", "9 0.0 0.0 0.0 76.0 0.0 \n", "10 0.0 0.0 4.0 152.0 0.0 \n", "11 0.0 0.0 4.0 228.0 0.0 \n", "12 0.0 0.0 8.0 104.0 0.0 \n", "13 0.0 0.0 8.0 0.0 100.0 \n", "14 0.0 0.0 12.0 76.0 190.0 " ] }, "execution_count": 426, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "from IPython.display import display, HTML\n", "\n", "pd.DataFrame([[model.S[s,t]() for s in STATES.keys()] for t in TIME], columns = STATES.keys(), index = TIME)" ] }, { "cell_type": "code", "execution_count": 427, "metadata": { "scrolled": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/jeff/anaconda/lib/python3.6/site-packages/matplotlib/axes/_base.py:3193: UserWarning: Attempting to set identical bottom==top results\n", "in singular transformations; automatically expanding.\n", "bottom=0, top=0.0\n", " 'bottom=%s, top=%s') % (bottom, top))\n" ] }, { "data": { "image/png": "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\nSUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(10,6))\n", "for (s,idx) in zip(STATES.keys(),range(0,len(STATES.keys()))):\n", " plt.subplot(ceil(len(STATES.keys())/3),3,idx+1)\n", " tlast,ylast = 0,STATES[s]['initial']\n", " for (t,y) in zip(list(TIME),[model.S[s,t]() for t in TIME]):\n", " plt.plot([tlast,t,t],[ylast,ylast,y],'b')\n", " #plt.plot([tlast,t],[ylast,y],'b.',ms=10)\n", " tlast,ylast = t,y\n", " plt.ylim(0,1.1*C[s])\n", " plt.plot([0,H],[C[s],C[s]],'r--')\n", " plt.title(s)\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Unit Assignment" ] }, { "cell_type": "code", "execution_count": 428, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
BlenderFermentor_1Fermentor_2Fermentor_3Filter_1Filter_2MembraneSRO_System
0(Digestion, 100.0)NoneNoneNoneNoneNoneNoneNone
1(Digestion, 100.0)NoneNone(Fermentation_1, 100.0)NoneNoneNoneNone
2(Digestion, 100.0)(Fermentation_2, 100.0)NoneNoneNoneNoneNoneNone
3NoneNone(Fermentation_1, 100.0)NoneNoneNoneNoneNone
4NoneNoneNoneNoneNoneNoneNoneNone
5(Digestion, 100.0)NoneNoneNone(Filtration_1, 100.0)NoneNoneNone
6(Digestion, 100.0)NoneNone(Fermentation_2, 100.0)None(Filtration_2, 100.0)NoneNone
7(Digestion, 100.0)(Fermentation_1, 100.0)NoneNoneNoneNoneNoneNone
8NoneNone(Fermentation_2, 100.0)NoneNoneNone(Separation_1, 80.0)None
9NoneNoneNoneNoneNone(Filtration_1, 100.0)(Separation_2, 80.0)None
10NoneNoneNoneNoneNone(Filtration_2, 100.0)(Separation_1, 80.0)None
11NoneNoneNoneNone(Filtration_1, 100.0)None(Separation_2, 80.0)None
12NoneNoneNoneNoneNone(Filtration_2, 100.0)(Separation_1, 80.0)(WaterTreat, 200.0)
13NoneNoneNoneNoneNoneNone(Separation_2, 80.0)(WaterTreat, 180.0)
14NoneNoneNoneNoneNoneNoneNoneNone
\n", "
" ], "text/plain": [ " Blender Fermentor_1 Fermentor_2 \\\n", "0 (Digestion, 100.0) None None \n", "1 (Digestion, 100.0) None None \n", "2 (Digestion, 100.0) (Fermentation_2, 100.0) None \n", "3 None None (Fermentation_1, 100.0) \n", "4 None None None \n", "5 (Digestion, 100.0) None None \n", "6 (Digestion, 100.0) None None \n", "7 (Digestion, 100.0) (Fermentation_1, 100.0) None \n", "8 None None (Fermentation_2, 100.0) \n", "9 None None None \n", "10 None None None \n", "11 None None None \n", "12 None None None \n", "13 None None None \n", "14 None None None \n", "\n", " Fermentor_3 Filter_1 Filter_2 \\\n", "0 None None None \n", "1 (Fermentation_1, 100.0) None None \n", "2 None None None \n", "3 None None None \n", "4 None None None \n", "5 None (Filtration_1, 100.0) None \n", "6 (Fermentation_2, 100.0) None (Filtration_2, 100.0) \n", "7 None None None \n", "8 None None None \n", "9 None None (Filtration_1, 100.0) \n", "10 None None (Filtration_2, 100.0) \n", "11 None (Filtration_1, 100.0) None \n", "12 None None (Filtration_2, 100.0) \n", "13 None None None \n", "14 None None None \n", "\n", " MembraneS RO_System \n", "0 None None \n", "1 None None \n", "2 None None \n", "3 None None \n", "4 None None \n", "5 None None \n", "6 None None \n", "7 None None \n", "8 (Separation_1, 80.0) None \n", "9 (Separation_2, 80.0) None \n", "10 (Separation_1, 80.0) None \n", "11 (Separation_2, 80.0) None \n", "12 (Separation_1, 80.0) (WaterTreat, 200.0) \n", "13 (Separation_2, 80.0) (WaterTreat, 180.0) \n", "14 None None " ] }, "execution_count": 428, "metadata": {}, "output_type": "execute_result" } ], "source": [ "UnitAssignment = pd.DataFrame({j:[None for t in TIME] for j in UNITS},index=TIME)\n", "\n", "for t in TIME:\n", " for j in UNITS:\n", " for i in I[j]:\n", " for s in S_[i]:\n", " if t-p[i] >= 0:\n", " if model.W[i,j,max(TIME[TIME <= t-p[i]])]() > 0:\n", " UnitAssignment.loc[t,j] = None \n", " for i in I[j]:\n", " if model.W[i,j,t]() > 0:\n", " UnitAssignment.loc[t,j] = (i,model.B[i,j,t]())\n", "\n", "UnitAssignment" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Unit Batch Inventories" ] }, { "cell_type": "code", "execution_count": 429, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Fermentor_2BlenderFermentor_1Filter_2Filter_1Fermentor_3RO_SystemMembraneS
00.0100.00.00.00.00.00.00.0
10.0100.00.00.00.0100.00.00.0
20.0100.0100.00.00.0100.00.00.0
3100.00.0100.00.00.0100.00.00.0
4100.00.0100.00.00.0100.00.00.0
5100.0100.0100.00.0100.00.00.00.0
6100.0100.00.0100.00.0100.00.00.0
70.0100.0100.00.00.0100.00.00.0
8100.00.0100.00.00.0100.00.080.0
9100.00.0100.0100.00.0100.00.080.0
10100.00.0100.0100.00.00.00.080.0
11100.00.00.00.0100.00.00.080.0
120.00.00.0100.00.00.0200.080.0
130.00.00.00.00.00.0180.080.0
140.00.00.00.00.00.00.00.0
\n", "
" ], "text/plain": [ " Fermentor_2 Blender Fermentor_1 Filter_2 Filter_1 Fermentor_3 \\\n", "0 0.0 100.0 0.0 0.0 0.0 0.0 \n", "1 0.0 100.0 0.0 0.0 0.0 100.0 \n", "2 0.0 100.0 100.0 0.0 0.0 100.0 \n", "3 100.0 0.0 100.0 0.0 0.0 100.0 \n", "4 100.0 0.0 100.0 0.0 0.0 100.0 \n", "5 100.0 100.0 100.0 0.0 100.0 0.0 \n", "6 100.0 100.0 0.0 100.0 0.0 100.0 \n", "7 0.0 100.0 100.0 0.0 0.0 100.0 \n", "8 100.0 0.0 100.0 0.0 0.0 100.0 \n", "9 100.0 0.0 100.0 100.0 0.0 100.0 \n", "10 100.0 0.0 100.0 100.0 0.0 0.0 \n", "11 100.0 0.0 0.0 0.0 100.0 0.0 \n", "12 0.0 0.0 0.0 100.0 0.0 0.0 \n", "13 0.0 0.0 0.0 0.0 0.0 0.0 \n", "14 0.0 0.0 0.0 0.0 0.0 0.0 \n", "\n", " RO_System MembraneS \n", "0 0.0 0.0 \n", "1 0.0 0.0 \n", "2 0.0 0.0 \n", "3 0.0 0.0 \n", "4 0.0 0.0 \n", "5 0.0 0.0 \n", "6 0.0 0.0 \n", "7 0.0 0.0 \n", "8 0.0 80.0 \n", "9 0.0 80.0 \n", "10 0.0 80.0 \n", "11 0.0 80.0 \n", "12 200.0 80.0 \n", "13 180.0 80.0 \n", "14 0.0 0.0 " ] }, "execution_count": 429, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame([[model.Q[j,t]() for j in UNITS] for t in TIME], columns = UNITS, index = TIME)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Gannt Chart" ] }, { "cell_type": "code", "execution_count": 430, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "\n", "plt.figure(figsize=(12,6))\n", "\n", "gap = H/500\n", "idx = 1\n", "lbls = []\n", "ticks = []\n", "for j in sorted(UNITS):\n", " idx -= 1\n", " for i in sorted(I[j]):\n", " idx -= 1\n", " ticks.append(idx)\n", " lbls.append(\"{0:s} -> {1:s}\".format(j,i))\n", " plt.plot([0,H],[idx,idx],lw=20,alpha=.3,color='y')\n", " for t in TIME:\n", " if model.W[i,j,t]() > 0:\n", " plt.plot([t+gap,t+p[i]-gap], [idx,idx],'b', lw=20, solid_capstyle='butt')\n", " txt = \"{0:.2f}\".format(model.B[i,j,t]())\n", " plt.text(t+p[i]/2, idx, txt, color='white', weight='bold', ha='center', va='center')\n", "plt.xlim(0,H)\n", "plt.gca().set_yticks(ticks)\n", "plt.gca().set_yticklabels(lbls);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Trace of Events and States" ] }, { "cell_type": "code", "execution_count": 431, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "--------------------------------------------------------------------------------------------\n", "\n", "Starting Conditions\n", " Initial Inventories:\n", " Enzyme 500.0 kg\n", " Substrate 500.0 kg\n", " Water 500.0 kg\n", " Wort 0.0 kg\n", " TurbidS_1 0.0 kg\n", " Beer_1 0.0 kg\n", " SBP 0.0 kg\n", " Product_1 0.0 kg\n", " TurbidS_2 0.0 kg\n", " Beer_2 0.0 kg\n", " Product_2 0.0 kg\n", " RawWasteW 0.0 kg\n", " WasteWater 0.0 kg\n", "\n", "--------------------------------------------------------------------------------------------\n", "\n", "Time = 0 hr\n", " Instructions:\n", " Assign Blender with capacity 100 kg to task Digestion for 1 hours\n", " Transfer 79.0 kg from Water to Blender\n", " Transfer 1.0 kg from Enzyme to Blender\n", " Transfer 20.0 kg from Substrate to Blender\n", "\n", " Inventories are now:\n", " Enzyme 499.0 kg\n", " Substrate 480.0 kg\n", " Water 421.0 kg\n", " Wort 0.0 kg\n", " TurbidS_1 0.0 kg\n", " Beer_1 0.0 kg\n", " SBP 0.0 kg\n", " Product_1 0.0 kg\n", " TurbidS_2 0.0 kg\n", " Beer_2 0.0 kg\n", " Product_2 0.0 kg\n", " RawWasteW 0.0 kg\n", " WasteWater 0.0 kg\n", "\n", " Unit Assignments are now:\n", " Blender performs the Digestion task with a 100.00 kg batch for hour 1 of 1\n", "\n", "--------------------------------------------------------------------------------------------\n", "\n", "Time = 1 hr\n", " Instructions:\n", " Transfer 100.0 kg from Blender to Wort\n", " Release Blender from Digestion\n", " Assign Blender with capacity 100 kg to task Digestion for 1 hours\n", " Transfer 79.0 kg from Water to Blender\n", " Transfer 1.0 kg from Enzyme to Blender\n", " Transfer 20.0 kg from Substrate to Blender\n", " Assign Fermentor_3 with capacity 100 kg to task Fermentation_1 for 4 hours\n", " Transfer 100.0 kg from Wort to Fermentor_3\n", "\n", " Inventories are now:\n", " Enzyme 498.0 kg\n", " Substrate 460.0 kg\n", " Water 342.0 kg\n", " Wort 0.0 kg\n", " TurbidS_1 0.0 kg\n", " Beer_1 0.0 kg\n", " SBP 0.0 kg\n", " Product_1 0.0 kg\n", " TurbidS_2 0.0 kg\n", " Beer_2 0.0 kg\n", " Product_2 0.0 kg\n", " RawWasteW 0.0 kg\n", " WasteWater 0.0 kg\n", "\n", " Unit Assignments are now:\n", " Blender performs the Digestion task with a 100.00 kg batch for hour 1 of 1\n", " Fermentor_3 performs the Fermentation_1 task with a 100.00 kg batch for hour 1 of 4\n", "\n", "--------------------------------------------------------------------------------------------\n", "\n", "Time = 2 hr\n", " Instructions:\n", " Transfer 100.0 kg from Blender to Wort\n", " Release Blender from Digestion\n", " Assign Blender with capacity 100 kg to task Digestion for 1 hours\n", " Transfer 79.0 kg from Water to Blender\n", " Transfer 1.0 kg from Enzyme to Blender\n", " Transfer 20.0 kg from Substrate to Blender\n", " Assign Fermentor_1 with capacity 100 kg to task Fermentation_2 for 4 hours\n", " Transfer 100.0 kg from Wort to Fermentor_1\n", "\n", " Inventories are now:\n", " Enzyme 497.0 kg\n", " Substrate 440.0 kg\n", " Water 263.0 kg\n", " Wort 0.0 kg\n", " TurbidS_1 0.0 kg\n", " Beer_1 0.0 kg\n", " SBP 0.0 kg\n", " Product_1 0.0 kg\n", " TurbidS_2 0.0 kg\n", " Beer_2 0.0 kg\n", " Product_2 0.0 kg\n", " RawWasteW 0.0 kg\n", " WasteWater 0.0 kg\n", "\n", " Unit Assignments are now:\n", " Blender performs the Digestion task with a 100.00 kg batch for hour 1 of 1\n", " Fermentor_1 performs the Fermentation_2 task with a 100.00 kg batch for hour 1 of 4\n", " Fermentor_3 performs the Fermentation_1 task with a 100.00 kg batch for hour 2 of 4\n", "\n", "--------------------------------------------------------------------------------------------\n", "\n", "Time = 3 hr\n", " Instructions:\n", " Transfer 100.0 kg from Blender to Wort\n", " Assign Fermentor_2 with capacity 100 kg to task Fermentation_1 for 4 hours\n", " Transfer 100.0 kg from Wort to Fermentor_2\n", " Release Blender from Digestion\n", "\n", " Inventories are now:\n", " Enzyme 497.0 kg\n", " Substrate 440.0 kg\n", " Water 263.0 kg\n", " Wort 0.0 kg\n", " TurbidS_1 0.0 kg\n", " Beer_1 0.0 kg\n", " SBP 0.0 kg\n", " Product_1 0.0 kg\n", " TurbidS_2 0.0 kg\n", " Beer_2 0.0 kg\n", " Product_2 0.0 kg\n", " RawWasteW 0.0 kg\n", " WasteWater 0.0 kg\n", "\n", " Unit Assignments are now:\n", " Fermentor_2 performs the Fermentation_1 task with a 100.00 kg batch for hour 1 of 4\n", " Fermentor_1 performs the Fermentation_2 task with a 100.00 kg batch for hour 2 of 4\n", " Fermentor_3 performs the Fermentation_1 task with a 100.00 kg batch for hour 3 of 4\n", "\n", "--------------------------------------------------------------------------------------------\n", "\n", "Time = 4 hr\n", " Instructions:\n", "\n", " Inventories are now:\n", " Enzyme 497.0 kg\n", " Substrate 440.0 kg\n", " Water 263.0 kg\n", " Wort 0.0 kg\n", " TurbidS_1 0.0 kg\n", " Beer_1 0.0 kg\n", " SBP 0.0 kg\n", " Product_1 0.0 kg\n", " TurbidS_2 0.0 kg\n", " Beer_2 0.0 kg\n", " Product_2 0.0 kg\n", " RawWasteW 0.0 kg\n", " WasteWater 0.0 kg\n", "\n", " Unit Assignments are now:\n", " Fermentor_2 performs the Fermentation_1 task with a 100.00 kg batch for hour 2 of 4\n", " Fermentor_1 performs the Fermentation_2 task with a 100.00 kg batch for hour 3 of 4\n", " Fermentor_3 performs the Fermentation_1 task with a 100.00 kg batch for hour 4 of 4\n", "\n", "--------------------------------------------------------------------------------------------\n", "\n", "Time = 5 hr\n", " Instructions:\n", " Transfer 100.0 kg from Fermentor_3 to TurbidS_1\n", " Assign Blender with capacity 100 kg to task Digestion for 1 hours\n", " Transfer 79.0 kg from Water to Blender\n", " Transfer 1.0 kg from Enzyme to Blender\n", " Transfer 20.0 kg from Substrate to Blender\n", " Assign Filter_1 with capacity 100 kg to task Filtration_1 for 1 hours\n", " Transfer 100.0 kg from TurbidS_1 to Filter_1\n", " Release Fermentor_3 from Fermentation_1\n", "\n", " Inventories are now:\n", " Enzyme 496.0 kg\n", " Substrate 420.0 kg\n", " Water 184.0 kg\n", " Wort 0.0 kg\n", " TurbidS_1 0.0 kg\n", " Beer_1 0.0 kg\n", " SBP 0.0 kg\n", " Product_1 0.0 kg\n", " TurbidS_2 0.0 kg\n", " Beer_2 0.0 kg\n", " Product_2 0.0 kg\n", " RawWasteW 0.0 kg\n", " WasteWater 0.0 kg\n", "\n", " Unit Assignments are now:\n", " Fermentor_2 performs the Fermentation_1 task with a 100.00 kg batch for hour 3 of 4\n", " Blender performs the Digestion task with a 100.00 kg batch for hour 1 of 1\n", " Fermentor_1 performs the Fermentation_2 task with a 100.00 kg batch for hour 4 of 4\n", " Filter_1 performs the Filtration_1 task with a 100.00 kg batch for hour 1 of 1\n", "\n", "--------------------------------------------------------------------------------------------\n", "\n", "Time = 6 hr\n", " Instructions:\n", " Transfer 100.0 kg from Blender to Wort\n", " Transfer 100.0 kg from Fermentor_1 to TurbidS_2\n", " Transfer 20.0 kg from Filter_1 to SBP\n", " Transfer 80.0 kg from Filter_1 to Beer_1\n", " Release Blender from Digestion\n", " Assign Blender with capacity 100 kg to task Digestion for 1 hours\n", " Transfer 79.0 kg from Water to Blender\n", " Transfer 1.0 kg from Enzyme to Blender\n", " Transfer 20.0 kg from Substrate to Blender\n", " Release Fermentor_1 from Fermentation_2\n", " Assign Filter_2 with capacity 100 kg to task Filtration_2 for 1 hours\n", " Transfer 100.0 kg from TurbidS_2 to Filter_2\n", " Release Filter_1 from Filtration_1\n", " Assign Fermentor_3 with capacity 100 kg to task Fermentation_2 for 4 hours\n", " Transfer 100.0 kg from Wort to Fermentor_3\n", "\n", " Inventories are now:\n", " Enzyme 495.0 kg\n", " Substrate 400.0 kg\n", " Water 105.0 kg\n", " Wort 0.0 kg\n", " TurbidS_1 0.0 kg\n", " Beer_1 80.0 kg\n", " SBP 20.0 kg\n", " Product_1 0.0 kg\n", " TurbidS_2 0.0 kg\n", " Beer_2 0.0 kg\n", " Product_2 0.0 kg\n", " RawWasteW 0.0 kg\n", " WasteWater 0.0 kg\n", "\n", " Unit Assignments are now:\n", " Fermentor_2 performs the Fermentation_1 task with a 100.00 kg batch for hour 4 of 4\n", " Blender performs the Digestion task with a 100.00 kg batch for hour 1 of 1\n", " Filter_2 performs the Filtration_2 task with a 100.00 kg batch for hour 1 of 1\n", " Fermentor_3 performs the Fermentation_2 task with a 100.00 kg batch for hour 1 of 4\n", "\n", "--------------------------------------------------------------------------------------------\n", "\n", "Time = 7 hr\n", " Instructions:\n", " Transfer 100.0 kg from Fermentor_2 to TurbidS_1\n", " Transfer 100.0 kg from Blender to Wort\n", " Transfer 80.0 kg from Filter_2 to Beer_2\n", " Transfer 20.0 kg from Filter_2 to SBP\n", " Release Fermentor_2 from Fermentation_1\n", " Release Blender from Digestion\n", " Assign Blender with capacity 100 kg to task Digestion for 1 hours\n", " Transfer 79.0 kg from Water to Blender\n", " Transfer 1.0 kg from Enzyme to Blender\n", " Transfer 20.0 kg from Substrate to Blender\n", " Assign Fermentor_1 with capacity 100 kg to task Fermentation_1 for 4 hours\n", " Transfer 100.0 kg from Wort to Fermentor_1\n", " Release Filter_2 from Filtration_2\n", "\n", " Inventories are now:\n", " Enzyme 494.0 kg\n", " Substrate 380.0 kg\n", " Water 26.0 kg\n", " Wort 0.0 kg\n", " TurbidS_1 100.0 kg\n", " Beer_1 80.0 kg\n", " SBP 40.0 kg\n", " Product_1 0.0 kg\n", " TurbidS_2 0.0 kg\n", " Beer_2 80.0 kg\n", " Product_2 0.0 kg\n", " RawWasteW 0.0 kg\n", " WasteWater 0.0 kg\n", "\n", " Unit Assignments are now:\n", " Blender performs the Digestion task with a 100.00 kg batch for hour 1 of 1\n", " Fermentor_1 performs the Fermentation_1 task with a 100.00 kg batch for hour 1 of 4\n", " Fermentor_3 performs the Fermentation_2 task with a 100.00 kg batch for hour 2 of 4\n", "\n", "--------------------------------------------------------------------------------------------\n", "\n", "Time = 8 hr\n", " Instructions:\n", " Transfer 100.0 kg from Blender to Wort\n", " Assign Fermentor_2 with capacity 100 kg to task Fermentation_2 for 4 hours\n", " Transfer 100.0 kg from Wort to Fermentor_2\n", " Release Blender from Digestion\n", " Assign MembraneS with capacity 100 kg to task Separation_1 for 1 hours\n", " Transfer 80.0 kg from Beer_1 to MembraneS\n", "\n", " Inventories are now:\n", " Enzyme 494.0 kg\n", " Substrate 380.0 kg\n", " Water 26.0 kg\n", " Wort 0.0 kg\n", " TurbidS_1 100.0 kg\n", " Beer_1 0.0 kg\n", " SBP 40.0 kg\n", " Product_1 0.0 kg\n", " TurbidS_2 0.0 kg\n", " Beer_2 80.0 kg\n", " Product_2 0.0 kg\n", " RawWasteW 0.0 kg\n", " WasteWater 0.0 kg\n", "\n", " Unit Assignments are now:\n", " Fermentor_2 performs the Fermentation_2 task with a 100.00 kg batch for hour 1 of 4\n", " Fermentor_1 performs the Fermentation_1 task with a 100.00 kg batch for hour 2 of 4\n", " Fermentor_3 performs the Fermentation_2 task with a 100.00 kg batch for hour 3 of 4\n", " MembraneS performs the Separation_1 task with a 80.00 kg batch for hour 1 of 1\n", "\n", "--------------------------------------------------------------------------------------------\n", "\n", "Time = 9 hr\n", " Instructions:\n", " Transfer 76.0 kg from MembraneS to RawWasteW\n", " Transfer 4.0 kg from MembraneS to Product_1\n", " Assign Filter_2 with capacity 100 kg to task Filtration_1 for 1 hours\n", " Transfer 100.0 kg from TurbidS_1 to Filter_2\n", " Release MembraneS from Separation_1\n", " Assign MembraneS with capacity 100 kg to task Separation_2 for 1 hours\n", " Transfer 80.0 kg from Beer_2 to MembraneS\n", "\n", " Inventories are now:\n", " Enzyme 494.0 kg\n", " Substrate 380.0 kg\n", " Water 26.0 kg\n", " Wort 0.0 kg\n", " TurbidS_1 0.0 kg\n", " Beer_1 0.0 kg\n", " SBP 40.0 kg\n", " Product_1 4.0 kg\n", " TurbidS_2 0.0 kg\n", " Beer_2 0.0 kg\n", " Product_2 0.0 kg\n", " RawWasteW 76.0 kg\n", " WasteWater 0.0 kg\n", "\n", " Unit Assignments are now:\n", " Fermentor_2 performs the Fermentation_2 task with a 100.00 kg batch for hour 2 of 4\n", " Fermentor_1 performs the Fermentation_1 task with a 100.00 kg batch for hour 3 of 4\n", " Filter_2 performs the Filtration_1 task with a 100.00 kg batch for hour 1 of 1\n", " Fermentor_3 performs the Fermentation_2 task with a 100.00 kg batch for hour 4 of 4\n", " MembraneS performs the Separation_2 task with a 80.00 kg batch for hour 1 of 1\n", "\n", "--------------------------------------------------------------------------------------------\n", "\n", "Time = 10 hr\n", " Instructions:\n", " Transfer 20.0 kg from Filter_2 to SBP\n", " Transfer 80.0 kg from Filter_2 to Beer_1\n", " Transfer 100.0 kg from Fermentor_3 to TurbidS_2\n", " Transfer 76.0 kg from MembraneS to RawWasteW\n", " Transfer 4.0 kg from MembraneS to Product_2\n", " Release Filter_2 from Filtration_1\n", " Assign Filter_2 with capacity 100 kg to task Filtration_2 for 1 hours\n", " Transfer 100.0 kg from TurbidS_2 to Filter_2\n", " Release Fermentor_3 from Fermentation_2\n", " Release MembraneS from Separation_2\n", " Assign MembraneS with capacity 100 kg to task Separation_1 for 1 hours\n", " Transfer 80.0 kg from Beer_1 to MembraneS\n", "\n", " Inventories are now:\n", " Enzyme 494.0 kg\n", " Substrate 380.0 kg\n", " Water 26.0 kg\n", " Wort 0.0 kg\n", " TurbidS_1 0.0 kg\n", " Beer_1 0.0 kg\n", " SBP 60.0 kg\n", " Product_1 4.0 kg\n", " TurbidS_2 0.0 kg\n", " Beer_2 0.0 kg\n", " Product_2 4.0 kg\n", " RawWasteW 152.0 kg\n", " WasteWater 0.0 kg\n", "\n", " Unit Assignments are now:\n", " Fermentor_2 performs the Fermentation_2 task with a 100.00 kg batch for hour 3 of 4\n", " Fermentor_1 performs the Fermentation_1 task with a 100.00 kg batch for hour 4 of 4\n", " Filter_2 performs the Filtration_2 task with a 100.00 kg batch for hour 1 of 1\n", " MembraneS performs the Separation_1 task with a 80.00 kg batch for hour 1 of 1\n", "\n", "--------------------------------------------------------------------------------------------\n", "\n", "Time = 11 hr\n", " Instructions:\n", " Transfer 100.0 kg from Fermentor_1 to TurbidS_1\n", " Transfer 80.0 kg from Filter_2 to Beer_2\n", " Transfer 20.0 kg from Filter_2 to SBP\n", " Transfer 76.0 kg from MembraneS to RawWasteW\n", " Transfer 4.0 kg from MembraneS to Product_1\n", " Release Fermentor_1 from Fermentation_1\n", " Release Filter_2 from Filtration_2\n", " Assign Filter_1 with capacity 100 kg to task Filtration_1 for 1 hours\n", " Transfer 100.0 kg from TurbidS_1 to Filter_1\n", " Release MembraneS from Separation_1\n", " Assign MembraneS with capacity 100 kg to task Separation_2 for 1 hours\n", " Transfer 80.0 kg from Beer_2 to MembraneS\n", "\n", " Inventories are now:\n", " Enzyme 494.0 kg\n", " Substrate 380.0 kg\n", " Water 26.0 kg\n", " Wort 0.0 kg\n", " TurbidS_1 0.0 kg\n", " Beer_1 0.0 kg\n", " SBP 80.0 kg\n", " Product_1 8.0 kg\n", " TurbidS_2 0.0 kg\n", " Beer_2 0.0 kg\n", " Product_2 4.0 kg\n", " RawWasteW 228.0 kg\n", " WasteWater 0.0 kg\n", "\n", " Unit Assignments are now:\n", " Fermentor_2 performs the Fermentation_2 task with a 100.00 kg batch for hour 4 of 4\n", " Filter_1 performs the Filtration_1 task with a 100.00 kg batch for hour 1 of 1\n", " MembraneS performs the Separation_2 task with a 80.00 kg batch for hour 1 of 1\n", "\n", "--------------------------------------------------------------------------------------------\n", "\n", "Time = 12 hr\n", " Instructions:\n", " Transfer 100.0 kg from Fermentor_2 to TurbidS_2\n", " Transfer 20.0 kg from Filter_1 to SBP\n", " Transfer 80.0 kg from Filter_1 to Beer_1\n", " Transfer 76.0 kg from MembraneS to RawWasteW\n", " Transfer 4.0 kg from MembraneS to Product_2\n", " Release Fermentor_2 from Fermentation_2\n", " Assign Filter_2 with capacity 100 kg to task Filtration_2 for 1 hours\n", " Transfer 100.0 kg from TurbidS_2 to Filter_2\n", " Release Filter_1 from Filtration_1\n", " Assign RO_System with capacity 200 kg to task WaterTreat for 1 hours\n", " Transfer 200.0 kg from RawWasteW to RO_System\n", " Release MembraneS from Separation_2\n", " Assign MembraneS with capacity 100 kg to task Separation_1 for 1 hours\n", " Transfer 80.0 kg from Beer_1 to MembraneS\n", "\n", " Inventories are now:\n", " Enzyme 494.0 kg\n", " Substrate 380.0 kg\n", " Water 26.0 kg\n", " Wort 0.0 kg\n", " TurbidS_1 0.0 kg\n", " Beer_1 0.0 kg\n", " SBP 100.0 kg\n", " Product_1 8.0 kg\n", " TurbidS_2 0.0 kg\n", " Beer_2 0.0 kg\n", " Product_2 8.0 kg\n", " RawWasteW 104.0 kg\n", " WasteWater 0.0 kg\n", "\n", " Unit Assignments are now:\n", " Filter_2 performs the Filtration_2 task with a 100.00 kg batch for hour 1 of 1\n", " RO_System performs the WaterTreat task with a 200.00 kg batch for hour 1 of 1\n", " MembraneS performs the Separation_1 task with a 80.00 kg batch for hour 1 of 1\n", "\n", "--------------------------------------------------------------------------------------------\n", "\n", "Time = 13 hr\n", " Instructions:\n", " Transfer 80.0 kg from Filter_2 to Beer_2\n", " Transfer 20.0 kg from Filter_2 to SBP\n", " Transfer 100.0 kg from RO_System to Water\n", " Transfer 100.0 kg from RO_System to WasteWater\n", " Transfer 76.0 kg from MembraneS to RawWasteW\n", " Transfer 4.0 kg from MembraneS to Product_1\n", " Release Filter_2 from Filtration_2\n", " Release RO_System from WaterTreat\n", " Assign RO_System with capacity 200 kg to task WaterTreat for 1 hours\n", " Transfer 180.0 kg from RawWasteW to RO_System\n", " Release MembraneS from Separation_1\n", " Assign MembraneS with capacity 100 kg to task Separation_2 for 1 hours\n", " Transfer 80.0 kg from Beer_2 to MembraneS\n", "\n", " Inventories are now:\n", " Enzyme 494.0 kg\n", " Substrate 380.0 kg\n", " Water 126.0 kg\n", " Wort 0.0 kg\n", " TurbidS_1 0.0 kg\n", " Beer_1 0.0 kg\n", " SBP 120.0 kg\n", " Product_1 12.0 kg\n", " TurbidS_2 0.0 kg\n", " Beer_2 0.0 kg\n", " Product_2 8.0 kg\n", " RawWasteW 0.0 kg\n", " WasteWater 100.0 kg\n", "\n", " Unit Assignments are now:\n", " RO_System performs the WaterTreat task with a 180.00 kg batch for hour 1 of 1\n", " MembraneS performs the Separation_2 task with a 80.00 kg batch for hour 1 of 1\n", "\n", "--------------------------------------------------------------------------------------------\n", "\n", "Time = 14 hr\n", " Instructions:\n", " Transfer 90.0 kg from RO_System to Water\n", " Transfer 90.0 kg from RO_System to WasteWater\n", " Transfer 76.0 kg from MembraneS to RawWasteW\n", " Transfer 4.0 kg from MembraneS to Product_2\n", " Release RO_System from WaterTreat\n", " Release MembraneS from Separation_2\n", "\n", " Inventories are now:\n", " Enzyme 494.0 kg\n", " Substrate 380.0 kg\n", " Water 216.0 kg\n", " Wort 0.0 kg\n", " TurbidS_1 0.0 kg\n", " Beer_1 0.0 kg\n", " SBP 120.0 kg\n", " Product_1 12.0 kg\n", " TurbidS_2 0.0 kg\n", " Beer_2 0.0 kg\n", " Product_2 12.0 kg\n", " RawWasteW 76.0 kg\n", " WasteWater 190.0 kg\n", "\n", " Unit Assignments are now:\n", "\n", "--------------------------------------------------------------------------------------------\n", "\n", "Final Conditions\n", " Final Inventories:\n", " Enzyme 494.0 kg\n", " Substrate 380.0 kg\n", " Water 216.0 kg\n", " Wort 0.0 kg\n", " TurbidS_1 0.0 kg\n", " Beer_1 0.0 kg\n", " SBP 120.0 kg\n", " Product_1 12.0 kg\n", " TurbidS_2 0.0 kg\n", " Beer_2 0.0 kg\n", " Product_2 12.0 kg\n", " RawWasteW 76.0 kg\n", " WasteWater 190.0 kg\n" ] } ], "source": [ "sep = '\\n--------------------------------------------------------------------------------------------\\n'\n", "print(sep)\n", "print(\"Starting Conditions\")\n", "print(\" Initial Inventories:\") \n", "for s in STATES.keys():\n", " print(\" {0:10s} {1:6.1f} kg\".format(s,STATES[s]['initial']))\n", " \n", "units = {j:{'assignment':'None', 't':0} for j in UNITS}\n", "\n", "for t in TIME:\n", " print(sep)\n", " print(\"Time =\",t,\"hr\")\n", " print(\" Instructions:\")\n", " for j in UNITS:\n", " units[j]['t'] += 1\n", " # transfer from unit to states\n", " for i in I[j]: \n", " for s in S_[i]:\n", " if t-P[(i,s)] >= 0:\n", " amt = rho_[(i,s)]*model.B[i,j,max(TIME[TIME <= t - P[(i,s)]])]()\n", " if amt > 0:\n", " print(\" Transfer\", amt, \"kg from\", j, \"to\", s)\n", " for j in UNITS:\n", " # release units from tasks\n", " for i in I[j]:\n", " if t-p[i] >= 0:\n", " if model.W[i,j,max(TIME[TIME <= t-p[i]])]() > 0:\n", " print(\" Release\", j, \"from\", i)\n", " units[j]['assignment'] = 'None'\n", " units[j]['t'] = 0\n", " # assign units to tasks \n", " for i in I[j]:\n", " if model.W[i,j,t]() > 0:\n", " print(\" Assign\", j, \"with capacity\", Bmax[(i,j)], \"kg to task\",i,\"for\",p[i],\"hours\")\n", " units[j]['assignment'] = i\n", " units[j]['t'] = 1\n", " # transfer from states to starting tasks\n", " for i in I[j]:\n", " for s in S[i]:\n", " amt = rho[(i,s)]*model.B[i,j,t]()\n", " if amt > 0:\n", " print(\" Transfer\", amt,\"kg from\", s, \"to\", j)\n", " print(\"\\n Inventories are now:\") \n", " for s in STATES.keys():\n", " print(\" {0:10s} {1:6.1f} kg\".format(s,model.S[s,t]()))\n", " print(\"\\n Unit Assignments are now:\")\n", " for j in UNITS:\n", " if units[j]['assignment'] != 'None':\n", " fmt = \" {0:s} performs the {1:s} task with a {2:.2f} kg batch for hour {3:d} of {4:d}\"\n", " i = units[j]['assignment']\n", " print(fmt.format(j,i,model.Q[j,t](),units[j]['t'],p[i]))\n", " \n", "print(sep)\n", "print('Final Conditions')\n", "print(\" Final Inventories:\") \n", "for s in STATES.keys():\n", " print(\" {0:10s} {1:6.1f} kg\".format(s,model.S[s,H]()))\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "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.1" } }, "nbformat": 4, "nbformat_minor": 2 }