Compare commits

..

318 Commits

Author SHA1 Message Date
c42a1038bc Update 'final-evaluation.md' 2020-06-15 13:26:55 +00:00
8ec7efaafa Zaktualizuj 'final-evaluation.md' 2020-06-15 13:22:05 +00:00
jonspacz
500f051946 Neural Network raport 2020-06-15 15:07:53 +02:00
Michał Czekański
5aaba17b2e Add printing tree decision to console 2020-06-15 14:59:37 +02:00
Michał Czekański
c5497ff291 Add proper death message when food recognition failed 2020-06-15 14:52:55 +02:00
Michał Czekański
e132a1ceaf Add beginning of final-evaluation and information about Decision Tree usage 2020-06-15 14:24:04 +02:00
Michał Czekański
7f6cec3107 Add empty final-evaluation file 2020-06-15 14:18:17 +02:00
Michał Czekański
096934f547 Neural network mygraph.png file 2020-06-15 14:15:05 +02:00
jonspacz
00bf015951 Neural Network 2020-06-08 14:52:37 +02:00
Mateusz
7e4f180bb6 Add run instruction to raport on beginning 2020-06-01 16:06:24 +02:00
Mateusz
f7c5deafda Finishing raport 2020-06-01 01:20:16 +02:00
Mateusz
9dc60c7062 Describe changes, and raport progress 2020-05-31 19:54:27 +02:00
Mateusz
2fdbf014aa my traveling raport init 2020-05-30 20:31:10 +02:00
Mateusz
1b71fe886b check entities list instead of entitiesRawData list 2020-05-30 20:30:46 +02:00
Mateusz
f6fa3b461b some refactor 2020-05-30 20:30:25 +02:00
Mateusz
c8557f3de6 good console messages 2020-05-30 20:30:09 +02:00
Mateusz
5c8a48e30d print message to console when agent take the herb works 2020-05-29 00:47:11 +02:00
Mateusz
14850cd230 random first population - herbs random spawn works 2020-05-28 23:57:27 +02:00
Mateusz
cf0a4be82f algorithm and movement work 2020-05-27 00:57:53 +02:00
Mateusz
80c72f1ba0 method that return travel as correct list work 2020-05-27 00:23:56 +02:00
Mateusz
b63be724f5 run by ga_travel parametr in game work 2020-05-26 23:50:31 +02:00
Mateusz
80b7e32f47 generate list of traveling by GA 2020-05-26 23:44:56 +02:00
Mateusz
d363120ef4 GA skelethon 2020-05-26 21:33:36 +02:00
Mateusz
87a341744c spawn 10 transparent herbs 2020-05-26 13:23:13 +02:00
Mateusz
1eb62c3382 when player pickup all herbs, his statistics reset 2020-05-26 12:31:55 +02:00
Michał Czekański
51d50f7cd6 Use added images in DT report 2020-05-25 15:28:05 +02:00
Michał Czekański
068eb3dfed Add images to DT report 2020-05-25 15:20:31 +02:00
Michał Czekański
7906524047 Fix displaying code on github 2020-05-25 15:06:53 +02:00
Michał Czekański
d9d67388e5 DT Report alpha version 2020-05-25 04:28:12 +02:00
Michał Czekański
3229d9405a Add decision tree dsc in report 2020-05-25 03:04:38 +02:00
Michał Czekański
f57bc6463b Add missing file with DT testing function 2020-05-25 02:46:23 +02:00
Michał Czekański
b17221c7c2 Add specifying training set size when testing DT 2020-05-25 02:45:13 +02:00
Michał Czekański
a256fc1cfe Fix too many newlines at end of dt examples file 2020-05-25 02:21:59 +02:00
Michał Czekański
63b1d36c36 Add function testing decision tree and game mode to use it 2020-05-25 02:21:18 +02:00
Michał Czekański
c1b12883f8 Fix calculating distance between two dt interactables 2020-05-25 01:41:23 +02:00
Michał Czekański
f0c77a154b Add more dt examples 2020-05-25 01:24:47 +02:00
Michał Czekański
04e3b29c21 If there are is no food left, then make decision tree return water. 2020-05-25 01:24:17 +02:00
Michał Czekański
29ba3d23c0 Add more dt examples. 2020-05-25 00:45:13 +02:00
Michał Czekański
d383fdefc4 Add printing score after dt run end. 2020-05-25 00:44:58 +02:00
Michał Czekański
939c3f9072 Add entity picking being adjustable for pure dt run and ga with dt run
In pure dt mode player can choose the same object like water any times in a row.
In dt with ga mode player can't choose same object two times in a row.
2020-05-24 23:40:13 +02:00
Michał Czekański
1e4b44558c Add more dt examples 2020-05-24 23:25:17 +02:00
Michał Czekański
994c509831 Fix calculating dst from player in dt objects 2020-05-24 22:58:41 +02:00
Michał Czekański
326551ad1c Add dt attribute - distance between water and food and some examples 2020-05-24 22:56:00 +02:00
Michał Czekański
e7cd571d95 Add method returning dt distance between two dt interactables 2020-05-24 22:32:42 +02:00
Michał Czekański
da119fca37 Add new field for accurate dst from player in dt interactable class
This will be used to sort foods more precisely when looking for nearest food, water, etc.
2020-05-24 22:21:10 +02:00
Michał Czekański
9825cd9b7d Add more dt examples 2020-05-24 19:44:29 +02:00
Michał Czekański
597a709224 Fix running game in pure dt mode 2020-05-24 19:29:29 +02:00
Michał Czekański
34eb74d980 Add game mode for generating dt examples and delete unnecessary class
This class was storing dt examples. Now they are generated to file and read from it to be used.
2020-05-24 19:19:56 +02:00
Michał Czekański
3f2e5550c7 Make prints done by method gen dt exmpls readable 2020-05-24 19:10:45 +02:00
Michał Czekański
6969a81616 Add method generating dt examples 2020-05-24 18:48:53 +02:00
Michał Czekański
f025df0381 Fix method writing dt examples to file
Method wasn't removing trailing new line chars.
2020-05-24 18:48:30 +02:00
Michał Czekański
f73ae6290f Change resolution to smaller in mainConfig.json
It won't fit on my screen without window adjusting.
2020-05-24 18:39:36 +02:00
Michał Czekański
df70b321ae Adjust project after new enum value addition 2020-05-24 18:38:55 +02:00
Michał Czekański
48560fb3a1 Add >= 15 value in dist from object enum 2020-05-24 18:37:46 +02:00
Michał Czekański
873bfd0d8e Add method returning description of dt survival example 2020-05-24 18:26:10 +02:00
Michał Czekański
98f692a6d8 Add method comparing survival dt examples attributes
This will be used to check for duplicates when generating decision tree's examples.
2020-05-24 17:48:11 +02:00
Michał Czekański
ed58517b82 Fix method reading from and adding examples to file 2020-05-24 17:12:35 +02:00
Michał Czekański
8e9d0c1267 Add method appending examples to file 2020-05-24 17:07:34 +02:00
Michał Czekański
9dc74bc599 Add file with for dt examples and manager capable of reading them 2020-05-24 17:02:35 +02:00
Michał Czekański
b8d2a4f379 Add decision tree pause mode 2020-05-24 15:57:49 +02:00
Michał Czekański
2c2d865d7f Fix wrong argument being passed to method 2020-05-24 15:51:15 +02:00
Michał Czekański
7b6a46188b Remove wrong DT examples, leave them empty for now. 2020-05-24 15:48:32 +02:00
Michał Czekański
02df6e01c6 Remove duplicate of pickEntity() in GA_With_DT and SurvivalDT classes 2020-05-24 15:47:56 +02:00
Michał Czekański
45345cabd8 Add method returning description of DT interactable 2020-05-24 15:46:25 +02:00
Michał Czekański
80946a4246 Add possibility of running GA with decision tree
Decision tree will be used to give player movement targets.
2020-05-24 14:04:10 +02:00
Michał Czekański
c88965de38 Add pausing decision tree run 2020-05-24 13:58:33 +02:00
Michał Czekański
5f7cd0dce7 Add decision tree run game mode 2020-05-24 13:48:05 +02:00
Michał Czekański
7d12c9f59e Add class picking movement target for player with dt 2020-05-24 13:30:50 +02:00
Michał Czekański
3fafade1e9 Add examples class which will contain learning examples for decision tree 2020-05-24 00:38:54 +02:00
Michał Czekański
0d6b3e4e84 Default indent fix in decision tree print 2020-05-24 00:38:12 +02:00
Michał Czekański
2fbc877141 Fix circular import between decision tree and dt branch 2020-05-23 23:49:06 +02:00
Michał Czekański
93839b3580 Add field for associated interactable in dt interactable class 2020-05-23 23:48:10 +02:00
Michał Czekański
05d28c4f5b Remove commas from decision tree's enums
Commas were causing enum values to be tuples instead of integers.
2020-05-23 23:47:36 +02:00
Michał Czekański
c4809373a0 Add method converting interactable to object representing it that can be used in dt 2020-05-23 22:20:14 +02:00
Michał Czekański
3e3fd259dd Rename dt class
Class was named ...Entity but it should be ...Interactable, because entities do not have classifiers.
2020-05-23 22:13:24 +02:00
Michał Czekański
94ec3c273e Remove unnecessary DTEntities and add classification in general class 2020-05-23 22:10:05 +02:00
Michał Czekański
f0af76520b Add method converting pl statistics to those that can be used in dt 2020-05-23 21:57:43 +02:00
Michał Czekański
1f99669d29 Add classes which will represent environment and will be usable in decision trees
Classes to represent player statistics, food objects etc...
2020-05-23 21:42:10 +02:00
Michał Czekański
c347c68958 Comment classes 2020-05-23 17:23:50 +02:00
Michał Czekański
052516540f Add survival dt example class
It will be used to create decision tree examples with project specific attributes like hunger, distance from food etc...
2020-05-23 17:20:18 +02:00
Michał Czekański
8bc292f06d Create survival dt attributes definitions
Definitions like hungerAttribute etc...
2020-05-23 17:16:28 +02:00
Michał Czekański
8d4cde8eb0 Add enum for classifying dt survival examples.
This enum will be used in decision tree learning. For example food classification will mean that player should go for food.
2020-05-23 17:15:44 +02:00
Michał Czekański
c4d4d6bb52 Add enum for player distance from objects like food
This enum will be used in decision tree learning.
2020-05-23 17:14:29 +02:00
Michał Czekański
479137ce74 Add enum for player stats amount
This enum will be used in decision tree learning when creating examples.
2020-05-23 17:14:06 +02:00
Michał Czekański
b0d8872c15 Add inductive decision tree learning set of functions
To build decision tree use inductiveDecisionTreeLearning function.
2020-05-22 14:21:52 +02:00
Michał Czekański
43b654a6a5 Add static method printing decision tree 2020-05-21 17:01:27 +02:00
Michał Czekański
44419b5f28 Add method making decision in DecisionTree class
This method takes an instance of DecisionTreeExample and returns what it "decided".
2020-05-21 17:00:59 +02:00
Michał Czekański
9d1299b162 Add method adding branch to decision tree 2020-05-21 16:58:28 +02:00
Michał Czekański
fd54303dba Change type of branch field in DecisionTree class
Type was Any, now it is DecisionTreeBranch.
2020-05-21 16:57:33 +02:00
Michał Czekański
a3d47b4320 Add DecisionTreeBranch class 2020-05-21 16:56:20 +02:00
Michał Czekański
fbd76f31e7 Add DecisionTree class with just init 2020-05-21 16:56:01 +02:00
Michał Czekański
bdba45de08 Add DecisionTreeExample class
This class will be used in decision trees.
2020-05-21 16:52:48 +02:00
Michał Czekański
ad791a299e Add Attribute class
This class will be used in decision trees.
2020-05-21 16:50:46 +02:00
Michał Czekański
38ce217db4 Add AttributeDefinition class
This class will be used in decision trees.
2020-05-21 16:50:07 +02:00
ee9769db6e Updated gif URL 2020-05-18 13:15:56 +00:00
c5ff411eba Added simulation example 2020-05-18 15:14:59 +02:00
2f018eae2f Updated training values 2020-05-18 15:03:23 +02:00
f67a9748f6 Updated plot 2020-05-18 15:01:54 +02:00
a0da920e39 Changed seed 2020-05-18 14:58:44 +02:00
b20ac9c356 Removed stepCount (bugged) 2020-05-18 14:58:31 +02:00
ded03f5a3b Removed redundant import 2020-05-18 14:29:39 +02:00
3e4f10236d Removed redundant pickWeightedAffinity function 2020-05-18 14:29:26 +02:00
dc5dc756cb Removed randomness from entity picking 2020-05-18 14:28:48 +02:00
de68c5e991 GA raport done 2020-05-17 18:13:24 +02:00
2ff0ce1ddf Added new info 2020-05-17 12:06:43 +02:00
f1d616576c Added optional file log out 2020-05-17 11:56:06 +02:00
89eb557a2d Added GA documentation 2020-05-17 11:29:35 +02:00
04370fb98c Added docstrings 2020-05-17 11:22:38 +02:00
96cf823619 Added missing docstrings 2020-05-17 11:22:27 +02:00
df16339eef Changed log paths 2020-05-17 11:17:08 +02:00
aa3eea8b39 Added resultsExplorer.py 2020-05-17 11:15:54 +02:00
1aacc693b9 Fixed Raw logging 2020-05-17 10:34:36 +02:00
3108343513 Logging changes 2020-05-17 10:25:10 +02:00
b6312df9f3 Changed formulas back to original 2020-05-17 10:16:56 +02:00
d31e03050e Buffed firepit 2020-05-17 10:16:45 +02:00
3b294030f4 Fixed movement when moveTimeout is zero 2020-05-17 01:30:38 +02:00
d9a4750f7d Added random seed 2020-05-17 01:29:20 +02:00
878f9b9523 All interactables are now reachable 2020-05-17 01:29:08 +02:00
ada3564713 Fixed issue with targets forwards to player 2020-05-17 01:02:07 +02:00
d1b6027ffa Fixed fitness logging 2020-05-17 00:46:33 +02:00
eed7d2ea82 Added GA iteration run param 2020-05-17 00:43:24 +02:00
0225eda1eb Added file logging 2020-05-17 00:38:36 +02:00
7c6cc737e1 Added execution parameters 2020-05-17 00:27:53 +02:00
4b75bebf5a Added more debug keybindings 2020-05-17 00:16:20 +02:00
2afbcdaff8 Removed A* debug text 2020-05-17 00:15:56 +02:00
b9997a0a93 Changed entities 2020-05-17 00:15:09 +02:00
584d371ec1 Optimized map respawn method 2020-05-17 00:14:42 +02:00
dcc8da6d2a Changed fatigue 2020-05-17 00:14:23 +02:00
92490789ea Improved multithreading 2020-05-17 00:14:10 +02:00
6725c4ae0c Weighted entity picks are now seeded 2020-05-16 22:50:56 +02:00
8c2a3f2bff Fixed bug, where the game would crash if there are no pikcupable entities left 2020-05-16 22:36:42 +02:00
1c8b21bf2c Changed fatigue 2020-05-16 16:23:49 +02:00
05898f5b8b Added __del__ method 2020-05-16 16:23:31 +02:00
052d8ca7ce pre-alpha multithreading 2020-05-16 16:22:53 +02:00
de3a0569a9 Added GA gamemode 2020-05-16 15:39:53 +02:00
66ac27a6fe Bugfixes 2020-05-16 14:46:02 +02:00
ac6a7df4fe Added mutation 2020-05-16 14:21:09 +02:00
e8e36a4420 Added more info printing 2020-05-16 14:13:46 +02:00
625b6956c9 Added mating 2020-05-16 14:10:18 +02:00
f56eedb657 Added mating pool selection function 2020-05-16 13:51:09 +02:00
0cd91fd1a1 Fixed entities textures colorspaces 2020-05-16 13:20:33 +02:00
b89822a658 Added TODO 2020-05-16 13:01:11 +02:00
9484a05dd5 Added walking affinity weight 2020-05-16 12:54:21 +02:00
30e1db94bf First steps in GA 2020-05-16 12:54:04 +02:00
264aa2969c Added respawn method 2020-05-16 12:47:40 +02:00
a45be130e6 Added disableMovementTime method 2020-05-16 12:36:37 +02:00
7877cbb239 Added missing affinity to the player's init 2020-05-16 12:14:16 +02:00
5e1e089015 getInteractablesByClassifier's classifier param is now optional 2020-05-16 11:41:51 +02:00
6ec1c0b2d2 Game class revamp 2020-05-16 11:13:36 +02:00
15babde728 buffed fatigue 2020-05-16 11:01:01 +02:00
233ce2462c fixed movePoints 2020-05-16 10:59:46 +02:00
5d060ae8a4 Fixed return type 2020-05-16 10:54:31 +02:00
25372c2f34 Added tooltip to affinities 2020-05-16 10:44:34 +02:00
b6893379cf added getInteractablesByClassifier method 2020-05-16 10:44:19 +02:00
74093de1d3 Added weighted choice function 2020-05-16 10:44:01 +02:00
b61ffc008b Now uses classifier enum instead of stings 2020-05-16 10:21:37 +02:00
a0c315a600 Added Classifiers enum 2020-05-16 10:21:23 +02:00
64c9a4979c Added newline at the end of the file 2020-05-16 10:07:46 +02:00
fce8eea181 Player may now have affinities to entity types 2020-05-16 10:07:35 +02:00
8cad7be0a5 Added affinities container 2020-05-16 10:05:42 +02:00
2318000476 Added type fields to entities from JSON 2020-05-16 10:02:01 +02:00
454e0ac87d __str__ prints classifiers 2020-05-16 10:01:47 +02:00
fa1fe48abb Added __str__ method 2020-05-16 09:59:53 +02:00
90746c51d9 Added missing param hint in docstring 2020-05-16 09:51:04 +02:00
215dd876f7 Added classifier param to the constructor 2020-05-16 09:50:10 +02:00
8c3bdc3726 Interactable entities now have classification field 2020-05-16 09:48:42 +02:00
d27986045d Added type field to classify entities 2020-05-16 09:46:41 +02:00
Michał Czekański
d38b2ff7d5 Use new printToConsole method in Ui class 2020-05-15 23:24:21 +02:00
Michał Czekański
d26703da5b Add comments in Ui.py 2020-05-15 23:24:21 +02:00
Michał Czekański
6832d41990 Add comments in UiText.py 2020-05-15 23:24:21 +02:00
Michał Czekański
b15382d9bc Add scroll up and down method in UiConsole class 2020-05-15 23:24:21 +02:00
Michał Czekański
76de35bc3d Add update method, static buffer, static printing to console method
Added static buffer in UiConsole class which stores lines to print. Even if there is no UiConsole object instantiated (cos it's static).
Everything from buffer is being printed on update() calls, update is called every frame.
To add lines to buffer use static printToConsole() method.
2020-05-15 23:24:21 +02:00
Michał Czekański
4e828de1c7 Add type hints for fields and method parameters in UiConsole 2020-05-15 23:24:21 +02:00
Michał Czekański
22355dc960 Add comments to all methods in UiConsole class 2020-05-15 23:24:21 +02:00
Michał Czekański
2cebcd3be6 Fix writeToConsole method
This method was adding given string to the console's list of lines, but wasn't displaying this given string.
User had to perform scroll to display this new string.
2020-05-15 23:24:21 +02:00
Michał Czekański
86394ef71b Add method writing to console 2020-05-15 23:24:21 +02:00
Michał Czekański
7d71333558 Add comments in UiButton.py 2020-05-15 23:24:21 +02:00
Michał Czekański
aab779d4e1 Add comments in UiImage.py 2020-05-15 23:24:21 +02:00
Michał Czekański
08643c7083 Remove unnecessary field in UiBar class 2020-05-15 23:24:21 +02:00
Michał Czekański
9d1ecf5d90 Add comments in UiBar.py 2020-05-15 23:24:21 +02:00
Michał Czekański
bb46f56ace Add comments in UiElement.py 2020-05-15 23:24:21 +02:00
8df63bb607 Stamina loss is quicker 2020-05-15 16:59:02 +02:00
d45daadc60 Player may now die out of exhaustion 2020-05-15 08:58:07 +02:00
492f37bda5 Pressing 'u' now selects random interactable entity 2020-05-15 08:54:49 +02:00
a40a598ffe Added getEntitiesByType method 2020-05-15 08:54:21 +02:00
dae94576e7 Fixed debug text 2020-05-15 08:54:05 +02:00
4fff56bd7d Better debug output 2020-05-15 08:52:06 +02:00
569128763b Entities list is now a pygame.sprite.Group 2020-05-14 16:33:35 +02:00
fad3d68b55 getFacingCoord screenRelative now defaults to false 2020-05-14 16:30:10 +02:00
3924023a92 Documentation fixes 2020-05-14 16:24:59 +02:00
31811782fb Now displays game's __init__ 2020-05-14 16:24:52 +02:00
c806d99d49 Changed tooltip from except to raises 2020-05-14 16:18:29 +02:00
085446ea93 Added more documentation 2020-05-14 16:16:19 +02:00
2b07e7394f Now showing constructors 2020-05-14 15:35:41 +02:00
79144c28a3 Prettier doc 2020-05-14 15:20:37 +02:00
d8da2f2625 Fixed code highlighting 2020-05-14 15:01:43 +02:00
154dbaffaa Added readme 2020-05-14 15:00:31 +02:00
1610f9c0da Fixed imports 2020-05-14 14:54:11 +02:00
a8ef08b3ef Added sphinx documentation generator 2020-05-14 14:40:53 +02:00
844397191a Added tooltips to getCoords and SetCoords 2020-05-14 12:56:33 +02:00
fed30b0ade Added tooltips 2020-05-14 12:44:27 +02:00
cc98db0a96 Methods now use relative coords 2020-05-14 12:39:09 +02:00
776be8fb90 A* uses relative coords 2020-05-14 12:38:48 +02:00
95972ac969 Entities now load with relative coords 2020-05-14 12:11:57 +02:00
065111dee9 Changed default param 2020-05-14 12:11:46 +02:00
dac8583665 Changed tooltips 2020-05-14 12:07:35 +02:00
824a7e33ea draw method sets mapOffset field properly 2020-05-14 12:05:52 +02:00
93f4e9f53d Changed tooltip 2020-05-14 12:05:32 +02:00
2618bbdf9c moveForward method uses relative coords 2020-05-14 12:05:12 +02:00
7ed974b194 Added newlines in docstrings 2020-05-14 11:46:52 +02:00
269e376756 getFacingCoord can now return non-relative coords 2020-05-14 11:46:06 +02:00
107bd0d8f7 Changed constructor 2020-05-14 11:32:13 +02:00
1eb75fc354 Fixed abysmal draw method 2020-05-14 11:27:54 +02:00
e66b0d4a59 Removed redundant draw method params 2020-05-14 11:24:51 +02:00
6ed8423463 Added setter method usage 2020-05-14 11:23:04 +02:00
823eefac86 Fixed relative coord update 2020-05-14 11:18:58 +02:00
2bf0ed035b Added map coord offset 2020-05-14 11:15:27 +02:00
f224c8c657 Removed removeSprite method 2020-05-14 11:13:29 +02:00
ce50622b89 Removed removeSprite method 2020-05-14 11:13:09 +02:00
57b95e10df Added relative coords 2020-05-14 11:03:50 +02:00
cba207f98c Changed item pickup method 2020-05-13 20:17:32 +02:00
649b61a84e Added pickup to move method 2020-05-13 20:17:17 +02:00
b3d38403ad Added documentation 2020-05-13 19:50:53 +02:00
93472900b9 Removed A* calls from game 2020-05-13 19:48:51 +02:00
48e81e206b Enums refactor 2020-05-13 19:48:08 +02:00
effa48d7c3 Fixing item pickup action after completing the movement 2020-05-13 19:47:53 +02:00
a51661ae6e on_interaction method now removes the entity itself 2020-05-13 19:45:52 +02:00
28d9013983 Enums refactor 2020-05-13 19:36:06 +02:00
d6cf76f6bc Updated A* function calls 2020-05-13 19:34:16 +02:00
3ac188103a Player's movement adds fatigue 2020-05-13 19:32:52 +02:00
549c4f207f Movement moved to Entity 2020-05-13 19:31:51 +02:00
81bed4adeb All entities can now move 2020-05-13 19:25:08 +02:00
25345ae317 Removed objective implementation 2020-05-13 19:02:31 +02:00
dcdb4ac87e Fixed major bug 2020-05-13 19:00:33 +02:00
e270360690 Added non-objective implementation 2020-05-13 18:08:22 +02:00
11b467db32 Added pickup action in Movement enum 2020-05-13 17:36:54 +02:00
45e7c412f8 rotation field and getFacingCoord method moved from Player to Entity 2020-05-13 17:33:45 +02:00
16bb2cd311 Cleanup 2020-05-10 14:25:30 +02:00
f104e90a0f Added documentation 2020-05-10 13:27:06 +02:00
0eea13331f Added documentation & code beautification 2020-05-10 13:17:11 +02:00
01ce5796da Removed timer 2020-05-10 12:53:08 +02:00
a76965cd91 Player now keeps track of the movement delay 2020-05-09 22:54:15 +02:00
752c3daa24 Added TODO markers 2020-05-09 22:30:21 +02:00
fc47c697df Added more comments 2020-05-09 22:03:36 +02:00
Mateusz
d537eb089d Merge remote-tracking branch 'origin/master' 2020-04-27 14:18:02 +02:00
Mateusz
c96ecc64d8 README.md add A* information in Sterowanie 2020-04-27 14:17:48 +02:00
389183a4c2 Zaktualizuj 'route-planning.md' 2020-04-27 12:14:02 +00:00
Mateusz
b433b588f5 route-planning.md change screenshots to code mark
delete screenshots files
2020-04-27 14:06:23 +02:00
Mateusz
ddb30859d1 route-planning.md "u" more visible and correct project progress 2020-04-27 14:00:13 +02:00
Mateusz
3632a9ffbb route-planning.md add all screenshots and correct project progress section 2020-04-27 13:41:58 +02:00
Mateusz
ae551703fd add screenshots folder and images to route-planning.md raport
correct path in environment.md
style progress in route-planning.md
2020-04-27 13:33:01 +02:00
Mateusz
b23865b090 route-planning.md - successor function content 2020-04-27 12:47:59 +02:00
Mateusz
a6a8812ace route-planning.md - file links corrections 2020-04-27 12:23:40 +02:00
Mateusz
5a4228fcff route-planning.md - space corrections #1 2020-04-27 12:15:48 +02:00
Mateusz
20c3c269de route-planning.md - endline corrections #1 2020-04-27 12:08:30 +02:00
Mateusz
0d8d9309ae Raport route-planning.md main loop describe 2020-04-27 12:05:24 +02:00
Mateusz
b4624c4c56 raport progress 2020-04-27 11:06:14 +02:00
6fbc9184f4 Algorithm now picks up items 2020-04-26 20:22:16 +02:00
Michał Czekański
a6b717935f Extract clicks on collidables to new method - make code clear 2020-04-26 18:45:07 +02:00
Michał Czekański
013e8b524d Add new getTileOnCoord method
New method uses pygame.rect.collidepoint method which doesn't need exact tile's coordinates
2020-04-26 18:42:00 +02:00
Michał Czekański
2ba090b2d4 Add debug printing terrain tiles under mouse click 2020-04-26 18:41:05 +02:00
Michał Czekański
87fc6bea1f Fix not adding grass tiles to terrainTilesList 2020-04-26 18:34:38 +02:00
Michał Czekański
08d425b938 Fix sea being not collidable
Player can't walk over sea
2020-04-26 18:11:54 +02:00
Michał Czekański
1255ab8e16 Fix problems with pathfinding to some map locations and add go-to on click
succesor method fixed
2020-04-26 18:09:02 +02:00
Michał Czekański
31d2bf0009 Fix random A* target selection
There was try catch catching all Exceptions, now it's only catching IndexErrors
2020-04-26 16:33:39 +02:00
Michał Czekański
dee9ebb77c Fix not stepping on final entity 2020-04-26 16:04:47 +02:00
Michał Czekański
b12c969d14 Add changes to last move detection 2020-04-26 15:20:17 +02:00
Michał Czekański
1edaa1f74e If A* destination is entity - disable stepping on it
Player shouldn't step on berry or rabbit, etc...
2020-04-26 14:41:22 +02:00
Michał Czekański
f1e0c3c593 Add automatic player movement delay 2020-04-26 14:33:04 +02:00
Michał Czekański
b8abacd4cc Add picking random target for A* algorithm
When user clicks "u" key target is being picked.
2020-04-26 14:13:27 +02:00
Michał Czekański
ab1b4e9efc Fix going to target in goToTarget method
Disabled trying to retrieve moves from empty movement list.
2020-04-26 14:12:54 +02:00
Michał Czekański
d5c9f5f801 Fix player rotation 2020-04-26 14:09:35 +02:00
Michał Czekański
a5569f0b8f Disable player stats lowering for A* test 2020-04-26 14:08:38 +02:00
Michał Czekański
0151413cdd Merge remote-tracking branch 'origin/latestThing' into latestThing 2020-04-26 13:47:40 +02:00
Michał Czekański
5facbfb2fd Update A_star so that it generates some movements (not always correct) 2020-04-26 13:47:22 +02:00
Mateusz
53ee1e1f10 refactor and describe map lists and methods 2020-04-26 13:36:19 +02:00
Michał Czekański
deeba7c740 Spaghetti code, not working 2020-04-26 03:59:09 +02:00
Michał Czekański
39b689d8f0 Merge remote-tracking branch 'origin/terrainTilesList' into NewMovementFinishing 2020-04-26 01:39:18 +02:00
Mateusz
8b9d953553 add terrainTilesList 2020-04-26 01:37:27 +02:00
Michał Czekański
b7f4bc6101 Merge remote-tracking branch 'origin/NewMovement' into NewMovementFinishing 2020-04-26 01:08:58 +02:00
Mateusz
c14ed38df2 add clay sprite and route-planning document skelethon 2020-04-26 01:08:15 +02:00
Michał Czekański
7a79ccc9c2 Finish graphSearch method in AutomaticMovement.py 2020-04-26 00:55:36 +02:00
Michał Czekański
e01dfeb85a Change priority method in AutomaticMovement.py
Now priority method calculates pr for given node
2020-04-26 00:22:03 +02:00
Michał Czekański
2e6f2db543 Merge remote-tracking branch 'origin/NewMovement' into NewMovementFinishing 2020-04-26 00:18:37 +02:00
Michał Czekański
b6234b1a93 Move node class to separate AStarNode.py file 2020-04-26 00:13:31 +02:00
Michał Czekański
b296fbe492 Rename coords field to state 2020-04-26 00:06:20 +02:00
Michał Czekański
5af76a1b16 Change succesor method in AutomaticMovement.py
Now succesor takes state as an argument and returns all possible moves for that state.
2020-04-26 00:03:38 +02:00
Michał Czekański
cdcf5fb052 Add coordination field in node class 2020-04-25 23:56:07 +02:00
Michał Czekański
cef686a74f Add method calculating new state with given action 2020-04-25 23:55:31 +02:00
Mateusz
d44274397d describe sprites costs 2020-04-25 23:34:49 +02:00
Mateusz
91efd32d87 add clay sprite 2020-04-25 23:34:18 +02:00
Mateusz
4d6de52e8c add cost attribute 2020-04-25 23:33:55 +02:00
Michał Czekański
7d9dd06d09 Add import new class in Game.py 2020-04-25 23:19:41 +02:00
Michał Czekański
e6c36eea8d Add partially finished AutomaticMovement class 2020-04-25 23:19:19 +02:00
Michał Czekański
0084750629 Add todo at TerrainTile class 2020-04-25 23:18:29 +02:00
e37a17cadd Added getTileOnCoord method 2020-04-25 22:49:57 +02:00
5ca1a0b4d0 New movement testing 2020-04-25 22:02:21 +02:00
d7e0b37666 Added new movement methods 2020-04-25 22:02:08 +02:00
Michał Czekański
28a581bd3e Add missing fonts 2020-04-06 15:48:13 +02:00
Michał Czekański
508401d0a3 Merge branch 'master' of https://git.wmi.amu.edu.pl/s444409/DSZI_Survival 2020-04-06 15:45:47 +02:00
Michał Czekański
69313b0984 Add antialiasing 2020-04-06 15:45:05 +02:00
1bfa195616 Zaktualizuj 'environment.md' 2020-04-06 12:34:05 +00:00
d32384edde Zaktualizuj 'environment.md' 2020-04-06 12:27:51 +00:00
90cd79b34d Zaktualizuj 'environment.md' 2020-04-06 12:26:58 +00:00
94daee9f79 Zaktualizuj 'environment.md' 2020-04-06 12:26:28 +00:00
Wirus
b47e577356 new screenshot 2020-04-06 13:55:03 +02:00
Michał Czekański
774d186653 Add "s" after printing time alive 2020-04-06 13:51:05 +02:00
Michał Czekański
b0891c3e48 Merge branch 'writingInfoToConsole' 2020-04-06 13:50:01 +02:00
dd16e77c33 Zaktualizuj 'environment.md' 2020-04-06 11:42:10 +00:00
Wirus
10898acc10 Merge remote-tracking branch 'origin/master' 2020-04-06 13:40:19 +02:00
Wirus
ec0c3adc97 Edit structure.pdf 2020-04-06 13:40:06 +02:00
1716cb9190 Zaktualizuj 'environment.md' 2020-04-06 11:31:36 +00:00
a534f2fed3 Zaktualizuj 'environment.md' 2020-04-06 11:22:10 +00:00
89f2a44d43 Zaktualizuj 'environment.md' 2020-04-06 11:17:39 +00:00
ae7c5c64ca Zaktualizuj 'environment.md' 2020-04-06 11:17:00 +00:00
2c60019b41 Zaktualizuj 'environment.md' 2020-04-06 11:15:45 +00:00
Wirus
c09a67dc2f Correct Reprezentacja Wiedzy and make Poradnik 2020-04-06 13:14:06 +02:00
134d09247e Zaktualizuj 'environment.md' 2020-04-06 10:46:17 +00:00
220 changed files with 5170 additions and 355 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
/.idea/
__pycache__
/venv/
/doc/_build/

214
DecisionTree.md Normal file
View File

@ -0,0 +1,214 @@
# DSZI_Survival - Drzewa Decyzyjne
### Autor: Michał Czekański
## Cel zastosowania w projekcie
W projekcie DSZI_Survival drzewo decyzyjne użyte jest do podejmowania decyzji przez agenta, rozbitka na bezludnej wyspie,
jaką czynność wykonać w danej chwili.
Czy:
* zdobyć pożywienie
* udać się do źródła wody
* odpocząć przy ognisku
## Opis drzewa decyzyjnego
* **Drzewo decyzyjne** to drzewo reprezentujące jakąś funkcję, Boolowską w najprostszym przypadku.
* Drzewo decyzyjne jako **argument** przyjmuje obiekt - sytuację opisaną za pomocą zestawu **atrybutów**
* **Wierzchołek** drzewa decyzyjnego odpowiada testowi jednego z atrybutów (np. IsMonday)
* Każda **gałąź** wychodząca z wierzchołka jest oznaczona możliwą wartością testu z wierzchołka (np. True)
* **Liść** zawiera wartość do zwrócenia (**decyzję, wybór**), gdy liść ten zostanie osiągnięty (np. ShopType.Grocery)
## Metoda uczenia - Algorytm ID3
Metoda użyta do uczenia drzewa decyzyjnego to metoda **indukcyjnego uczenia drzewa decyzyjnego**.
### Działanie ID3
* Definiujemy atrybuty, które będą posiadały przykłady służące do uczenia drzewa (**atrybuty**)
```python
class AttributeDefinition:
def __init__(self, id, name: str, values: List):
self.id = id
self.name = name
self.values = values
class Attribute:
def __init__(self, attributeDefinition: AttributeDefinition, value):
self.attributeDefinition = attributeDefinition
self.value = value
```
* Tworzymy przykłady z wykorzystaniem atrybutów (**przykłady**)
```python
class DecisionTreeExample:
def __init__(self, classification, attributes: List[Attribute]):
self.attributes = attributes
self.classification = classification
```
* Ustalamy domyślną wartość do zwrócenia przez drzewo - **klasa domyślna**
* Następnie postępujemy indukcyjnie:
* Jeżeli liczba przykładów == 0: zwracamy wierzchołek oznaczony klasą domyślną
* Jeżeli wszystkie przykłady są tak samo sklasyfikowane: zwracamy wierzchołek oznacz. tą klasą
* Jeżeli liczba atrybutów == 0: zwracamy wierzchołek oznacz. klasą, którą posiada większość przykładów
* W przeciwnym wypadku **wybieramy atrybut** A (o wyborze atrybutu poniżej) i czynimy go korzeniem drzewa T
* **nowa_klasa_domyślna** = wierzchołek oznaczony klasą, która jest przypisana największej liczbie przykładów
* Dla każdej wartości W atrybutu A:
* nowe_przykłady = przykłady, dla których atrybut A przyjmuje wartość W
* Dodajemy do T krawędź oznaczoną przez wartość W, która prowadzi do wierzchołka zwróconego przez wywołanie indukcyjne:
*treelearn(nowe_przykłady, atrybutyA, nowa_klasa_domyślna)*
* Zwróć drzewo T
```python
class DecisionTree(object):
def __init__(self, root):
self.root = root
self.branches = []
self.branchesNum = 0
```
### Wybór atrybutu
W trakcie uczenia drzewa decyzyjnego chcemy wybrać jak najlepszy atrybut, dzięki któremu możliwie jak najszybciej będziemy mogli sklasyfikować podane przykłady.
Miarą porównawczą atrybutów będzie **zysk informacji** dla danego atrybutu (**information gain**).
Atrybut o największym zysku zostanie wybrany.
**Implementacja**
```python
def chooseAttribute(attributes: List[AttributeDefinition], examples: List[DecisionTreeExample], classifications):
bestAttribute = None
bestAttributeGain = -1
for attribute in attributes:
attrInformationGain = calculateInformationGain(attribute, classifications, examples)
if attrInformationGain > bestAttributeGain:
bestAttribute = attribute
bestAttributeGain = attrInformationGain
return bestAttribute
```
#### Obliczanie zysku informacji
(Wszelkie obliczenia wedle wzorów podanych na zajęciach)
* I(C) - Obliczamy zawartość informacji dla zbioru możliwych klasyfikacji
![fig](https://git.wmi.amu.edu.pl/s444409/DSZI_Survival/raw/master/data/images/reportImages/DT/I%28C%29.png)
* E(A) - Obliczamy ilość informacji potrzebną do zakończenia klasyfikacji po sprawdzeniu atrybutu
![fig](https://git.wmi.amu.edu.pl/s444409/DSZI_Survival/raw/master/data/images/reportImages/DT/E%28A%29.png)
* **G(A)** - **Przyrost informacji dla atrybutu A** = I(C) - E(A)
**Implementacja**
```python
def calculateInformationGain(attribute: AttributeDefinition, classifications, examples: List[DecisionTreeExample]):
return calculateEntropy(classifications, examples) - calculateRemainder(attribute, examples, classifications)
```
## Opis implementacji
### Definicje atrybutów:
* Głód: **[0, 1/4); [1/4, 1/2); [1/2, 3/4); [3/4, 1]**
* Pragnienie: **[0, 1/4); [1/4, 1/2); [1/2, 3/4); [3/4, 1]**
* Energia: **[0, 1/4); [1/4, 1/2); [1/2, 3/4); [3/4, 1]**
* Odległość od jedzenia: **[0, 3); [3, 8); [8, 15); [15, max)**
* Odległość od źródła wody: **[0, 3); [3, 8); [8, 15); [15, max)**
* Odległość od miejsca spoczynku: **[0, 3); [3, 8); [8, 15); [15, max)**
* Odległość pomiędzy wodą a jedzeniem: **[0, 3); [3, 8); [8, 15); [15, max)**
```python
class PlayerStatsValue(Enum):
ZERO_TO_QUARTER = 0
QUARTER_TO_HALF = 1
HALF_TO_THREE_QUARTERS = 2
THREE_QUARTERS_TO_FULL = 3
class DistFromObject(Enum):
LT_3 = 0
GE_3_LT_8 = 1
GE_8_LT_15 = 2
GE_15 = 3
```
### Uczenie drzewa
```python
def inductiveDecisionTreeLearning(examples: List[DecisionTreeExample], attributes: List[AttributeDefinition], default,
classifications)
```
### Zwracanie decyzji przez drzewo
```python
def giveAnswer(self, example: DecisionTreeExample):
if self.branchesNum == 0:
return self.root
for attr in example.attributes:
if attr.attributeDefinition.id == self.root.id:
for branch in self.branches:
if branch.label == attr.value:
return branch.subtree.giveAnswer(example)
```
### Wybór celu dla agenta
```python
def pickEntity(self, player, map, pickForGa=False):
foods = map.getInteractablesByClassifier(Classifiers.FOOD)
waters = map.getInteractablesByClassifier(Classifiers.WATER)
rests = map.getInteractablesByClassifier(Classifiers.REST)
playerStats = DTPlayerStats.dtStatsFromPlayerStats(player.statistics)
# Get waters sorted by distance from player
dtWaters: List[DTSurvivalInteractable] = []
for water in waters:
dtWater = DTSurvivalInteractable.dtInteractableFromInteractable(water, player.x, player.y)
dtWaters.append(dtWater)
dtWaters.sort(key=lambda x: x.accurateDistanceFromPlayer)
nearestDtWater = dtWaters[0]
# Get foods sorted by distance from player
dtFoods: List[DTSurvivalInteractable] = []
for food in foods:
dtFood = DTSurvivalInteractable.dtInteractableFromInteractable(food, player.x, player.y)
dtFoods.append(dtFood)
dtFoods.sort(key=lambda x: x.accurateDistanceFromPlayer)
# If there is no food on map return nearest water.
try:
nearestDtFood = dtFoods[0]
except IndexError:
return nearestDtWater.interactable
# Get rest places sorted by distance from player
dtRestPlaces: List[DTSurvivalInteractable] = []
for rest in rests:
dtRest = DTSurvivalInteractable.dtInteractableFromInteractable(rest, player.x, player.y)
dtRestPlaces.append(dtRest)
dtRestPlaces.sort(key=lambda x: x.accurateDistanceFromPlayer)
nearestDtRest = dtRestPlaces[0]
currentSituation = SurvivalDTExample(None, playerStats.hungerAmount, playerStats.thirstAmount,
playerStats.staminaAmount,
nearestDtFood.dtDistanceFromPlayer, nearestDtWater.dtDistanceFromPlayer,
nearestDtRest.dtDistanceFromPlayer,
nearestDtFood.getDtDistanceFromOtherInteractable(nearestDtWater.interactable))
treeDecision, choice = self.__pickEntityAfterTreeDecision__(currentSituation,
dtFoods,
dtRestPlaces,
dtWaters)
return choice.interactable
```
## Zestaw uczący, zestaw testowy
### Zestaw uczący
Zestaw uczący był generowany poprzez tworzenie losowych przykładów i zapytanie użytkownika o klasyfikację, a następnie zapisywany do pliku.
### Zestaw testowy
Przy testowaniu drzewa podajemy ile procent wszystkich, wcześniej wygenerowanych przykładów mają być przykłady testowe.

173
GeneticAlgorithm.md Normal file
View File

@ -0,0 +1,173 @@
# Algorythm Genetyczny w projekcie DSZI_Survival
**Autor:** Marcin Kostrzewski
---
## Cel
Celem algorytmu jest znalezienie czterech optymalnych wartości, według których
agent podejmuje decyzję, co zrobić dalej. Te cztery cechy to:
* Priorytet (chęć) zaspokajania głodu,
* Zaspokajanie pragnienia,
* Odpoczynek,
* Jak odległość od obiektu wpływa na podjętą decyzję.
Zestaw tych cech reprezentuje klasa-struktura **[*Affinities*](https://git.wmi.amu.edu.pl/s444409/DSZI_Survival/src/master/src/AI/Affinities.py)**:
```python
class Affinities:
def __init__(self, food, water, rest, walking):
"""
Create a container of affinities. Affinities describe, what type of entities a player prioritizes.
:param food: Food affinity
:param water: Freshwater affinity
:param rest: Firepit affinity
:param walking: How distances determine choices
"""
self.food = food
self.water = water
self.rest = rest
self.walking = walking
```
Oczywiście agent (gracz) posiada w swojej klasie pole ``self.affinities``.
## Podejmowanie decyzji
Gracz podejmuje decyzję o wyborze celu według następującej formuły:
```python
typeWeight / (distance / walkingAffinity) * affectedStat * multiplier
```
gdzie:
* *typeWeight* - wartość cechy odpowiadającej typowi celu,
* *distance* - odległość od celu,
* *walkingAffinity* - waga odległości,
* *affectedStat* - aktualna wartość odpowiadającej statystyki agenta,
* *multiplier* - mnożnik redukujący wpływ obecnych statystyk na wybór.
Implementacja w **[*GA.py/pickEntity()*](https://git.wmi.amu.edu.pl/s444409/DSZI_Survival/src/master/src/AI/GA.py)** (przykładowo dla jedzenia):
```python
watersWeights = []
thirst = player.statistics.thirst
for water in waters:
typeWeight = weights[1]
distance = abs(player.x - water.x) + abs(player.x - water.y)
watersWeights.append(typeWeight / (distance * walkingAffinity) * thirst * 0.01)
```
Dla każdego obiektu, z którym agent może podjąć interakcję wyliczana jest ta wartość
i wybierany jest obiekt, dla którego jest największa.
## Implementacja algorytmu genetycznego
Za realizację algorytmu odpowiada funkcja *geneticAlgorithm()* w **[*GA.py*](https://git.wmi.amu.edu.pl/s444409/DSZI_Survival/src/master/src/AI/GA.py)** (Skrócona wersja):
```python
def geneticAlgorithm(map, iter, solutions, mutationAmount=0.05):
# Based on 4 weights, that are affinities tied to the player
weightsCount = 4
# Initialize the first population with random values
initialPopulation = numpy.random.uniform(low=0.0, high=1.0, size=(solutions, weightsCount))
population = initialPopulation
for i in range(iter):
fitness = []
for player in population:
fitness.append(doSimulation(player, map))
parents = selectMatingPool(population, fitness, int(solutions / 2))
offspring = mating(parents, solutions, mutationAmount)
population = offspring
```
#### Omówienie:
##### Pierwsza populacja
Pierwsza populacja inicjalizowana jest losowymi wartościami. Szukamy
czterech najlepszych wag; każdy osobnik z gatunku jest reprezentowany przez
listę 4-elementową wag.
```python
initialPopulation = numpy.random.uniform(low=0.0, high=1.0, size=(solutions, weightsCount))
```
Rozpoczyna się pętla, która stworzy tyle generacji, ile sprecyzujemy w parametrze.
##### Symulacja i *fitness*
Dla każdego osobnika z populacji uruchamiana jest symulacja. Symulacja dzieje się w tle,
żeby zminimializować czas potrzebny do wykonania pełnej symulacji. Jej koniec następuje w momencie,
gdy agent umrze.
```python
fitness.append(doSimulation(player, map))
```
Wartością zwracaną przez funkcję symulacji jest tzw. *fitness*. W tym wypadku,
wartością tą jest ilość kroków, jakie pokonał agent przez cykl życia.
##### Wybór rodziców
Rodzice dla dzieci przyszłego pokolenia wybierani są na podstawie wartości
*fitness*. W tym wypadku wybirana jest połowa populacji z najwyższymi wartościami przeżywalności.
```python
parents = selectMatingPool(population, fitness, int(solutions / 2))
```
##### Potomstwo, czyli rozmnażanie i mutacje
Za wyliczanie wartości dla nowego pokolenia odpowiada funkcja ``mating``. Przekazujemy do niej rodziców, ilość potomstwa
i siłę mutacji. Z **[*GA.py/mating()*](https://git.wmi.amu.edu.pl/s444409/DSZI_Survival/src/master/src/AI/GA.py)**:
```python
for i in range(offspringCount):
parent1 = i % len(parents)
parent2 = (i + 1) % len(parents)
offspring.append(crossover(parents[parent1], parents[parent2]))
```
Do stworzenia potomstwa używana jest funkcja ``crossover``, która wylicza wartości, jakie przyjmie nowe potomstwo.
Wartośc ta to mediana wartości obu rodziców. Z **[*GA.py/crossover()*](https://git.wmi.amu.edu.pl/s444409/DSZI_Survival/src/master/src/AI/GA.py)**:
```python
for gene1, gene2 in zip(genes1, genes2):
result.append((gene1 + gene2) / 2)
```
Po zastosowaniu krzyżówki, jeden losowo wybrany gen jest alterowany o niewielką wartość (mutacja). Z **[*GA.py/mutation()*](https://git.wmi.amu.edu.pl/s444409/DSZI_Survival/src/master/src/AI/GA.py)**:
```python
for player in offspring:
randomGeneIdx = random.randrange(0, len(player))
player[randomGeneIdx] = player[randomGeneIdx] + random.uniform(-1.0, 1.0) * mutationAmount
```
Nowe potomstwo zastępuje obecną populacje i algorytm wchodzi w kolejną pętle:
```python
population = offspring
```
## Skuteczność algorytmu
Zastosowanie algorytmu przynosi niezbyt spektakularne, lecz oczekiwane wyniki. Po uruchomieniu symulacji
dla 1000 generacji:
* Wykres wartości fitness od generacji:
![fig](https://git.wmi.amu.edu.pl/s444409/DSZI_Survival/raw/master/data/images/exampleFitness.png)
* Najlepsze / najgorsze fitness:
```
Best Fitness: 186
Worst Fitness: 71
```
* Zestaw najlepszych / najgorszych wartości
```
Best:
Affinities: food=0.9659207331357987, water=1.06794833921562, rest=0.4224083038045297, walking=0.26676612275274836
Worst:
Affinities: food=0.3927852322929111, water=0.6888704071372844, rest=0.625376993269597, walking=0.5415515638814266
```
### Przykład symulacji dla najlepszego osobnika:
![gif](https://git.wmi.amu.edu.pl/s444409/DSZI_Survival/raw/master/data/images/screenshots/bestFitnessRunExample.gif)
## Zastosowanie w całości projektu
Dzięki wyliczonym przez algorytm wagom, gracz poruszający się w środowisku będzie znał swoje priorytety i będzie w stanie
przeżyć jak najdłużej. Obecnie, wybór obiektu jest dość statyczny i niezbyt "mądry", został napisany jedynie
na potrzeby tego projektu. W przyszłości algorytm może być trenowany według inteligentnych wyborów obiektów np. poprzez zastosowanie
drzewa decyzyjnego. Każdy obiekt ma zdefiniowany swój skutek, czyli gracz z góry wie, czym jest dany obiekt. W przyszłości
gracz może nie znać informacji o obiektach, może być do tego używany jakiś inny algorytm, który oceni,
czym jest dany obiekt.

70
NeuralNetwork.md Normal file
View File

@ -0,0 +1,70 @@
# DSZI_Survival - Sieć Neuronowa
### Autor: Jonathan Spaczyński
## Cel zastosowania w projekcie
W projekcie DSZI_Survival sieć neuronowa użyta jest do podejmowania decyzji przez agenta.
Decyzja polega na rozpoznawaniu zdjęć owoców (jabłka i gruszki). W przypadku nie rozpoznania owocu przez
agenta, dochodzi do zatrucia i agent umiera/przegrywa.
## Przygotowanie danych
* **Krok 1** Przechowywane zdjęcia owoców muszą przejść przez proces zamiany zdjęcia (.jpg) na dane, które
mogą być wykorzystane przez sieć neuronową.
```python
CATEGORIES = ["Apple", "Pear"]
IMG_SIZE = 64
training_data = []
def create_training_data():
for category in CATEGORIES:
path = os.path.join(DATADIR, category)
class_num = CATEGORIES.index(category)
for img in os.listdir(path):
try:
img_array = cv2.imread(os.path.join(path, img), cv2.IMREAD_GRAYSCALE)
new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
training_data.append([new_array, class_num])
except Exception as e:
pass
```
zdjęcia są przechowywane w tablicy training_data wraz z klasyfikacją (class_num) odpowiadającą jakim typem owocu jest zdjęcie
* **Krok 2** Bardzo ważnym krokiem jest pomieszanie danych. W przeciwnym wypadku nasz model po ciągłym otrzymywanie danych
reprezentujących tylko jedną kategorię owoców mógłby się wyuczyć, aby tylko zgadywać tą kategorię.
```python
random.shuffle(training_data)
```
* **Krok 3** Ostatnim krokiem jest zaktualizowanie danych w taki sposób żeby były z przedziału
od 0 d 255 (reprezentacja koloru danego pixela)
```python
X = X / 255.0
```
## Kilka słów na temat danych
* **Ilość Danych** Do trenowania modelu wykorzystałem 8568 zdjęć gruszek i jabłek
z czego mniej więcej połowa danych była jednym z typów ww. owoców, a druga połowa
reprezentowała pozostałą kategorią
* **Dane wykorzystane do obliczenia skutecznośći** stanowiły małą i oddzielną część danych wykorzystanych do trenowania.
## Model
* **Dane wejściowe:** Dane o kształcie 64x64 reprezentujące pixele w zdjęciach owoców
* **Warstwa ukryta:** Składająca się z 128 "neuronów" wykorzystującą sigmoid jako funkcję aktywacyjną
* **Warstwa wyjściowa:** Składająca się z 2 "neuronów" reprezentujących gruszkę i jabłko
* **Stała ucząca:** 0.001
```python
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=(64, 64)),
tf.keras.layers.Dense(128, activation=tf.nn.sigmoid),
tf.keras.layers.Dense(2, activation=tf.nn.sigmoid)
])
model.compile(tf.keras.optimizers.Adam(lr=0.001),
loss="sparse_categorical_crossentropy",
metrics=["accuracy"])
```
## Osiągniecia modelu
* **Trafność:** 86.4%
* **Strata:** 0.312

View File

@ -13,12 +13,18 @@ Python 3.x
pygame: 1.9.x
```
## Uruchomienie
Projekt można uruchomić w dwóch trybach, które podajemy jako parametry:
* test: Wizualne środowisko agenta, którym możemy sami prouszać
* ga: Uruchomienie algorytmu genetycznego w tle. Musimy dodatkowo jako kolejny
parametr podać ilość iteracji dla algorytmu. Możemy dodać -t, jeżeli
chcemy uruchomić algorytm w wielu wątkach (Nie działa zbyt dobrze)
```
$ python Run.py
$ python Run.py {test|ga} [iter] [-t]
```
## Konfiguracja
Plik z konfiguracją znajduje w ```data/config/mainConfig.json```.
## Sterowanie
* Poruszanie się: *WASD*
* A*: ***u*** lub click myszką w jednostkę (np; królik)
* Interakcja: *SPACJA*

5
Run.py
View File

@ -1,6 +1,7 @@
from pathlib import Path
import sys
from src.game.Game import Game
# TODO: Paths are still retarded
programPath = Path(".").resolve()
game = Game(programPath)
game = Game(programPath, sys.argv)

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Some files were not shown because too many files have changed in this diff Show More