├── icon.png ├── Global.gd ├── assets ├── black32.png ├── white8.png ├── white8.png.import └── black32.png.import ├── README.md ├── .import ├── icon.png-487276ed1e3a0c39cad0279d744ee560.md5 ├── white8.png-6b8f9104e106ce224eec4031eb3d6840.md5 ├── white8.png-a3fd63c04cb5d54586031b638917ce08.md5 ├── black32.png-963d1df036cc61992e61cf401ebeb391.md5 ├── black32.png-9fe8a83339c90cfcb1315dab111dd06d.md5 ├── icon.png-487276ed1e3a0c39cad0279d744ee560.stex ├── white8.png-6b8f9104e106ce224eec4031eb3d6840.stex ├── white8.png-a3fd63c04cb5d54586031b638917ce08.stex ├── black32.png-963d1df036cc61992e61cf401ebeb391.stex └── black32.png-9fe8a83339c90cfcb1315dab111dd06d.stex ├── default_env.tres ├── src ├── goal │ └── goal.tscn ├── creature │ ├── creature.tscn │ └── creature.gd ├── MainScene.gd └── MainScene.tscn ├── icon.png.import └── project.godot /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimforbigfoot/Genetic-Algorithm-In-Godot/HEAD/icon.png -------------------------------------------------------------------------------- /Global.gd: -------------------------------------------------------------------------------- 1 | extends Node 2 | 3 | var bestDNA 4 | var bestFit :float= 10000000.0 5 | var generationNum := 0 6 | -------------------------------------------------------------------------------- /assets/black32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimforbigfoot/Genetic-Algorithm-In-Godot/HEAD/assets/black32.png -------------------------------------------------------------------------------- /assets/white8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimforbigfoot/Genetic-Algorithm-In-Godot/HEAD/assets/white8.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Genetic-Algorithm-In-Godot 2 | Exactly what the title says. 3 | 4 | Video Link is here 5 | https://youtu.be/TMztBMRGrOQ 6 | -------------------------------------------------------------------------------- /.import/icon.png-487276ed1e3a0c39cad0279d744ee560.md5: -------------------------------------------------------------------------------- 1 | source_md5="47313fa4c47a9963fddd764e1ec6e4a8" 2 | dest_md5="2ded9e7f9060e2b530aab678b135fc5b" 3 | 4 | -------------------------------------------------------------------------------- /.import/white8.png-6b8f9104e106ce224eec4031eb3d6840.md5: -------------------------------------------------------------------------------- 1 | source_md5="96bf82eb40466a2d60ada2891f294c2f" 2 | dest_md5="2aa44df5727b6d79ac74ccc82a13c102" 3 | 4 | -------------------------------------------------------------------------------- /.import/white8.png-a3fd63c04cb5d54586031b638917ce08.md5: -------------------------------------------------------------------------------- 1 | source_md5="96bf82eb40466a2d60ada2891f294c2f" 2 | dest_md5="2aa44df5727b6d79ac74ccc82a13c102" 3 | 4 | -------------------------------------------------------------------------------- /.import/black32.png-963d1df036cc61992e61cf401ebeb391.md5: -------------------------------------------------------------------------------- 1 | source_md5="9dfecf53861b7e30d960e67ea2fce76e" 2 | dest_md5="812c9a07de29aface372609454ef9e56" 3 | 4 | -------------------------------------------------------------------------------- /.import/black32.png-9fe8a83339c90cfcb1315dab111dd06d.md5: -------------------------------------------------------------------------------- 1 | source_md5="9dfecf53861b7e30d960e67ea2fce76e" 2 | dest_md5="812c9a07de29aface372609454ef9e56" 3 | 4 | -------------------------------------------------------------------------------- /.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimforbigfoot/Genetic-Algorithm-In-Godot/HEAD/.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex -------------------------------------------------------------------------------- /.import/white8.png-6b8f9104e106ce224eec4031eb3d6840.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimforbigfoot/Genetic-Algorithm-In-Godot/HEAD/.import/white8.png-6b8f9104e106ce224eec4031eb3d6840.stex -------------------------------------------------------------------------------- /.import/white8.png-a3fd63c04cb5d54586031b638917ce08.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimforbigfoot/Genetic-Algorithm-In-Godot/HEAD/.import/white8.png-a3fd63c04cb5d54586031b638917ce08.stex -------------------------------------------------------------------------------- /.import/black32.png-963d1df036cc61992e61cf401ebeb391.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimforbigfoot/Genetic-Algorithm-In-Godot/HEAD/.import/black32.png-963d1df036cc61992e61cf401ebeb391.stex -------------------------------------------------------------------------------- /.import/black32.png-9fe8a83339c90cfcb1315dab111dd06d.stex: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimforbigfoot/Genetic-Algorithm-In-Godot/HEAD/.import/black32.png-9fe8a83339c90cfcb1315dab111dd06d.stex -------------------------------------------------------------------------------- /default_env.tres: -------------------------------------------------------------------------------- 1 | [gd_resource type="Environment" load_steps=2 format=2] 2 | 3 | [sub_resource type="ProceduralSky" id=1] 4 | 5 | [resource] 6 | background_mode = 2 7 | background_sky = SubResource( 1 ) 8 | -------------------------------------------------------------------------------- /src/goal/goal.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=3 format=2] 2 | 3 | [ext_resource path="res://assets/white8.png" type="Texture" id=1] 4 | 5 | [sub_resource type="RectangleShape2D" id=1] 6 | extents = Vector2( 24, 24 ) 7 | 8 | [node name="goal" type="Area2D" groups=[ 9 | "goal", 10 | ]] 11 | 12 | [node name="Sprite" type="Sprite" parent="."] 13 | modulate = Color( 1, 0, 0, 1 ) 14 | scale = Vector2( 6, 6 ) 15 | texture = ExtResource( 1 ) 16 | 17 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 18 | shape = SubResource( 1 ) 19 | -------------------------------------------------------------------------------- /icon.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://icon.png" 13 | dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /assets/white8.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/white8.png-6b8f9104e106ce224eec4031eb3d6840.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://assets/white8.png" 13 | dest_files=[ "res://.import/white8.png-6b8f9104e106ce224eec4031eb3d6840.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /assets/black32.png.import: -------------------------------------------------------------------------------- 1 | [remap] 2 | 3 | importer="texture" 4 | type="StreamTexture" 5 | path="res://.import/black32.png-9fe8a83339c90cfcb1315dab111dd06d.stex" 6 | metadata={ 7 | "vram_texture": false 8 | } 9 | 10 | [deps] 11 | 12 | source_file="res://assets/black32.png" 13 | dest_files=[ "res://.import/black32.png-9fe8a83339c90cfcb1315dab111dd06d.stex" ] 14 | 15 | [params] 16 | 17 | compress/mode=0 18 | compress/lossy_quality=0.7 19 | compress/hdr_mode=0 20 | compress/bptc_ldr=0 21 | compress/normal_map=0 22 | flags/repeat=0 23 | flags/filter=true 24 | flags/mipmaps=false 25 | flags/anisotropic=false 26 | flags/srgb=2 27 | process/fix_alpha_border=true 28 | process/premult_alpha=false 29 | process/HDR_as_SRGB=false 30 | process/invert_color=false 31 | stream=false 32 | size_limit=0 33 | detect_3d=true 34 | svg/scale=1.0 35 | -------------------------------------------------------------------------------- /project.godot: -------------------------------------------------------------------------------- 1 | ; Engine configuration file. 2 | ; It's best edited using the editor UI and not directly, 3 | ; since the parameters that go here are not all obvious. 4 | ; 5 | ; Format: 6 | ; [section] ; section goes between [] 7 | ; param=value ; assign values to parameters 8 | 9 | config_version=4 10 | 11 | _global_script_classes=[ ] 12 | _global_script_class_icons={ 13 | 14 | } 15 | 16 | [application] 17 | 18 | config/name="GeneticAlgorithm" 19 | run/main_scene="res://src/MainScene.tscn" 20 | config/icon="res://icon.png" 21 | 22 | [autoload] 23 | 24 | Global="*res://Global.gd" 25 | 26 | [display] 27 | 28 | window/size/width=1280 29 | window/size/height=736 30 | window/stretch/mode="2d" 31 | window/stretch/aspect="keep" 32 | 33 | [physics] 34 | 35 | 2d/default_gravity_vector=Vector2( 0, 0 ) 36 | 37 | [rendering] 38 | 39 | environment/default_environment="res://default_env.tres" 40 | -------------------------------------------------------------------------------- /src/creature/creature.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=4 format=2] 2 | 3 | [ext_resource path="res://assets/white8.png" type="Texture" id=1] 4 | [ext_resource path="res://src/creature/creature.gd" type="Script" id=2] 5 | 6 | [sub_resource type="RectangleShape2D" id=1] 7 | extents = Vector2( 8, 8 ) 8 | 9 | [node name="creature" type="Area2D"] 10 | position = Vector2( 256, 384 ) 11 | script = ExtResource( 2 ) 12 | 13 | [node name="Sprite" type="Sprite" parent="."] 14 | scale = Vector2( 2, 2 ) 15 | texture = ExtResource( 1 ) 16 | 17 | [node name="CollisionShape2D" type="CollisionShape2D" parent="."] 18 | shape = SubResource( 1 ) 19 | 20 | [node name="Timer" type="Timer" parent="."] 21 | wait_time = 0.05 22 | autostart = true 23 | [connection signal="area_entered" from="." to="." method="_on_creature_area_entered"] 24 | [connection signal="body_entered" from="." to="." method="_on_creature_body_entered"] 25 | [connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"] 26 | -------------------------------------------------------------------------------- /src/creature/creature.gd: -------------------------------------------------------------------------------- 1 | extends Area2D 2 | 3 | var original := false 4 | var dead := false 5 | var alive := false 6 | var speed := 20 7 | var genome := [] 8 | var spotInGenome := 0 9 | var fitness := 0.0 10 | var goal : Area2D 11 | var genomeSize := 75 12 | var mutAmt := 0.05 13 | 14 | func _ready() -> void: 15 | for i in genomeSize: 16 | # print(i) 17 | genome.append(Vector2.ZERO) 18 | randomize() 19 | goal = get_parent().get_parent().get_node("goal") 20 | if Global.bestFit < 500: 21 | mutAmt = 0.01 22 | if Global.bestDNA == null: #original person 23 | for i in genomeSize: 24 | var v := Vector2(rand_range(-1,1),rand_range(-1,1)).normalized()*speed 25 | genome[i] = v 26 | 27 | else: #second gen smth gen 28 | for i in genomeSize: 29 | if randf() < mutAmt: 30 | var v := Vector2(rand_range(-1,1),rand_range(-1,1)).normalized()*speed 31 | genome[i] = v #mutate that gene 32 | else: 33 | genome[i] = Global.bestDNA[i] # keep the same gene 34 | 35 | func _on_Timer_timeout() -> void: 36 | if alive: 37 | spotInGenome += 1 38 | else: 39 | dead = true 40 | # print(fitness) 41 | 42 | 43 | func _physics_process(_delta: float) -> void: 44 | if alive: 45 | if !dead and spotInGenome < genome.size(): 46 | global_position += genome[spotInGenome] 47 | else: 48 | die() 49 | 50 | 51 | func die() -> void: 52 | dead = true 53 | fitness = ((global_position.distance_squared_to(goal.global_position))) 54 | 55 | 56 | 57 | func _on_creature_body_entered(body: Node) -> void: 58 | if body: 59 | dead = true 60 | 61 | func _on_creature_area_entered(area: Area2D) -> void: 62 | if area.is_in_group("goal"): 63 | die() 64 | -------------------------------------------------------------------------------- /src/MainScene.gd: -------------------------------------------------------------------------------- 1 | extends Node2D 2 | 3 | onready var cFolder := $creatureFolder 4 | onready var goal := $goal 5 | export var spawnAmt := 100 6 | 7 | 8 | 9 | func _ready() -> void: 10 | print("We are on gen: "+str(Global.generationNum)) 11 | randomize() 12 | spawnFunc() 13 | 14 | 15 | func spawnFunc() -> void: 16 | if Global.bestDNA: 17 | for i in spawnAmt: 18 | var creature := preload("res://src/creature/creature.tscn").instance() 19 | creature.original = false 20 | cFolder.add_child(creature) 21 | for creature in cFolder.get_children(): 22 | creature.alive = true 23 | creature.dead = false 24 | else: # 25 | for i in spawnAmt: 26 | var creature := preload("res://src/creature/creature.tscn").instance() 27 | creature.original = true 28 | creature.alive = true 29 | cFolder.add_child(creature) 30 | 31 | 32 | 33 | 34 | func _on_Timer_timeout() -> void: 35 | var deadAmt := 0.0 36 | for creature in cFolder.get_children(): 37 | if creature.dead: 38 | deadAmt += 1 39 | if deadAmt == spawnAmt: # everyone is dead 40 | # check for closest person to goal and their fitness 41 | var bestFitnessSoFar := 10000000 42 | var idOfMin := 0 43 | # find the best fitness 44 | for i in cFolder.get_child_count(): 45 | var fittness :float= cFolder.get_child(i).fitness 46 | if fittness < bestFitnessSoFar: 47 | idOfMin = i 48 | bestFitnessSoFar = fittness 49 | # get the best fitness and save it, then reload scene 50 | if Global.bestFit > bestFitnessSoFar: 51 | Global.bestFit = bestFitnessSoFar 52 | Global.bestDNA = cFolder.get_child(idOfMin).genome 53 | Global.generationNum += 1 54 | get_tree().reload_current_scene() 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /src/MainScene.tscn: -------------------------------------------------------------------------------- 1 | [gd_scene load_steps=6 format=2] 2 | 3 | [ext_resource path="res://assets/black32.png" type="Texture" id=1] 4 | [ext_resource path="res://src/MainScene.gd" type="Script" id=2] 5 | [ext_resource path="res://src/goal/goal.tscn" type="PackedScene" id=3] 6 | 7 | [sub_resource type="ConvexPolygonShape2D" id=3] 8 | points = PoolVector2Array( 32, 32, 0, 32, 0, 0, 32, 0 ) 9 | 10 | [sub_resource type="TileSet" id=2] 11 | 1/name = "black32.png 1" 12 | 1/texture = ExtResource( 1 ) 13 | 1/tex_offset = Vector2( 0, 0 ) 14 | 1/modulate = Color( 1, 1, 1, 1 ) 15 | 1/region = Rect2( 0, 0, 32, 32 ) 16 | 1/tile_mode = 0 17 | 1/occluder_offset = Vector2( 0, 0 ) 18 | 1/navigation_offset = Vector2( 0, 0 ) 19 | 1/shape_offset = Vector2( 0, 0 ) 20 | 1/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) 21 | 1/shape = SubResource( 3 ) 22 | 1/shape_one_way = false 23 | 1/shape_one_way_margin = 1.0 24 | 1/shapes = [ { 25 | "autotile_coord": Vector2( 0, 0 ), 26 | "one_way": false, 27 | "one_way_margin": 1.0, 28 | "shape": SubResource( 3 ), 29 | "shape_transform": Transform2D( 1, 0, 0, 1, 0, 0 ) 30 | } ] 31 | 1/z_index = 0 32 | 33 | [node name="MainScene" type="Node2D"] 34 | script = ExtResource( 2 ) 35 | 36 | [node name="TileMap" type="TileMap" parent="."] 37 | tile_set = SubResource( 2 ) 38 | cell_size = Vector2( 32, 32 ) 39 | format = 1 40 | tile_data = PoolIntArray( 0, 1, 0, 1, 1, 0, 2, 1, 0, 3, 1, 0, 4, 1, 0, 5, 1, 0, 6, 1, 0, 7, 1, 0, 8, 1, 0, 9, 1, 0, 10, 1, 0, 11, 1, 0, 12, 1, 0, 13, 1, 0, 14, 1, 0, 15, 1, 0, 16, 1, 0, 17, 1, 0, 18, 1, 0, 19, 1, 0, 20, 1, 0, 21, 1, 0, 22, 1, 0, 23, 1, 0, 24, 1, 0, 25, 1, 0, 26, 1, 0, 27, 1, 0, 28, 1, 0, 29, 1, 0, 30, 1, 0, 31, 1, 0, 32, 1, 0, 33, 1, 0, 34, 1, 0, 35, 1, 0, 36, 1, 0, 37, 1, 0, 38, 1, 0, 39, 1, 0, 65536, 1, 0, 65549, 1, 0, 65550, 1, 0, 65551, 1, 0, 65552, 1, 0, 65553, 1, 0, 65554, 1, 0, 65555, 1, 0, 65556, 1, 0, 65575, 1, 0, 131072, 1, 0, 131085, 1, 0, 131086, 1, 0, 131087, 1, 0, 131088, 1, 0, 131089, 1, 0, 131090, 1, 0, 131091, 1, 0, 131092, 1, 0, 131111, 1, 0, 196608, 1, 0, 196621, 1, 0, 196622, 1, 0, 196623, 1, 0, 196624, 1, 0, 196625, 1, 0, 196626, 1, 0, 196627, 1, 0, 196628, 1, 0, 196647, 1, 0, 262144, 1, 0, 262158, 1, 0, 262159, 1, 0, 262160, 1, 0, 262161, 1, 0, 262162, 1, 0, 262163, 1, 0, 262164, 1, 0, 262183, 1, 0, 327680, 1, 0, 327694, 1, 0, 327695, 1, 0, 327696, 1, 0, 327697, 1, 0, 327698, 1, 0, 327699, 1, 0, 327700, 1, 0, 327719, 1, 0, 393216, 1, 0, 393232, 1, 0, 393233, 1, 0, 393234, 1, 0, 393235, 1, 0, 393236, 1, 0, 393237, 1, 0, 393255, 1, 0, 458752, 1, 0, 458768, 1, 0, 458769, 1, 0, 458770, 1, 0, 458771, 1, 0, 458772, 1, 0, 458773, 1, 0, 458791, 1, 0, 524288, 1, 0, 524304, 1, 0, 524305, 1, 0, 524306, 1, 0, 524307, 1, 0, 524308, 1, 0, 524309, 1, 0, 524327, 1, 0, 589824, 1, 0, 589840, 1, 0, 589841, 1, 0, 589842, 1, 0, 589843, 1, 0, 589844, 1, 0, 589845, 1, 0, 589846, 1, 0, 589863, 1, 0, 655360, 1, 0, 655377, 1, 0, 655378, 1, 0, 655379, 1, 0, 655380, 1, 0, 655381, 1, 0, 655382, 1, 0, 655399, 1, 0, 720896, 1, 0, 720914, 1, 0, 720915, 1, 0, 720916, 1, 0, 720917, 1, 0, 720918, 1, 0, 720935, 1, 0, 786432, 1, 0, 786452, 1, 0, 786453, 1, 0, 786454, 1, 0, 786471, 1, 0, 851968, 1, 0, 851989, 1, 0, 851990, 1, 0, 852007, 1, 0, 917504, 1, 0, 917526, 1, 0, 917543, 1, 0, 983040, 1, 0, 983062, 1, 0, 983079, 1, 0, 1048576, 1, 0, 1048615, 1, 0, 1114112, 1, 0, 1114145, 1, 0, 1114151, 1, 0, 1179648, 1, 0, 1179679, 1, 0, 1179680, 1, 0, 1179681, 1, 0, 1179687, 1, 0, 1245184, 1, 0, 1245212, 1, 0, 1245213, 1, 0, 1245214, 1, 0, 1245215, 1, 0, 1245216, 1, 0, 1245217, 1, 0, 1245223, 1, 0, 1310720, 1, 0, 1310747, 1, 0, 1310748, 1, 0, 1310749, 1, 0, 1310750, 1, 0, 1310751, 1, 0, 1310752, 1, 0, 1310753, 1, 0, 1310759, 1, 0, 1376256, 1, 0, 1376282, 1, 0, 1376283, 1, 0, 1376284, 1, 0, 1376285, 1, 0, 1376286, 1, 0, 1376287, 1, 0, 1376288, 1, 0, 1376289, 1, 0, 1376290, 1, 0, 1376295, 1, 0, 1441792, 1, 0, 1441793, 1, 0, 1441794, 1, 0, 1441795, 1, 0, 1441796, 1, 0, 1441797, 1, 0, 1441798, 1, 0, 1441799, 1, 0, 1441800, 1, 0, 1441801, 1, 0, 1441802, 1, 0, 1441803, 1, 0, 1441804, 1, 0, 1441805, 1, 0, 1441806, 1, 0, 1441807, 1, 0, 1441808, 1, 0, 1441809, 1, 0, 1441810, 1, 0, 1441811, 1, 0, 1441812, 1, 0, 1441813, 1, 0, 1441814, 1, 0, 1441815, 1, 0, 1441816, 1, 0, 1441817, 1, 0, 1441818, 1, 0, 1441819, 1, 0, 1441820, 1, 0, 1441821, 1, 0, 1441822, 1, 0, 1441823, 1, 0, 1441824, 1, 0, 1441825, 1, 0, 1441826, 1, 0, 1441827, 1, 0, 1441828, 1, 0, 1441829, 1, 0, 1441830, 1, 0, 1441831, 1, 0 ) 41 | 42 | [node name="creatureFolder" type="Node2D" parent="."] 43 | 44 | [node name="Timer" type="Timer" parent="."] 45 | autostart = true 46 | 47 | [node name="goal" parent="." instance=ExtResource( 3 )] 48 | position = Vector2( 1200, 368 ) 49 | z_index = -1 50 | [connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"] 51 | --------------------------------------------------------------------------------