Merge branch 'master' of s444425/AI into master

This commit is contained in:
Tomasz Lech 2020-05-19 18:13:29 +00:00 committed by Gogs
commit c960a23fa0
37 changed files with 1544 additions and 12 deletions

13
.idea/AI.iml Normal file
View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="R User Library" level="project" />
<orderEntry type="library" name="R Skeletons" level="application" />
</component>
<component name="TestRunnerService">
<option name="PROJECT_TEST_RUNNER" value="Unittests" />
</component>
</module>

4
.idea/encodings.xml Normal file
View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with NO BOM" />
</project>

View File

@ -0,0 +1,6 @@
<component name="libraryTable">
<library name="R User Library">
<CLASSES />
<SOURCES />
</library>
</component>

4
.idea/misc.xml Normal file
View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/AI.iml" filepath="$PROJECT_DIR$/.idea/AI.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

662
.idea/workspace.xml Normal file
View File

@ -0,0 +1,662 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="8264ee8d-5217-4cb6-b982-78f67fabc82e" name="Default Changelist" comment="">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FavoritesManager">
<favorites_list name="AI" />
</component>
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/program.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="34">
<caret line="20" selection-start-line="20" selection-end-line="20" />
<folding>
<element signature="e#0#13#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/KijowskiM.md">
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT">
<first_editor relative-caret-position="1241">
<caret line="73" column="64" selection-start-line="73" selection-start-column="64" selection-end-line="73" selection-end-column="64" />
</first_editor>
<second_editor />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/funkcje.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="3026">
<caret line="183" selection-start-line="183" selection-end-line="183" />
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/genetyczne.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="169">
<caret line="32" column="13" selection-start-line="32" selection-start-column="13" selection-end-line="32" selection-end-column="13" />
<folding>
<element signature="e#0#21#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Python Script" />
</list>
</option>
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>tmp</find>
<find>global</find>
<find>cop</find>
<find>jakLiczycKoszt</find>
<find>jakLiczyc</find>
<find>eve</find>
<find>doW</find>
<find>self</find>
<find>gen</find>
<find>data.geny</find>
<find>crosso</find>
<find>fitness</find>
<find>wybierzUnbox</find>
<find>genRandomPop</find>
<find>cro</find>
<find>moves</find>
<find>genPop</find>
<find>wybierzUn</find>
<find>cros</find>
<find>cross</find>
<find>cr</find>
<find>genpo</find>
<find>random</find>
<find>wybierz</find>
<find>update</find>
<find>za</find>
<find>data.gen</find>
<find>muta</find>
<find>mutate</find>
<find>od tego mom</find>
</findStrings>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
<option name="RECENT_BRANCH_BY_REPOSITORY">
<map>
<entry key="$PROJECT_DIR$" value="master" />
</map>
</option>
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/unboxOnTheFloor.py" />
<option value="$PROJECT_DIR$/generate.py" />
<option value="$PROJECT_DIR$/julian.py" />
<option value="$PROJECT_DIR$/whereDecision.py" />
<option value="$PROJECT_DIR$/dodatkoweMetody.py" />
<option value="$PROJECT_DIR$/wheel.py" />
<option value="$PROJECT_DIR$/Data.py" />
<option value="$PROJECT_DIR$/neurons.py" />
<option value="$PROJECT_DIR$/genetyczny/metody.py" />
<option value="$PROJECT_DIR$/genetyczny/randomBox.py" />
<option value="$PROJECT_DIR$/AStar.py" />
<option value="$PROJECT_DIR$/genetyczny/Gene1.py" />
<option value="$PROJECT_DIR$/main.py" />
<option value="$PROJECT_DIR$/genetyczny/genetyczny.py" />
<option value="$PROJECT_DIR$/Mapa/generate.py" />
<option value="$PROJECT_DIR$/genetyczny/Gene.py" />
<option value="$PROJECT_DIR$/genetyczny/funkcje.py" />
<option value="$PROJECT_DIR$/genetyczny/Data.py" />
<option value="$PROJECT_DIR$/genetyczny/eee.py" />
<option value="$PROJECT_DIR$/genetyczny/genetyczne.py" />
<option value="$PROJECT_DIR$/opis/environment.md" />
<option value="$PROJECT_DIR$/program.py" />
<option value="$PROJECT_DIR$/funkcje.py" />
<option value="$PROJECT_DIR$/genetyczne.py" />
<option value="$PROJECT_DIR$/LechT.md" />
</list>
</option>
</component>
<component name="ProjectFrameBounds" extendedState="6">
<option name="x" value="643" />
<option name="y" value="-8" />
<option name="width" value="758" />
<option name="height" value="1048" />
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectReloadState">
<option name="STATE" value="1" />
</component>
<component name="ProjectView">
<navigator proportions="" version="1">
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="ProjectPane">
<subPane>
<expand>
<path>
<item name="AI" type="b2602c69:ProjectViewProjectNode" />
<item name="AI" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
</subPane>
</pane>
<pane id="Scope" />
</panes>
</component>
<component name="PropertiesComponent">
<property name="settings.editor.selected.configurable" value="com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable" />
</component>
<component name="RecentsManager">
<key name="MoveFile.RECENT_KEYS">
<recent name="C:\Users\zwyklak\Desktop\AI" />
<recent name="C:\Users\zwyklak\Desktop\AI\images" />
<recent name="C:\Users\zwyklak\Desktop\AI\genetyczny" />
<recent name="C:\Users\zwyklak\Desktop\AI\opis" />
<recent name="C:\Users\zwyklak\Desktop\AI\Mapa" />
</key>
</component>
<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
<component name="RunManager" selected="Python.main">
<configuration name="AStar" type="PythonConfigurationType" factoryName="Python" temporary="true">
<module name="AI" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/AStar.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="generate" type="PythonConfigurationType" factoryName="Python" temporary="true">
<module name="AI" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="C:\Users\zwyklak\Desktop\AI\generate.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="julian" type="PythonConfigurationType" factoryName="Python" temporary="true">
<module name="AI" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/julian.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="main" type="PythonConfigurationType" factoryName="Python" temporary="true">
<module name="AI" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/main.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="neurons" type="PythonConfigurationType" factoryName="Python" temporary="true">
<module name="AI" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/neurons.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<recent_temporary>
<list>
<item itemvalue="Python.neurons" />
<item itemvalue="Python.main" />
<item itemvalue="Python.julian" />
<item itemvalue="Python.generate" />
<item itemvalue="Python.AStar" />
</list>
</recent_temporary>
</component>
<component name="StructureViewFactory">
<option name="ACTIVE_ACTIONS" value=",SHOW_INHERITED" />
</component>
<component name="SvnConfiguration">
<configuration />
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="8264ee8d-5217-4cb6-b982-78f67fabc82e" name="Default Changelist" comment="" />
<created>1588070561873</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1588070561873</updated>
</task>
<servers />
</component>
<component name="TodoView">
<todo-panel id="selected-file">
<is-autoscroll-to-source value="true" />
</todo-panel>
<todo-panel id="all">
<are-packages-shown value="true" />
<is-autoscroll-to-source value="true" />
</todo-panel>
</component>
<component name="ToolWindowManager">
<frame x="-7" y="-7" width="1550" height="838" extended-state="6" />
<editor active="true" />
<layout>
<window_info content_ui="combo" id="Project" order="0" sideWeight="0.4995206" visible="true" weight="0.35167786" />
<window_info id="Structure" order="1" sideWeight="0.5004794" side_tool="true" weight="0.3382353" />
<window_info id="Favorites" order="2" sideWeight="0.5011338" side_tool="true" weight="0.27768165" />
<window_info anchor="bottom" id="Message" order="0" />
<window_info anchor="bottom" id="Find" order="1" weight="0.32640332" />
<window_info active="true" anchor="bottom" id="Run" order="2" sideWeight="0.49932885" visible="true" weight="0.21104816" />
<window_info anchor="bottom" id="Cvs" order="3" weight="0.25" />
<window_info anchor="bottom" id="Inspection" order="4" weight="0.4" />
<window_info anchor="bottom" x="1942" y="641" width="1156" height="277" id="Debug" order="5" sideWeight="0.49932885" weight="0.41302842" />
<window_info anchor="bottom" id="TODO" order="6" weight="0.32848233" />
<window_info anchor="bottom" id="Version Control" order="7" weight="0.32848233" />
<window_info anchor="bottom" id="Terminal" order="8" weight="0.32848233" />
<window_info anchor="bottom" id="Event Log" order="9" sideWeight="0.50067115" side_tool="true" weight="0.3753541" />
<window_info anchor="bottom" id="Python Console" order="10" weight="0.32986832" />
<window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
<window_info anchor="right" id="R Graphics" order="3" />
<window_info anchor="right" id="R Packages" order="4" />
</layout>
<layout-to-restore>
<window_info active="true" content_ui="combo" id="Project" order="0" sideWeight="0.4995206" visible="true" weight="0.26643598" />
<window_info id="Structure" order="1" sideWeight="0.5004794" side_tool="true" weight="0.3382353" />
<window_info id="Favorites" order="2" sideWeight="0.5011338" side_tool="true" weight="0.27768165" />
<window_info anchor="bottom" id="Message" order="0" />
<window_info anchor="bottom" id="Find" order="1" weight="0.32719547" />
<window_info anchor="bottom" id="Run" order="2" sideWeight="0.49932885" weight="0.22176023" />
<window_info anchor="bottom" id="Cvs" order="3" weight="0.25" />
<window_info anchor="bottom" id="Inspection" order="4" weight="0.4" />
<window_info anchor="bottom" x="1942" y="641" width="1156" height="277" id="Debug" order="5" sideWeight="0.49932885" visible="true" weight="0.1968122" />
<window_info anchor="bottom" id="TODO" order="6" weight="0.32848233" />
<window_info anchor="bottom" id="Version Control" order="7" weight="0.32848233" />
<window_info anchor="bottom" id="Terminal" order="8" weight="0.3286119" />
<window_info anchor="bottom" id="Event Log" order="9" sideWeight="0.50067115" side_tool="true" weight="0.3753541" />
<window_info anchor="bottom" id="Python Console" order="10" />
<window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
<window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
<window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
<window_info anchor="right" id="R Graphics" order="3" />
<window_info anchor="right" id="R Packages" order="4" />
</layout-to-restore>
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<breakpoints>
<line-breakpoint enabled="true" suspend="THREAD" type="python-line">
<url>file://$PROJECT_DIR$/genetyczne.py</url>
<line>94</line>
<option name="timeStamp" value="231" />
</line-breakpoint>
</breakpoints>
<default-breakpoints>
<breakpoint type="python-exception">
<properties notifyOnTerminate="true" exception="BaseException">
<option name="notifyOnTerminate" value="true" />
</properties>
</breakpoint>
</default-breakpoints>
</breakpoint-manager>
<watches-manager>
<configuration name="PythonConfigurationType">
<watch expression="all" />
<watch expression="startNode" />
<watch expression="self.map" />
<watch expression="niebezpieczne" />
<watch expression="children[0]" />
<watch expression="__py_debug_temp_var_445341660" />
<watch expression="visited" />
</configuration>
</watches-manager>
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/images/sc.png">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/julian.py" />
<entry file="file://$PROJECT_DIR$/dodatkoweMetody.py" />
<entry file="file://$PROJECT_DIR$/unboxOnTheFloor.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="136">
<caret line="8" selection-start-line="8" selection-end-line="8" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/genetyczny/__init__.py" />
<entry file="file://$PROJECT_DIR$/boxOnTheFloor.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/images/wop.png">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/images/wo.png">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/images/krp.png">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/images/nip.png">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/wheel.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="459">
<caret line="31" column="28" selection-start-line="31" selection-start-column="28" selection-end-line="31" selection-end-column="28" />
<folding>
<element signature="e#0#13#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/floor.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="153">
<caret line="9" selection-start-line="9" selection-end-line="9" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/neurons.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="595">
<caret line="35" column="9" selection-start-line="35" selection-start-column="9" selection-end-line="35" selection-end-column="9" />
<folding>
<element signature="e#0#12#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/AppData/Local/Programs/Python/Python37/Lib/site-packages/easygui/boxes/fileopen_box.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="459">
<caret line="27" selection-start-line="27" selection-end-line="27" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/whereDecision.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1054">
<caret line="62" selection-start-line="62" selection-end-line="62" />
<folding>
<element signature="e#0#19#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/AppData/Local/Programs/Python/Python37/Lib/random.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="366">
<caret line="194" selection-start-line="194" selection-end-line="194" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Evencik.py">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/generate.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1383">
<caret line="179" lean-forward="true" selection-start-line="179" selection-end-line="179" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/wall.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="187">
<caret line="11" selection-start-line="11" selection-end-line="11" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/AppData/Local/Programs/Python/Python37/Lib/codecs.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="155">
<caret line="310" column="64" lean-forward="true" selection-start-line="310" selection-start-column="10" selection-end-line="310" selection-end-column="64" />
</state>
</provider>
</entry>
<entry file="file://$APPLICATION_HOME_DIR$/helpers/pydev/pydevd.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="255">
<caret line="1740" selection-start-line="1740" selection-end-line="1740" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/box.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="68">
<caret line="4" column="24" selection-start-line="4" selection-start-column="24" selection-end-line="4" selection-end-column="24" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/environment.md">
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT">
<first_editor>
<caret column="29" lean-forward="true" selection-start-column="29" selection-end-column="29" />
</first_editor>
<second_editor />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Data.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="289">
<caret line="17" column="27" selection-start-line="17" selection-start-column="27" selection-end-line="17" selection-end-column="27" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/shelf.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-46">
<caret line="2" column="11" selection-start-line="2" selection-start-column="6" selection-end-line="2" selection-end-column="11" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/route-planning.md">
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT">
<first_editor relative-caret-position="629">
<caret line="37" column="3" lean-forward="true" selection-start-line="37" selection-start-column="3" selection-end-line="37" selection-end-column="3" />
</first_editor>
<second_editor />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/Downloads/Untitled Diagram.xml">
<provider selected="true" editor-type-id="text-editor" />
</entry>
<entry file="file://$PROJECT_DIR$/images/dzialanieAlgorytmu.png">
<provider selected="true" editor-type-id="images" />
</entry>
<entry file="file://$PROJECT_DIR$/Gene.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="136">
<caret line="8" column="31" lean-forward="true" selection-start-line="8" selection-start-column="31" selection-end-line="8" selection-end-column="31" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/WGoracy.md">
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT">
<first_editor />
<second_editor />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/LechT.md">
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT">
<first_editor relative-caret-position="57">
<caret line="89" column="110" selection-start-line="89" selection-start-column="110" selection-end-line="89" selection-end-column="110" />
</first_editor>
<second_editor />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/AStarState.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="153">
<caret line="9" selection-start-line="9" selection-end-line="9" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/main.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="544">
<caret line="42" selection-start-line="42" selection-end-line="42" />
<folding>
<element signature="e#0#21#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/AStar.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="168">
<caret line="22" column="46" selection-start-line="22" selection-start-column="46" selection-end-line="22" selection-end-column="46" />
<folding>
<element signature="e#0#12#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/program.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="34">
<caret line="20" selection-start-line="20" selection-end-line="20" />
<folding>
<element signature="e#0#13#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/KijowskiM.md">
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
<state split_layout="SPLIT">
<first_editor relative-caret-position="1241">
<caret line="73" column="64" selection-start-line="73" selection-start-column="64" selection-end-line="73" selection-end-column="64" />
</first_editor>
<second_editor />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/funkcje.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="3026">
<caret line="183" selection-start-line="183" selection-end-line="183" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/genetyczne.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="169">
<caret line="32" column="13" selection-start-line="32" selection-start-column="13" selection-end-line="32" selection-end-column="13" />
<folding>
<element signature="e#0#21#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</component>
</project>

View File

@ -16,8 +16,8 @@ class AStar:
result[path[i][0]][path[i][1]] = startValue result[path[i][0]][path[i][1]] = startValue
startValue+=1 startValue+=1
return result return result
######################################################### w current jest koszt do przebycia
def search(self, start, end, grid, cost): def search(self, start, end, grid, cost, flaga): #start to kordy wózka, end miejsce podjęcia paczki
noRows, noColumns = numpy.shape(grid) noRows, noColumns = numpy.shape(grid)
startNode = AStarState(None, tuple(start)) startNode = AStarState(None, tuple(start))
endNode = AStarState(None, tuple(end)) endNode = AStarState(None, tuple(end))
@ -41,32 +41,51 @@ class AStar:
if item.g<current.g: if item.g<current.g:
current = item current = item
currentIndeks = indeks currentIndeks = indeks
if iterations>max and flaga == 0: #podprojekt genetyczne
return current.g
if iterations>max: if iterations>max:
return self.returnPath(current, grid) return self.returnPath(current, grid)
visited.append(current) visited.append(current)
toVisit.pop(currentIndeks) toVisit.pop(currentIndeks)
if current==endNode and flaga == 0:
return current.g
if current==endNode: if current==endNode:
return self.returnPath(current, grid) return self.returnPath(current, grid) #zwracanie wagi przejscia
children = [] children = []
for new in moves: for new in moves:
positions = (current.position[0]+new[0], current.position[1]+new[1]) positions = (current.position[0]+new[0], current.position[1]+new[1])
if (positions[0] > (noRows - 1) or if (positions[0] > (noRows - 1) or
positions[0] < 0 or positions[0] < 0 or
positions[1] > (noColumns - 1) or positions[1] > (noColumns - 1) or
positions[1] < 0): positions[1] < 0):
continue continue
""" podprojekt genetyczne"""
if grid[positions[0]][positions[1]] == 2 and flaga == 0:
children.append(AStarState(current, positions))
continue
if grid[positions[0]][positions[1]]!=0: if grid[positions[0]][positions[1]]!=0:
continue continue
children.append(AStarState(current, positions)) children.append(AStarState(current, positions))
for child in children: for child in children:
if len([visitedChild for visitedChild in visited if visitedChild==child])>0: if len([visitedChild for visitedChild in visited if visitedChild==child])>0:
continue continue
if child.position[0]<=(len(grid)-4) and child.position[0]>=3 and child.position[1]>=4 and child.position[1]<=(len(grid[0])-1): if child.position[0]<=(len(grid)-4) and child.position[0]>=3 and child.position[1]>=4 and child.position[1]<=(len(grid[0])-1):
child.g = current.g + (10 * cost) child.g = current.g + (10 * cost)
else: else:
child.g = current.g + cost child.g = current.g + cost
child.h = (((child.position[0]-endNode.position[0]) ** 2) + ((child.position[1]-endNode.position[1]) ** 2)) child.h = (((child.position[0]-endNode.position[0]) ** 2) + ((child.position[1]-endNode.position[1]) ** 2))
child.f = child.g + child.h child.f = child.g + child.h
if len([i for i in toVisit if child==i and child.g>i.g])>0: if len([i for i in toVisit if child==i and child.g>i.g])>0:
continue continue
toVisit.append(child) toVisit.append(child)

22
Data.py Normal file
View File

@ -0,0 +1,22 @@
class Data:
def __init__(self):
self.zajeteRegaly = [] #krotka (x,y)
self.mapa = []
self.unbox = []
self.astarMap = []
self.geny = []
self.kordyWozka = None
self.jakLiczycKoszt = None
self.best = None
self.histZmian = []
self.doWykresu = []
def genMap(self, mapa):
tmpMap = mapa.copy()
for regal in self.zajeteRegaly:
tmpMap[regal[0]][regal[1]] = 2
return tmpMap

9
Gene.py Normal file
View File

@ -0,0 +1,9 @@
class Gene:
def __init__(self):
self.kordy = None
self.unbox1 = None
self.unbox2 = None
self.unboxWczesniejszegoGenu = None
self.kordyUnboxa = None

320
LechT.md Normal file
View File

@ -0,0 +1,320 @@
## Raport z części indywidualnej - podprojektu
## Tomasz Lech
### Omówienie projektu
Celem projektu jest znalezienie najoptymalniejszej drogi między zajętymi regałami a miejscami odbioru paczki.
Projekt wykorzystuje wcześniej opracowany algorytm AStar, który jest opisany w pliku [route-planning](https://git.wmi.amu.edu.pl/s444399/AI/src/master/route-planning.md).
Moduł podprojektu uruchamia się po uruchomieniu programu oraz kliknięciu **g** na klawiaturze. Omawiany moduł genetyczny podprojektu w dalszej części raportu będzie się pojawiał w skrócie jako **mdg**.
### Opis składowych elementów wykorzystanych w **mdg**
* Gen - jest to najmniejszy wykorzystywany obiekt, reprezentujący zajęty regał, kóry ma określony koszt do danego miejsca odbioru
* Chromosom - jest to uporządkowany zbiór Genów, który reprezentuje kolejność odbioru paczek, końcowa długość wynika z ilości paczek na magazynie.
* Populacja - jest to zbiór chromosomów.
* Funkcja fitness - funkcja obliczająca całkowity koszt chromosomu.
* Selekcja - składowa odpowiedzialna za wybór najlepszych chromosomów z pośród populacji.
* Crossover - składowa odpowiedzialna za generowanie nowej populacji uwzględniając współczynnik mutacji, wielkość dziedziczonego fragmentu oraz otrzymane podczas selekcji chromosomy.
### Dane wejściowe
Podane przez urzydkownika przed uruchomieniem programu:
* ileGeneracji - wartość, która definiuje ile generacji ma się wykonać po uruchomieniu modułu **mdg**,
* ileWPopulacji - wartość, która definiuje ile chromosomów ma się znajdować w Populacji
* fragment - wartość z zakresu (0,1), która względnie do długości chromosomu określa fragment, który będzie dziedziczony, przy tworzeniu nowego chromosomu.
* mutacja - wartość z zakresu (0,1), która określa jaka część nowo tworzonego chromosomu, po dziedziczeniu, ma zostać losowo zmieniona.
* unbox - wartość określająca do jakiego miejsca odbioru ma się kierować wózek
<br/>
0 - losowe miejsce odbioru <br/>
1 - miejsce odbioru tylko po lewej stronie mapy <br/>
2 - miejsce odbioru tylko po prawej stronie mapy <br/>
3 - miejsce odbioru wybierane korzystniej na podstawie kosztu
<br/><br/>
Po uruchomieniu programu:
* generowanie losowo rozmieszczonych paczek na regałach - za przycisku **r** na klawiaturze.
### Integracja
*W pliku program.py* <br/>
Uruchomienie **mdg**:
if event.key == pygame.K_g:
start(self.data,self.wheel)
Po zakończeniu algorytmu, uruchaminy modul który rozwiezie paczki do miejsca odbioru:
for gen in self.data.best[0]:
if(gen.unboxWczesniejszegoGenu == None):
kordStartowy = (self.wheel.ns, self.wheel.we)
else:
kordStartowy = self.data.unbox[gen.unboxWczesniejszegoGenu]
zbierzBox(gen,self.data, self.moves, kordStartowy)
*W pliku genetyczne.py*
def start(data, wheel):
ileGeneracji = 20
ileWPopulacji = 16
fragment = 0.5
mutacja = 0.05
unbox = 3
data.kordyWozka = (wheel.ns, wheel.we)
data.jakLiczycKoszt = unbox
randomPopulation = genRandomPopulation(data, ileWPopulacji)
for i in range(ileGeneracji):
if i == 0:
best2 = dwieNajlepsze(randomPopulation, data)
else:
x = genPopulacje(data,best2[0], best2[1], ileWPopulacji, fragment, mutacja)
best2 = dwieNajlepsze(x, data)
del x
data.histZmian.append(data.best[1])
rysujWykres(data, ileGeneracji, 0, 2000)
W celu modyfikacji danych wejściowych należy zmienić wartości zmiennych, pamiętając o podanych powyrzej ograniczeniach.
Powyżej fragment kodu reprezentujący działanie pętli, której iteracje odpowiadają tworzeniom nowych generacji.
###Sposób działania algorytmu:
```mermaid
graph TD
A[<center> Generowanie <br/> losowego <br/>chromosomu<center/>]
B[<center> Generowanie <br/> losowej <br/> populacji <center/>]
C[<center> Selekcyjny <br/> wybór najlepszych chromosomów <br/>z pośród populacji <center/>]
D[Generowanie nowej populacji z podanych chromosomów]
E[Ilość generacji]
A --> B
B --> C
C --> D
D --> E
E --> C
```
###Implementacja
#### Generowanie losowego chromosomu
*W pliku Gene.py*
Klasa Gene:
class Gene:
def __init__(self):
self.kordy = None
self.unbox1 = None
self.unbox2 = None
self.unboxWczesniejszegoGenu = None
self.kordyUnboxa = None
Odpowiednio:
* kordy - krotka z koordynatami regału
* unbox1 - koszt potrzebny do przejazdu z miejsca regału do miejsca oddania paczki po lewej stronie mapy
* unbox2 - koszty potrzebny do przejazdu z miejsca regału do miejsca oddania paczki po prawej stronie mapy
* unboxWczesniejszegoGenu - wartość (0 lub 1) która definiuje z jakiego miejsca oddania paczki jechał wózek do regału reprezentowanego przez ten gen
* kordyUnboxa - koordynaty miejsca oddania paczki do którego będzie jechać wózek
Od tego momentu miejsce oddania paczki będzie określane jako **unbox**
*W pliku genetyczne.py*
def generateGeny(data):
geny = []
zajeteRegaly = data.zajeteRegaly[:]
for r in zajeteRegaly:
g = Gene()
g.kordy = r
g.unbox1 = policzCost(data.astarMap,r,data.unbox[0])
if(len(data.unbox) > 1):
g.unbox2 = policzCost(data.astarMap,r,data.unbox[1])
geny.append(g)
return geny
def genRandomChromosome(data):
chromosome = generateGeny(data)
random.shuffle(chromosome)
unboxLastGen = None
for gen in chromosome:
gen.unboxWczesniejszegoGenu = unboxLastGen
krotkaKosztJakiUnbox = wybierzUnbox(gen, data.jakLiczycKoszt)
unboxLastGen = krotkaKosztJakiUnbox[1]
gen.kordyUnboxa = data.unbox[krotkaKosztJakiUnbox[1]]
return chromosome
Odpowiednio:
* Funkcja *generateGeny* generuje oraz oblicza wartości unboxów dla danego regału oraz zwraca je jako listę genów
* Funkcja *genRandomChromosome* losowo miesza wygenerowane geny oraz dla podanej wartości **unbox** (podanej przy uruchomieniu programu) zapisuje w genach wartości odpowiadające koodrynatom unboxa oraz z jakiego unboxa wózek przyjedzie. W przypadku pierwszego genu, do którego wózek będzie jechać z określonego miejsca ta wartość pozostaje *None*. Funkcja zwraca spójny chromosom.
#### Generowanie Losowej populacji
*W pliku genetyczne.py*
def genRandomPopulation(data, ileWPopulacji):
populacja = []
for i in range(ileWPopulacji):
populacja.append(genRandomChromosome(data))
return populacja
Odpowiednio:
* Dla podanej wartości *ileWPopulacji* funkcja generuje losową populację wykorzystując metodę losowego chromosomu, wykonując tyle iteracji ile wynosi wartość.
#### Selekcyjny wybór najlepszych chromosomów z pośród populacji na podstawie funkcji fitness
*W pliku genetyczne.py*
def fitness(chromosome, data):
koszt = 0
unboxPoprzedniegoGenu = None
for item, gen in enumerate(chromosome):
if(item == 0):
koszt += policzCost(data.astarMap, data.kordyWozka, gen.kordy)
krotkaKosztJakiUnbox = wybierzUnbox(gen, data.jakLiczycKoszt)
koszt += krotkaKosztJakiUnbox[0]
unboxPoprzedniegoGenu = krotkaKosztJakiUnbox[1]
else:
if unboxPoprzedniegoGenu == 0:
koszt += gen.unbox1
elif unboxPoprzedniegoGenu == 1:
koszt += gen.unbox2
krotkaKosztJakiUnbox = wybierzUnbox(gen, data.jakLiczycKoszt)
koszt += krotkaKosztJakiUnbox[0]
unboxPoprzedniegoGenu = krotkaKosztJakiUnbox[1]
return koszt
Odpowiednio:
* Zmienna *koszt* jest sumą całkowitą kosztów przejechania trasy.
* Pętla *for* iteruje się tyle razy ile jest genów w chromosomie.
* W pierwszej iteracji koszt jest liczony dla pierwszego genu w chromosomie wywołując AStar, z pozycji początkowej wózka do miejsca regału.
* Dla reszty iteracji jest sprawdzane do którego unboxa będzie jechać wózek, i taka wartość kosztu jest dodawana co całkowitej sumy oraz koszt przejechania od unboxa poprzedniego genu do regału (zmienna *unboxPoprzedniegoGenu*)
def dwieNajlepsze(populacja, data):
tmpPopulacja = populacja[:]
chromFitness = []
for chrom in populacja:
chromFitness.append(fitness(chrom,data))
bestValue = min(chromFitness)
bestChromIndex = chromFitness.index(bestValue)
pierwsza = tmpPopulacja[bestChromIndex]
if (data.best == None):
data.best = (pierwsza[:],bestValue)
elif(data.best[1] > bestValue):
data.best = (pierwsza[:],bestValue)
data.doWykresu.append(bestValue)
tmpPopulacja.pop(bestChromIndex)
chromFitness.pop(bestChromIndex)
bestValue = min(chromFitness)
bestChromIndex = chromFitness.index(bestValue)
druga = tmpPopulacja[bestChromIndex]
tmpPopulacja.pop(bestChromIndex)
chromFitness.pop(bestChromIndex)
return (pierwsza, druga)
Funkcja selekcji dla której odpowiednio:
* W pierwszej pętli *for* tworzy się lista *chromFitness* przetrzymująca wartości kosztów dla danego chromosomu. Wartości w *chromFitness* odpowiadają chromosomom na tych samych indeksach w liście populacja.
* Zmienna *bestValue* reprezentuje najlepszy koszt z danej populacji
* Zmienna *pierwsza* reprezentuje chromosom o najkorzystniejszym koszcie.
* Zmienna *druga* reprezentuje chromosom o drugim co do wartości najkorzystniejszym koszcie.
* W zmiennej *best* klasy obiektu *data* zapisywana jest krotka odpowiednio (chromosom,koszt) najlepszego chromosomu.
* Funkcja zwraca krotkę z dwoma najlepszymi chromosomami w populacji.
#### Generowanie nowej populacji - Crossover
*W pliku genetyczne.py*
def crossover(data,pierwszy, drugi, fragmentLiczba, wspMutacji):
ileWChrom = len(pierwszy)
tmp = random.randint(0, ileWChrom-fragmentLiczba)
kordyFragment = (tmp,tmp+fragmentLiczba)
nowyChrom = [Gene() for q in range(ileWChrom)]
iterator = kordyFragment[1]
pomIterator = kordyFragment[1]
usedKordy = []
for i in range(kordyFragment[0],kordyFragment[1]):
nowyChrom[i].kordy = pierwszy[i].kordy
nowyChrom[i].unbox1 = pierwszy[i].unbox1
nowyChrom[i].unbox2 = pierwszy[i].unbox2
usedKordy.append(pierwszy[i].kordy)
for x in range(ileWChrom):
if(iterator > ileWChrom - 1):
iterator = 0
if(pomIterator > ileWChrom - 1):
pomIterator = 0
if(nowyChrom[iterator].kordy == None and drugi[pomIterator].kordy not in usedKordy):
nowyChrom[iterator].kordy = drugi[pomIterator].kordy
nowyChrom[iterator].kordy = drugi[pomIterator].kordy
nowyChrom[iterator].unbox1 = drugi[pomIterator].unbox1
nowyChrom[iterator].unbox2 = drugi[pomIterator].unbox2
iterator += 1
pomIterator += 1
else:
pomIterator +=1
nowyChrom = mutate(wspMutacji, nowyChrom)
unboxLastGen = None
for gen in nowyChrom:
gen.unboxWczesniejszegoGenu = unboxLastGen
krotkaKosztJakiUnbox = wybierzUnbox(gen, data.jakLiczycKoszt)
unboxLastGen = krotkaKosztJakiUnbox[1]
gen.kordyUnboxa = data.unbox[krotkaKosztJakiUnbox[1]]
return nowyChrom
Odpowiednio:
* Dane wejściowe są to:
* *pierwszy*, *drugi* - wybrane najkorzystniejsze chromosomy, z których ma powstać nowy chromosom
* *fragmentLiczba* - jest to liczba reprezentująca jaki fragment z **pierwszego** chromosomu zostanie bezpośrednio skopiowany do nowego chromosomu, ten fragment jest wybierany losowo spośród chromosomu natomiast jego długość jest określona procentowo i zależy od podanej wartości (oraz ilości genów w chromosomoie)
* *wspMutacji* - jest to liczba reprezentująca jak wiele par w chromosomie zostanie zamienionych miejscami.
* Zmienne pomocnicze:
* *iterator*, *pomIterator* - w pierwszych dwóch instrukcjach warunkowych jest pilnowane aby iterując się nie przekroczyły dopuszczalnej wartości (odpowiadają one indeksom w kolejce). *Iterato* jest indeksem w nowym, tworzonym chromosomie. *pomIterator* jest indeksem który przechodzi przez **drugi** podany chromosom.
* lista *usedKordy* - do niej są dodawane koordynaty genów, które zostały skopiowane z **pierwszego** chromosomu, aby geny o tych samych koordynatach z **drugiego** chromosomu nie zostały zapisane w nowym chromosomie.
* Następuje skopiowanie fagmentu z **pierwszego** chromosomu, w pierwszej pętli *for* wykonuje się przepisanie wartości do powstającego chromosomu. W drugiej pętli *for* następuje przepisanie pozostałych wartości z **drugiego** chromosomu do powstającego chromosomu.
* Po przepisaniu wartości według wspMutacji jest dokonywana zamiana genów w nowym chromosomie.
* Ostatnia pętla **for** łączy geny ze sobą (zapisując unbox poprzedniego genu)
*W pliku genetyczne.py*
def genPopulacje(data,pierwszy, drugi, ileWPopulacji, fragmentLiczba, wspMutacji):
ileWChrom = len(pierwszy)
fragment = round(fragmentLiczba*ileWChrom)
if(fragment == 1):
fragment +=1
nowaPopulacja = []
for i in range(ileWPopulacji):
nowaPopulacja.append(crossover(data,pierwszy,drugi,fragment, wspMutacji))
return nowaPopulacja
Odpowiednio:
* W pętli *for* tworzone są nowe chromosomy z **pierwszego** oraz **drugiego** najlepszego chromosomu z poprzedniej generacji.
* Nowe chromosomy zapisywane są do *nowaPopulacja*
* Z powstałej populacji na nowo selekcjonowane są dwa najlepsze, z których będą powstawać nowe populacje w zależności od wartości podanych generacji.
### Dalsze działanie programu
Po wykonaniu iteracji uruchamia się okienko pokazujące wykres najlepszych wag otrzymywanych w danej populacji.
Po zamknięciu okienka wózek zaczyna rozwozić paczki do miejsc oddania paczki.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

224
funkcje.py Normal file
View File

@ -0,0 +1,224 @@
from unboxOnTheFloor import UnboxOnTheFloor
from box import Box
from AStar import AStar
import random
from easygui import *
import matplotlib.pyplot as plt
def zbierzBox(gen,data, moves, kordStartowy):
regalKordy = gen.kordy
star = AStar()
mapForAStar = data.astarMap[:]
mapForAStar[regalKordy[0]][regalKordy[1]] = 0
path = star.search([kordStartowy[0], kordStartowy[1]], regalKordy, mapForAStar, 1, 1)
cns = kordStartowy[0]
cwe = kordStartowy[1]
value = path[cns][cwe]
while True:
if cns > 0 and path[cns - 1][cwe] == (value + 1):
cns = cns - 1
moves.append(1)
value = value + 1
continue
if cns < (len(mapForAStar) - 1) and path[cns + 1][cwe] == (value + 1):
cns = cns + 1
moves.append(2)
value = value + 1
continue
if cwe > 0 and path[cns][cwe - 1] == (value + 1):
cwe = cwe - 1
moves.append(3)
value = value + 1
continue
if cwe < (len(mapForAStar[0]) - 1) and path[cns][cwe + 1] == (value + 1):
cwe = cwe + 1
moves.append(4)
value = value + 1
continue
break
mapForAStar[regalKordy[0]][regalKordy[1]] = 1
# wyszukiwanie ścieżki z miejsca podjęcia paczki do regału
# zmienna path posiada macierz oraz kroki podjęte przez wózek
path = star.search([regalKordy[0], regalKordy[1]], gen.kordyUnboxa, mapForAStar, 1, 1)
#mapForAStar[where[0]][where[1]] = 1
value = path[cns][cwe]
while True:
if(value == 0):
if(path[cns - 1][cwe] == 1):
cns = cns - 1
elif(path[cns + 1][cwe] == 1):
cns = cns + 1
elif(path[cns][cwe - 1] == 1):
cwe = cwe - 1
elif(path[cns][cwe + 1] == 1):
cwe = cwe + 1
value = path[cns][cwe]
continue
if cns > 0 and path[cns - 1][cwe] == (value + 1):
cns = cns - 1
moves.append(1)
value = value + 1
continue
if cns < (len(mapForAStar) - 1) and path[cns + 1][cwe] == (value + 1):
cns = cns + 1
moves.append(2)
value = value + 1
continue
if cwe > 0 and path[cns][cwe - 1] == (value + 1):
cwe = cwe - 1
moves.append(3)
value = value + 1
continue
if cwe < (len(mapForAStar[0]) - 1) and path[cns][cwe + 1] == (value + 1):
cwe = cwe + 1
moves.append(4)
value = value + 1
continue
break
def rysujWykres(data, x, yStart, yEnd):
plt.axis([0, x,yStart, yEnd])
for i in range(0, len(data.doWykresu) - 1):
y = data.doWykresu[i]
x = i
plt.scatter(x, y)
plt.pause(0.0001)
plt.show()
def znajdzUnbox(data,mapa):
unboxy = []
iterator = 0
ostatniWiersz = len(mapa) -1
for x in mapa[ostatniWiersz]:
if (isinstance(x, UnboxOnTheFloor)):
unboxy.append((ostatniWiersz, iterator))
iterator += 1
data.unbox = unboxy
def policzCost(mapaBoxy, poczatek, koniec):
astar = AStar()
koszt = astar.search(poczatek, koniec, mapaBoxy, 1, 0)
return koszt
def wybierzUnbox(gen, jakLiczycKoszt): #funkcja ustawiajaca jaki unbox
if(jakLiczycKoszt == 0):
x = random.choice([gen.unbox1, gen.unbox2])
if(x == gen.unbox1):
y = 0
else:
y= 1
return (x,y)
elif(jakLiczycKoszt == 1):
return (gen.unbox1,0)
elif(jakLiczycKoszt == 2):
return (gen.unbox2,1)
elif(jakLiczycKoszt == 3):
x = min(gen.unbox1,gen.unbox2)
if(x == gen.unbox1):
y = 0
else:
y = 1
return (x,y)
def randomBox(mapa, regals, ile):
regals = regals
mapa = mapa
tupleList = []
ileRegalow = len(regals)
iteration = 0
while iteration < ileRegalow and iteration < ile:
regal = random.choice(regals)
if regal in tupleList:
continue
else:
tupleList.append(regal)
iteration+=1
for (i,j,x) in tupleList:
box = Box()
mapa[i][j].put(box)
"""
for t in tupleList:
listaRegalow.append((t[0],t[1]))
data.zajeteRegaly = listaRegalow
"""
return mapa
def znajdzBox(mapa, regals):
zajeteRegaly = []
for (x,y,z) in regals:
shelf = mapa[x][y]
tmp = shelf.occupied
if(tmp == True):
zajeteRegaly.append((x,y))
return zajeteRegaly
#wybiera z populacji dwa najlepsze chromosomy
def updateMap(data, map, mapForAstar, regals):
data.mapa = map
znajdzUnbox(data, map)
data.zajeteRegaly = znajdzBox(map, regals)
data.astarMap = data.genMap(mapForAstar)
def okno():
good = True
fieldValues = multenterbox("Wprowadź warunki początkowe", "Start algorytmu genetycznego", ["Ile chrom. w generacji", "Wielkosc dziedziczonego fragmentu (x>0 and x<1)", "Wartosc mutacji (x>0 and x<1)", "Unbox: (0or 1 or 2 or 2)", "Ile generacji"])
if(fieldValues[0].isnumeric() and (fieldValues[0]!="")):
good = False
elif(good==True):
msgbox("Wartość nie jest liczbą", "Błąd")
good = False
if(fieldValues[1].isnumeric() and (fieldValues[1]!="")):
if((int(fieldValues[1])<=0) and (good==True) and (int(fieldValues[1])>= 1)):
msgbox("Zla wartosc fragmentu")
good = False
elif (good == True):
msgbox("Wartość nie jest liczbą", "Błąd")
good = False
if(fieldValues[2].isnumeric() and (fieldValues[2]!="")):
if((int(fieldValues[1])<=0) and (good==True) and (int(fieldValues[1])>= 1)):
msgbox("Zla wartosc mutacji")
good = False
elif (good == True):
msgbox("Wartość nie jest liczbą", "Błąd")
good = False
if(fieldValues[3].isnumeric() and (fieldValues[3]!="")):
if(((int(fieldValues[3]) != 0) or (int(fieldValues[3]) != 1) or (int(fieldValues[3]) != 2) or (int(fieldValues[3]) != 3)) and (good==True)):
msgbox("Zla wartosc unboxa")
good = False
elif (good == True):
msgbox("Wartość nie jest liczbą", "Błąd")
good = False
if(fieldValues[4].isnumeric() and (fieldValues[4]!="")):
pass
else:
msgbox("Wartość nie jest liczbą", "Błąd")
good = False
if(good == True):
return [fieldValues[0], fieldValues[1], fieldValues[2],fieldValues[3]]

View File

@ -168,7 +168,15 @@ class Generate:
all[wysokosc-2][szerokosc-2] = 1 all[wysokosc-2][szerokosc-2] = 1
all[0][2] = 2 all[0][2] = 2
all[1][2] = 2 all[1][2] = 2
#zmiana miejsca zrzutu paczki, unboxOnTheFloor
all[wysokosc-2][szerokosc-3] = 2 all[wysokosc-2][szerokosc-3] = 2
all[wysokosc-1][szerokosc-3] = 23 all[wysokosc-1][szerokosc-3] = 23
all[wysokosc-2][szerokosc-4] = 1 all[wysokosc-2][szerokosc-4] = 1
all[wysokosc-2][2] = 2
all[wysokosc-1][2] = 23
all[wysokosc-2][3] = 1
return all return all

183
genetyczne.py Normal file
View File

@ -0,0 +1,183 @@
from funkcje import *
from Gene import Gene
def start(data, wheel):
ileGeneracji = 20
ileWPopulacji = 16
fragment = 0.5
mutacja = 0.05
unbox = 3
data.kordyWozka = (wheel.ns, wheel.we)
data.jakLiczycKoszt = unbox
randomPopulation = genRandomPopulation(data, ileWPopulacji)
for i in range(ileGeneracji):
if i == 0:
best2 = dwieNajlepsze(randomPopulation, data)
else:
x = genPopulacje(data,best2[0], best2[1], ileWPopulacji, fragment, mutacja)
best2 = dwieNajlepsze(x, data)
del x
data.histZmian.append(data.best[1])
rysujWykres(data, ileGeneracji, 0, 2000)
def generateGeny(data):
geny = []
zajeteRegaly = data.zajeteRegaly[:]
for r in zajeteRegaly:
g = Gene()
g.kordy = r
g.unbox1 = policzCost(data.astarMap,r,data.unbox[0])
if(len(data.unbox) > 1):
g.unbox2 = policzCost(data.astarMap,r,data.unbox[1])
geny.append(g)
return geny
def genRandomChromosome(data):
chromosome = generateGeny(data)
random.shuffle(chromosome)
unboxLastGen = None
for gen in chromosome:
gen.unboxWczesniejszegoGenu = unboxLastGen
krotkaKosztJakiUnbox = wybierzUnbox(gen, data.jakLiczycKoszt)
unboxLastGen = krotkaKosztJakiUnbox[1]
gen.kordyUnboxa = data.unbox[krotkaKosztJakiUnbox[1]]
return chromosome
def genRandomPopulation(data, ileWPopulacji):
populacja = []
for i in range(ileWPopulacji):
populacja.append(genRandomChromosome(data))
return populacja
def fitness(chromosome, data):
koszt = 0
unboxPoprzedniegoGenu = None
for item, gen in enumerate(chromosome):
if(item == 0):
koszt += policzCost(data.astarMap, data.kordyWozka, gen.kordy)
krotkaKosztJakiUnbox = wybierzUnbox(gen, data.jakLiczycKoszt)
koszt += krotkaKosztJakiUnbox[0]
unboxPoprzedniegoGenu = krotkaKosztJakiUnbox[1]
else:
if unboxPoprzedniegoGenu == 0:
koszt += gen.unbox1
elif unboxPoprzedniegoGenu == 1:
koszt += gen.unbox2
krotkaKosztJakiUnbox = wybierzUnbox(gen, data.jakLiczycKoszt)
koszt += krotkaKosztJakiUnbox[0]
unboxPoprzedniegoGenu = krotkaKosztJakiUnbox[1]
return koszt
def dwieNajlepsze(populacja, data):
tmpPopulacja = populacja[:]
chromFitness = []
for chrom in populacja:
chromFitness.append(fitness(chrom,data))
bestValue = min(chromFitness)
bestChromIndex = chromFitness.index(bestValue)
pierwsza = tmpPopulacja[bestChromIndex]
if (data.best == None):
data.best = (pierwsza[:],bestValue)
elif(data.best[1] > bestValue):
data.best = (pierwsza[:],bestValue)
data.doWykresu.append(bestValue)
tmpPopulacja.pop(bestChromIndex)
chromFitness.pop(bestChromIndex)
bestValue = min(chromFitness)
bestChromIndex = chromFitness.index(bestValue)
druga = tmpPopulacja[bestChromIndex]
tmpPopulacja.pop(bestChromIndex)
chromFitness.pop(bestChromIndex)
return (pierwsza, druga)
def crossover(data,pierwszy, drugi, fragmentLiczba, wspMutacji):
ileWChrom = len(pierwszy)
tmp = random.randint(0, ileWChrom-fragmentLiczba)
kordyFragment = (tmp,tmp+fragmentLiczba)
nowyChrom = [Gene() for q in range(ileWChrom)]
iterator = kordyFragment[1]
pomIterator = kordyFragment[1]
usedKordy = []
for i in range(kordyFragment[0],kordyFragment[1]):
nowyChrom[i].kordy = pierwszy[i].kordy
nowyChrom[i].unbox1 = pierwszy[i].unbox1
nowyChrom[i].unbox2 = pierwszy[i].unbox2
usedKordy.append(pierwszy[i].kordy)
for x in range(ileWChrom):
if(iterator > ileWChrom - 1):
iterator = 0
if(pomIterator > ileWChrom - 1):
pomIterator = 0
if(nowyChrom[iterator].kordy == None and drugi[pomIterator].kordy not in usedKordy):
nowyChrom[iterator].kordy = drugi[pomIterator].kordy
nowyChrom[iterator].kordy = drugi[pomIterator].kordy
nowyChrom[iterator].unbox1 = drugi[pomIterator].unbox1
nowyChrom[iterator].unbox2 = drugi[pomIterator].unbox2
iterator += 1
pomIterator += 1
else:
pomIterator +=1
nowyChrom = mutate(wspMutacji, nowyChrom)
unboxLastGen = None
for gen in nowyChrom:
gen.unboxWczesniejszegoGenu = unboxLastGen
krotkaKosztJakiUnbox = wybierzUnbox(gen, data.jakLiczycKoszt)
unboxLastGen = krotkaKosztJakiUnbox[1]
gen.kordyUnboxa = data.unbox[krotkaKosztJakiUnbox[1]]
return nowyChrom
def genPopulacje(data,pierwszy, drugi, ileWPopulacji, fragmentLiczba, wspMutacji):
ileWChrom = len(pierwszy)
fragment = round(fragmentLiczba*ileWChrom)
if(fragment == 1):
fragment +=1
nowaPopulacja = []
for i in range(ileWPopulacji):
nowaPopulacja.append(crossover(data,pierwszy,drugi,fragment, wspMutacji))
return nowaPopulacja
def mutate(wspMutacji, chrom): #w zaleznosci od tego jak wiele mutwac wybierz pary i zamien miejscami
ileWChrom = len(chrom)
ileZmian = round(ileWChrom * wspMutacji)
for i in range(ileZmian):
pom = None
pierw = random.randint(0,ileWChrom - 1)
drug = random.randint(0,ileWChrom - 1)
pom = chrom[pierw]
chrom[pierw] = chrom[drug]
chrom[drug] = pom
return chrom

10
main.py
View File

@ -6,6 +6,7 @@ def main():
good = False good = False
while (True): while (True):
good = True good = True
"""
fieldValues = multenterbox("Wprowadź warunki początkowe", "Start programu", ["Szerekość kraty (>=6)", "Wysokość kraty (>=7)", "Ilość regałów kruchych", "Ilość regałów łatwopalnych", "Ilość regałów radioaktywnych", "Ilość regałów niebezpiecznych"]) fieldValues = multenterbox("Wprowadź warunki początkowe", "Start programu", ["Szerekość kraty (>=6)", "Wysokość kraty (>=7)", "Ilość regałów kruchych", "Ilość regałów łatwopalnych", "Ilość regałów radioaktywnych", "Ilość regałów niebezpiecznych"])
if(fieldValues[0].isnumeric() and (fieldValues[0]!="")): if(fieldValues[0].isnumeric() and (fieldValues[0]!="")):
if(int(fieldValues[0])<=5): if(int(fieldValues[0])<=5):
@ -30,7 +31,14 @@ def main():
elif (good == True): elif (good == True):
msgbox("Wartość nie jest liczbą", "Błąd") msgbox("Wartość nie jest liczbą", "Błąd")
good = False good = False
"""
if good: if good:
window = MainWindow(int(fieldValues[0]), int(fieldValues[1]), int(fieldValues[2]), int(fieldValues[3]), int(fieldValues[4]), int(fieldValues[5])); szerokosc = 15#min 6
wysokosc = 10 #min 7
kruche = 1
latwopalne = 1
radioaktywne = 1
niebezpieczne= 1
window = MainWindow(szerokosc, wysokosc, kruche, latwopalne, radioaktywne, niebezpieczne);
break break
main() main()

View File

@ -15,6 +15,8 @@ from neurons import Neurons
from whereDecision import WhereDecision from whereDecision import WhereDecision
from Evencik import Evencik from Evencik import Evencik
import pathlib import pathlib
from Data import Data
from genetyczne import *
class MainWindow: class MainWindow:
def __init__(self, szerokosc, wysokosc, kruche, latwopalne, radioaktywne, niebezpieczne): def __init__(self, szerokosc, wysokosc, kruche, latwopalne, radioaktywne, niebezpieczne):
@ -25,6 +27,7 @@ class MainWindow:
pygame.display.set_caption('Inteligentny wózek widłowy') pygame.display.set_caption('Inteligentny wózek widłowy')
self.clock = pygame.time.Clock() self.clock = pygame.time.Clock()
self.ticks = 0 self.ticks = 0
self.data = Data()
self.moves = [] self.moves = []
self.regals = [] self.regals = []
self.map = Generate.generate(szerokosc+2, wysokosc+2, kruche, latwopalne, radioaktywne, niebezpieczne) self.map = Generate.generate(szerokosc+2, wysokosc+2, kruche, latwopalne, radioaktywne, niebezpieczne)
@ -44,12 +47,21 @@ class MainWindow:
self.mapForAStar[i][j] = 0 self.mapForAStar[i][j] = 0
elif (self.map[i][j]==23): elif (self.map[i][j]==23):
self.map[i][j] = UnboxOnTheFloor(self.screen, self.cell, i, j) self.map[i][j] = UnboxOnTheFloor(self.screen, self.cell, i, j)
self.mapForAStar[i][j] = 1 self.mapForAStar[i][j] = 0
else: else:
#regals (kordy i,j oraz rodzaj regału)
self.regals.append((i, j, (self.map[i][j]-3)//4)) self.regals.append((i, j, (self.map[i][j]-3)//4))
self.map[i][j] = Shelf(self.screen, self.cell, i, j, (self.map[i][j]-3)%4, (self.map[i][j]-3)//4) self.map[i][j] = Shelf(self.screen, self.cell, i, j, (self.map[i][j]-3)%4, (self.map[i][j]-3)//4)
self.mapForAStar[i][j] = 1 self.mapForAStar[i][j] = 1
#loop
#################################################
#loop
while True: while True:
self.events() self.events()
self.draw() self.draw()
@ -66,14 +78,30 @@ class MainWindow:
self.wheel.move(Evencik(pygame.K_LEFT), self.map) self.wheel.move(Evencik(pygame.K_LEFT), self.map)
elif (self.moves[0]==4): elif (self.moves[0]==4):
self.wheel.move(Evencik(pygame.K_RIGHT), self.map) self.wheel.move(Evencik(pygame.K_RIGHT), self.map)
self.moves.pop(0) self.moves.pop(0)
def events(self): def events(self):
for event in pygame.event.get(): for event in pygame.event.get():
if(event.type==pygame.QUIT): if(event.type==pygame.QUIT):
sys.exit() sys.exit()
elif(event.type==pygame.KEYDOWN): elif(event.type==pygame.KEYDOWN):
if len(self.moves)==0: if event.key == pygame.K_g:
start(self.data,self.wheel)
for gen in self.data.best[0]:
if(gen.unboxWczesniejszegoGenu == None):
kordStartowy = (self.wheel.ns, self.wheel.we)
else:
kordStartowy = self.data.unbox[gen.unboxWczesniejszegoGenu]
zbierzBox(gen,self.data, self.moves, kordStartowy)
elif(event.key== pygame.K_r):
self.map = randomBox(self.map, self.regals, 15)
updateMap(self.data, self.map, self.mapForAStar, self.regals)
elif len(self.moves)==0:
self.wheel.move(event, self.map) self.wheel.move(event, self.map)
elif(event.type==pygame.MOUSEBUTTONDOWN): elif(event.type==pygame.MOUSEBUTTONDOWN):
if (type(self.map[0][2]) == Floor): if (type(self.map[0][2]) == Floor):
meh = easygui.fileopenbox("Wybierz zdjęcie paczki", "Wybierz zdjęcie paczki", filetypes = [["*.jpg", "*.jpeg", "*.png", "Pliki graficzne"]]) meh = easygui.fileopenbox("Wybierz zdjęcie paczki", "Wybierz zdjęcie paczki", filetypes = [["*.jpg", "*.jpeg", "*.png", "Pliki graficzne"]])
@ -86,8 +114,9 @@ class MainWindow:
whatIsIt = self.neurons.whatIsIt(meh) whatIsIt = self.neurons.whatIsIt(meh)
where = self.whereDecision.recognize(whatIsIt, self.regalsik()) where = self.whereDecision.recognize(whatIsIt, self.regalsik())
self.map[0][2] = BoxOnTheFloor(self.screen, self.cell, 0, 2, Box()) self.map[0][2] = BoxOnTheFloor(self.screen, self.cell, 0, 2, Box())
star = AStar() star = AStar()
path = star.search([self.wheel.ns, self.wheel.we], [0, 2], self.mapForAStar, 1) path = star.search([self.wheel.ns, self.wheel.we], [0, 2], self.mapForAStar, 1, 1)
cns = self.wheel.ns cns = self.wheel.ns
cwe = self.wheel.we cwe = self.wheel.we
value = path[cns][cwe] value = path[cns][cwe]
@ -114,7 +143,9 @@ class MainWindow:
continue continue
break break
self.mapForAStar[where[0]][where[1]] = 0 self.mapForAStar[where[0]][where[1]] = 0
path = star.search([0, 2], where, self.mapForAStar, 1) # wyszukiwanie ścieżki z miejsca podjęcia paczki do regału
# zmienna path posiada macierz oraz kroki podjęte przez wózek
path = star.search([0, 2], where, self.mapForAStar, 1, 1)
self.mapForAStar[where[0]][where[1]] = 1 self.mapForAStar[where[0]][where[1]] = 1
value = path[cns][cwe] value = path[cns][cwe]
while True: while True:
@ -139,6 +170,8 @@ class MainWindow:
value=value+1 value=value+1
continue continue
break break
self.data.zajeteRegaly = znajdzBox(self.map, self.regals)
def draw(self): def draw(self):
self.screen.fill((33,69,108)) self.screen.fill((33,69,108))
for i in range(len(self.map)): for i in range(len(self.map)):

View File

@ -6,5 +6,6 @@ class UnboxOnTheFloor:
self.ns = ns self.ns = ns
self.we = we self.we = we
self.screen = screen self.screen = screen
def draw(self): def draw(self):
pass pass

View File

@ -7,6 +7,7 @@ from shelf import Shelf
class Wheel: class Wheel:
def __init__(self, screen, cell): def __init__(self, screen, cell):
self.cell = cell self.cell = cell
#kordy wozka
self.ns = 1 self.ns = 1
self.we = 2 self.we = 2
self.direction = 3 self.direction = 3
@ -55,7 +56,7 @@ class Wheel:
elif(self.occupied==False and krata[self.ns+1][self.we].isOccupied()==True and krata[self.ns+1][self.we].kierunek==1): elif(self.occupied==False and krata[self.ns+1][self.we].isOccupied()==True and krata[self.ns+1][self.we].kierunek==1):
self.putBox(krata[self.ns+1][self.we].get()) self.putBox(krata[self.ns+1][self.we].get())
self.direction = 3 self.direction = 3
elif(type(krata[self.ns+1][self.we])==UnboxOnTheFloor): elif(type(krata[self.ns+1][self.we])==UnboxOnTheFloor): # Aktywacja unBoxOnTheFloor jak wózek najedzie na pole przed nim
if(self.ns+1==len(krata)-1): if(self.ns+1==len(krata)-1):
self.ns+=1 self.ns+=1
self.m_ns=self.cell*(-1) self.m_ns=self.cell*(-1)

View File

@ -59,4 +59,5 @@ class WhereDecision:
y = prenumeratorzy["lokacja"] y = prenumeratorzy["lokacja"]
drzewko = DecisionTreeClassifier(criterion="entropy") drzewko = DecisionTreeClassifier(criterion="entropy")
drzewko.fit(X=z, y=y) drzewko.fit(X=z, y=y)
return list(make_tuple(lokacja_kody[drzewko.predict(recognize)][0])) tmp = list(make_tuple(lokacja_kody[drzewko.predict(recognize)][0]))
return tmp