diff --git a/.gitignore b/.gitignore index cfcc546..5fd6764 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,229 @@ [Ss]cripts pyvenv.cfg .venv -pip-selfcheck.json \ No newline at end of file + +pip-selfcheck.json + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser \ No newline at end of file diff --git a/ForkliftAgent.py b/ForkliftAgent.py index e69de29..94789f4 100644 --- a/ForkliftAgent.py +++ b/ForkliftAgent.py @@ -0,0 +1,8 @@ +from mesa import Agent, Model + + +class ForkliftAgent(Agent): + + def __init__(self, unique_id, model): + super().__init__(unique_id, model) + print("Created forklift Agent with ID: {}".format(unique_id)) diff --git a/ForkliftModel.py b/ForkliftModel.py index 08c2219..22e34d1 100644 --- a/ForkliftModel.py +++ b/ForkliftModel.py @@ -5,30 +5,24 @@ from mesa.time import RandomActivation from mesa.space import MultiGrid from mesa.datacollection import DataCollector - -def compute_gini(model): - agent_wealths = [agent.wealth for agent in model.schedule.agents] - x = sorted(agent_wealths) - N = model.num_agents - B = sum(xi * (N - i) for i, xi in enumerate(x)) / (N * sum(x)) - return (1 + (1 / N) - 2 * B) +from ForkliftAgent import ForkliftAgent -class MoneyModel(Model): - """A model with some number of agents.""" +class ForkliftModel(Model): - def __init__(self, N, width, height): - self.num_agents = N + def __init__(self, width, height): + self.num_agents = 1 self.running = True self.grid = MultiGrid(height, width, True) self.schedule = RandomActivation(self) - self.datacollector = DataCollector( - model_reporters={"Gini": compute_gini}, - agent_reporters={"Wealth": lambda a: a.wealth} - ) + # self.datacollector = DataCollector( + # model_reporters={"Gini": compute_gini}, + # agent_reporters={"Wealth": lambda a: a.wealth} + # ) + # Create agents for i in range(self.num_agents): - a = MoneyAgent(i, self) + a = ForkliftAgent(1, self) self.schedule.add(a) # Add the agent to a random grid cell x = random.randrange(self.grid.width) @@ -36,35 +30,5 @@ class MoneyModel(Model): self.grid.place_agent(a, (x, y)) def step(self): - self.datacollector.collect(self) + # self.datacollector.collect(self) self.schedule.step() - - def run_model(self, n): - for i in range(n): - self.step() - - -class MoneyAgent(Agent): - """ An agent with fixed initial wealth.""" - def __init__(self, unique_id, model): - super().__init__(unique_id, model) - self.wealth = 1 - - def move(self): - possible_steps = self.model.grid.get_neighborhood( - self.pos, moore=True, include_center=False - ) - new_position = random.choice(possible_steps) - self.model.grid.move_agent(self, new_position) - - def give_money(self): - cellmates = self.model.grid.get_cell_list_contents([self.pos]) - if len(cellmates) > 1: - other = random.choice(cellmates) - other.wealth += 1 - self.wealth -= 1 - - def step(self): - self.move() - if self.wealth > 0: - self.give_money() \ No newline at end of file diff --git a/README.MD b/README.MD index e69de29..b705458 100644 --- a/README.MD +++ b/README.MD @@ -0,0 +1,7 @@ +# instalujemy ze środowiskiem venv +# następnie wykonujemy komendy: + +``` +pip install mesa +pip install -r https://raw.githubusercontent.com/projectmesa/mesa/main/examples/boltzmann_wealth_model/requirements.txt +``` \ No newline at end of file diff --git a/image.png b/image.png new file mode 100644 index 0000000..8486516 Binary files /dev/null and b/image.png differ diff --git a/main.py b/main.py index e69de29..22404af 100644 --- a/main.py +++ b/main.py @@ -0,0 +1,20 @@ +from mesa.visualization.modules import CanvasGrid +from mesa.visualization.ModularVisualization import ModularServer + +from ForkliftModel import ForkliftModel + + +def agent_portrayal(agent): + portrayal = {"Shape": "image.png", "scale": 1.0, "Layer": 0} + + return portrayal + + +grid = CanvasGrid(agent_portrayal, 10, 10, 512, 512) + +server = ModularServer(ForkliftModel, + [grid], + "Automatyczny Wózek Widłowy", + {"width": 10, "height": 10}) +server.port = 8888 +server.launch() diff --git a/requirements.txt b/requirements.txt index e69de29..438d2e3 100644 --- a/requirements.txt +++ b/requirements.txt @@ -0,0 +1,4 @@ +jupyter +matplotlib +mesa +numpy \ No newline at end of file