Merge branch 'master' of s444425/AI into master
This commit is contained in:
commit
c960a23fa0
13
.idea/AI.iml
Normal file
13
.idea/AI.iml
Normal 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
4
.idea/encodings.xml
Normal file
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding" addBOMForNewFiles="with NO BOM" />
|
||||
</project>
|
6
.idea/libraries/R_User_Library.xml
Normal file
6
.idea/libraries/R_User_Library.xml
Normal file
@ -0,0 +1,6 @@
|
||||
<component name="libraryTable">
|
||||
<library name="R User Library">
|
||||
<CLASSES />
|
||||
<SOURCES />
|
||||
</library>
|
||||
</component>
|
4
.idea/misc.xml
Normal file
4
.idea/misc.xml
Normal 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
8
.idea/modules.xml
Normal 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
6
.idea/vcs.xml
Normal 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
662
.idea/workspace.xml
Normal 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>
|
25
AStar.py
25
AStar.py
@ -16,8 +16,8 @@ class AStar:
|
||||
result[path[i][0]][path[i][1]] = startValue
|
||||
startValue+=1
|
||||
return result
|
||||
|
||||
def search(self, start, end, grid, cost):
|
||||
######################################################### w current jest koszt do przebycia
|
||||
def search(self, start, end, grid, cost, flaga): #start to kordy wózka, end miejsce podjęcia paczki
|
||||
noRows, noColumns = numpy.shape(grid)
|
||||
startNode = AStarState(None, tuple(start))
|
||||
endNode = AStarState(None, tuple(end))
|
||||
@ -41,32 +41,51 @@ class AStar:
|
||||
if item.g<current.g:
|
||||
current = item
|
||||
currentIndeks = indeks
|
||||
if iterations>max and flaga == 0: #podprojekt genetyczne
|
||||
return current.g
|
||||
if iterations>max:
|
||||
return self.returnPath(current, grid)
|
||||
visited.append(current)
|
||||
toVisit.pop(currentIndeks)
|
||||
if current==endNode and flaga == 0:
|
||||
return current.g
|
||||
if current==endNode:
|
||||
return self.returnPath(current, grid)
|
||||
return self.returnPath(current, grid) #zwracanie wagi przejscia
|
||||
children = []
|
||||
for new in moves:
|
||||
positions = (current.position[0]+new[0], current.position[1]+new[1])
|
||||
|
||||
if (positions[0] > (noRows - 1) or
|
||||
positions[0] < 0 or
|
||||
positions[1] > (noColumns - 1) or
|
||||
positions[1] < 0):
|
||||
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:
|
||||
continue
|
||||
|
||||
children.append(AStarState(current, positions))
|
||||
for child in children:
|
||||
|
||||
if len([visitedChild for visitedChild in visited if visitedChild==child])>0:
|
||||
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):
|
||||
child.g = current.g + (10 * cost)
|
||||
else:
|
||||
child.g = current.g + cost
|
||||
child.h = (((child.position[0]-endNode.position[0]) ** 2) + ((child.position[1]-endNode.position[1]) ** 2))
|
||||
child.f = child.g + child.h
|
||||
|
||||
if len([i for i in toVisit if child==i and child.g>i.g])>0:
|
||||
continue
|
||||
|
||||
toVisit.append(child)
|
||||
|
||||
|
||||
|
||||
|
||||
|
22
Data.py
Normal file
22
Data.py
Normal 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
9
Gene.py
Normal 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
320
LechT.md
Normal 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.
|
BIN
__pycache__/AStar.cpython-37.pyc
Normal file
BIN
__pycache__/AStar.cpython-37.pyc
Normal file
Binary file not shown.
BIN
__pycache__/AStarState.cpython-37.pyc
Normal file
BIN
__pycache__/AStarState.cpython-37.pyc
Normal file
Binary file not shown.
BIN
__pycache__/Data.cpython-37.pyc
Normal file
BIN
__pycache__/Data.cpython-37.pyc
Normal file
Binary file not shown.
BIN
__pycache__/Evencik.cpython-37.pyc
Normal file
BIN
__pycache__/Evencik.cpython-37.pyc
Normal file
Binary file not shown.
BIN
__pycache__/Gene.cpython-37.pyc
Normal file
BIN
__pycache__/Gene.cpython-37.pyc
Normal file
Binary file not shown.
BIN
__pycache__/box.cpython-37.pyc
Normal file
BIN
__pycache__/box.cpython-37.pyc
Normal file
Binary file not shown.
BIN
__pycache__/boxOnTheFloor.cpython-37.pyc
Normal file
BIN
__pycache__/boxOnTheFloor.cpython-37.pyc
Normal file
Binary file not shown.
BIN
__pycache__/floor.cpython-37.pyc
Normal file
BIN
__pycache__/floor.cpython-37.pyc
Normal file
Binary file not shown.
BIN
__pycache__/funkcje.cpython-37.pyc
Normal file
BIN
__pycache__/funkcje.cpython-37.pyc
Normal file
Binary file not shown.
BIN
__pycache__/generate.cpython-37.pyc
Normal file
BIN
__pycache__/generate.cpython-37.pyc
Normal file
Binary file not shown.
BIN
__pycache__/genetyczne.cpython-37.pyc
Normal file
BIN
__pycache__/genetyczne.cpython-37.pyc
Normal file
Binary file not shown.
BIN
__pycache__/neurons.cpython-37.pyc
Normal file
BIN
__pycache__/neurons.cpython-37.pyc
Normal file
Binary file not shown.
BIN
__pycache__/program.cpython-37.pyc
Normal file
BIN
__pycache__/program.cpython-37.pyc
Normal file
Binary file not shown.
BIN
__pycache__/shelf.cpython-37.pyc
Normal file
BIN
__pycache__/shelf.cpython-37.pyc
Normal file
Binary file not shown.
BIN
__pycache__/unboxOnTheFloor.cpython-37.pyc
Normal file
BIN
__pycache__/unboxOnTheFloor.cpython-37.pyc
Normal file
Binary file not shown.
BIN
__pycache__/wall.cpython-37.pyc
Normal file
BIN
__pycache__/wall.cpython-37.pyc
Normal file
Binary file not shown.
BIN
__pycache__/wheel.cpython-37.pyc
Normal file
BIN
__pycache__/wheel.cpython-37.pyc
Normal file
Binary file not shown.
BIN
__pycache__/whereDecision.cpython-37.pyc
Normal file
BIN
__pycache__/whereDecision.cpython-37.pyc
Normal file
Binary file not shown.
224
funkcje.py
Normal file
224
funkcje.py
Normal 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]]
|
@ -168,7 +168,15 @@ class Generate:
|
||||
all[wysokosc-2][szerokosc-2] = 1
|
||||
all[0][2] = 2
|
||||
all[1][2] = 2
|
||||
#zmiana miejsca zrzutu paczki, unboxOnTheFloor
|
||||
all[wysokosc-2][szerokosc-3] = 2
|
||||
all[wysokosc-1][szerokosc-3] = 23
|
||||
all[wysokosc-2][szerokosc-4] = 1
|
||||
|
||||
|
||||
all[wysokosc-2][2] = 2
|
||||
all[wysokosc-1][2] = 23
|
||||
all[wysokosc-2][3] = 1
|
||||
|
||||
return all
|
||||
|
||||
|
183
genetyczne.py
Normal file
183
genetyczne.py
Normal 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
10
main.py
@ -6,6 +6,7 @@ def main():
|
||||
good = False
|
||||
while (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"])
|
||||
if(fieldValues[0].isnumeric() and (fieldValues[0]!="")):
|
||||
if(int(fieldValues[0])<=5):
|
||||
@ -30,7 +31,14 @@ def main():
|
||||
elif (good == True):
|
||||
msgbox("Wartość nie jest liczbą", "Błąd")
|
||||
good = False
|
||||
"""
|
||||
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
|
||||
main()
|
41
program.py
41
program.py
@ -15,6 +15,8 @@ from neurons import Neurons
|
||||
from whereDecision import WhereDecision
|
||||
from Evencik import Evencik
|
||||
import pathlib
|
||||
from Data import Data
|
||||
from genetyczne import *
|
||||
|
||||
class MainWindow:
|
||||
def __init__(self, szerokosc, wysokosc, kruche, latwopalne, radioaktywne, niebezpieczne):
|
||||
@ -25,6 +27,7 @@ class MainWindow:
|
||||
pygame.display.set_caption('Inteligentny wózek widłowy')
|
||||
self.clock = pygame.time.Clock()
|
||||
self.ticks = 0
|
||||
self.data = Data()
|
||||
self.moves = []
|
||||
self.regals = []
|
||||
self.map = Generate.generate(szerokosc+2, wysokosc+2, kruche, latwopalne, radioaktywne, niebezpieczne)
|
||||
@ -44,11 +47,20 @@ class MainWindow:
|
||||
self.mapForAStar[i][j] = 0
|
||||
elif (self.map[i][j]==23):
|
||||
self.map[i][j] = UnboxOnTheFloor(self.screen, self.cell, i, j)
|
||||
self.mapForAStar[i][j] = 1
|
||||
self.mapForAStar[i][j] = 0
|
||||
|
||||
else:
|
||||
#regals (kordy i,j oraz rodzaj regału)
|
||||
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.mapForAStar[i][j] = 1
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#################################################
|
||||
#loop
|
||||
while True:
|
||||
self.events()
|
||||
@ -66,14 +78,30 @@ class MainWindow:
|
||||
self.wheel.move(Evencik(pygame.K_LEFT), self.map)
|
||||
elif (self.moves[0]==4):
|
||||
self.wheel.move(Evencik(pygame.K_RIGHT), self.map)
|
||||
|
||||
self.moves.pop(0)
|
||||
|
||||
def events(self):
|
||||
for event in pygame.event.get():
|
||||
if(event.type==pygame.QUIT):
|
||||
sys.exit()
|
||||
|
||||
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)
|
||||
|
||||
elif(event.type==pygame.MOUSEBUTTONDOWN):
|
||||
if (type(self.map[0][2]) == Floor):
|
||||
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)
|
||||
where = self.whereDecision.recognize(whatIsIt, self.regalsik())
|
||||
self.map[0][2] = BoxOnTheFloor(self.screen, self.cell, 0, 2, Box())
|
||||
|
||||
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
|
||||
cwe = self.wheel.we
|
||||
value = path[cns][cwe]
|
||||
@ -114,7 +143,9 @@ class MainWindow:
|
||||
continue
|
||||
break
|
||||
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
|
||||
value = path[cns][cwe]
|
||||
while True:
|
||||
@ -139,6 +170,8 @@ class MainWindow:
|
||||
value=value+1
|
||||
continue
|
||||
break
|
||||
self.data.zajeteRegaly = znajdzBox(self.map, self.regals)
|
||||
|
||||
def draw(self):
|
||||
self.screen.fill((33,69,108))
|
||||
for i in range(len(self.map)):
|
||||
|
@ -6,5 +6,6 @@ class UnboxOnTheFloor:
|
||||
self.ns = ns
|
||||
self.we = we
|
||||
self.screen = screen
|
||||
|
||||
def draw(self):
|
||||
pass
|
3
wheel.py
3
wheel.py
@ -7,6 +7,7 @@ from shelf import Shelf
|
||||
class Wheel:
|
||||
def __init__(self, screen, cell):
|
||||
self.cell = cell
|
||||
#kordy wozka
|
||||
self.ns = 1
|
||||
self.we = 2
|
||||
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):
|
||||
self.putBox(krata[self.ns+1][self.we].get())
|
||||
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):
|
||||
self.ns+=1
|
||||
self.m_ns=self.cell*(-1)
|
||||
|
@ -59,4 +59,5 @@ class WhereDecision:
|
||||
y = prenumeratorzy["lokacja"]
|
||||
drzewko = DecisionTreeClassifier(criterion="entropy")
|
||||
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
|
Loading…
Reference in New Issue
Block a user