Package: prodsys
prodsys - modeling, simulating and optimizing production systemsprodsys is a python package for modeling, simulating and optimizing production systems based on the product, process and resource (PPR) modelling principle. Have a look at thedocumentationfor more information.InstallationTo install the package, run the following command in the terminal:pipinstallprodsysPlease note that the package is only compatible with Python 3.11 or higher.Getting startedThe package is designed to be easy to use. The following example shows how to model a simple production system and simulate it. The production system contains a single milling machine that performs milling processes on aluminium housings. The transport is thereby performed by a worker.  At first, just import the express API ofprodsys:importprodsys.expressaspsxWe now create all components required for describing the production system. At first we define times for all arrival, production and transport processes:milling_time=psx.FunctionTimeModel(distribution_function="normal",location=1,scale=0.1,ID="milling_time")transport_time=psx.FunctionTimeModel(distribution_function="normal",location=0.3,scale=0.2,ID="transport_time")arrival_time_of_housings=psx.FunctionTimeModel(distribution_function="exponential",location=1.5,ID="arrival_time_of_housings")Next, we can define the production and transport process in the system by using the created time models:milling_process=psx.ProductionProcess(milling_time,ID="milling_process")transport_process=psx.TransportProcess(transport_time,ID="transport_process")With the processes defined, we can now create the production and transport resources:milling_machine=psx.ProductionResource([milling_process],location=[5,5],ID="milling_machine")worker=psx.TransportResource([transport_process],location=[0,0],ID="worker")Now we define our product, the housing, that is produced in the system. For this example it requires only a single processsing step:housing=psx.Product([milling_process],transport_process,ID="housing")Only the sources and sinks that are responsible for creating the housing and storing finished housing are misssing:source=psx.Source(housing,arrival_time_of_housings,location=[0,0],ID="source")sink=psx.Sink(housing,location=[20,20],ID="sink")Finally, we can create our production system, run the simulation for 60 minutes and print aggregated simulation results:production_system=psx.ProductionSystem([milling_machine,worker],[source],[sink])production_system.run(60)production_system.runner.print_results()As we can see, the system produced 39 parts in this hour with an work in progress (WIP ~ number of products in the system) of 4.125 and utilized the milling machine with 79.69% and the worker for 78.57% at the PR percentage, the rest of the time, both resource are in standby (SB). Note that these results stay the same although there are stochastic processes in the simulation. This is caused by seeding the random number generator with a fixed value. If you want to get different results, just specify another value forseedparameter from therunmethod.production_system.run(60,seed=1)production_system.runner.print_results()As expected, the performance of the production system changed quite strongly with the new parameters. The system now produces 26 parts in this hour with an work in progress (WIP ~ number of products in the system) of 1.68. As the arrival process of the housing is modelled by an exponential distribution and we only consider 60 minutes of simulation, this is absolutely expected.However, running longer simulations with multiple seeds is absolutely easy withprodsys. We average our results at the end to calculate the WIP to expect by utilizing the post_processor of the runner, which stores all events of a simulation and has many useful methods for analyzing the simulation results:wip_values=[]forseedinrange(5):production_system.run(2000,seed=seed)run_wip=production_system.post_processor.get_aggregated_wip_data()wip_values.append(run_wip)print("WIP values for the simulation runs:",wip_values)We can analyze these results easily with numpy seeing that the average WIP is 2.835, which is in between the two first runs, which gives us a more realistic expectation of the system's performance.importnumpyasnpwip=np.array(wip_values).mean(axis=0)print(wip)These examples only cover the most basic functionalities ofprodsys. For more elaborate guides that guide you through more of the package's features, please see thetutorials. For a complete overview of the package's functionality, please see theAPI reference.Contributingprodsysis a new project and has therefore much room for improvement. Therefore, it would be a pleasure to get feedback or support! If you want to contribute to the package, either create issues onprodsys' github pagefor discussing new features or contact me directly viagithuboremail.LicenseThe package is licensed under theMIT license.AcknowledgementsWe extend our sincere thanks to the German Federal Ministry for Economic Affairs and Climate Action
(BMWK) for supporting this research project 13IK001ZF “Software-Defined Manufacturing for the
automotive and supplying industryhttps://www.sdm4fzi.de/.MIT LicenseCopyright (c) 2023 sebastian.behrendtPermission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.