From 1c26edad6c27126aafe4995b675aebfa78a4c401 Mon Sep 17 00:00:00 2001 From: Kamszooo Date: Fri, 16 Jun 2023 12:20:46 +0200 Subject: [PATCH] Genetic Alghoritm implemented, Tree moved --- collect | 10 +-- collect.pdf | Bin 27157 -> 27194 bytes garbage_truck.py | 30 +++------ genetic.py | 162 +++++++++++++++++++++++++++++++++++++++++++++++ main.py | 4 ++ tree.py | 35 ++++++++++ 6 files changed, 216 insertions(+), 25 deletions(-) create mode 100644 genetic.py create mode 100644 tree.py diff --git a/collect b/collect index ba376a1..4e3f8f0 100644 --- a/collect +++ b/collect @@ -24,11 +24,11 @@ edge [fontname="helvetica"] ; 6 -> 10 ; 11 [label="garbage_weight <= 0.612\ngini = 0.094\nsamples = 61\nvalue = [3, 58]\nclass = no-collect"] ; 10 -> 11 ; -12 [label="garbage_type <= 2.0\ngini = 0.5\nsamples = 2\nvalue = [1, 1]\nclass = collect"] ; +12 [label="space_occupied <= 0.382\ngini = 0.5\nsamples = 2\nvalue = [1, 1]\nclass = collect"] ; 11 -> 12 ; -13 [label="gini = 0.0\nsamples = 1\nvalue = [1, 0]\nclass = collect"] ; +13 [label="gini = 0.0\nsamples = 1\nvalue = [0, 1]\nclass = no-collect"] ; 12 -> 13 ; -14 [label="gini = 0.0\nsamples = 1\nvalue = [0, 1]\nclass = no-collect"] ; +14 [label="gini = 0.0\nsamples = 1\nvalue = [1, 0]\nclass = collect"] ; 12 -> 14 ; 15 [label="garbage_type <= 2.5\ngini = 0.065\nsamples = 59\nvalue = [2, 57]\nclass = no-collect"] ; 11 -> 15 ; @@ -50,11 +50,11 @@ edge [fontname="helvetica"] ; 5 -> 23 ; 24 [label="gini = 0.0\nsamples = 2\nvalue = [0, 2]\nclass = no-collect"] ; 23 -> 24 ; -25 [label="odour_intensity <= 8.841\ngini = 0.219\nsamples = 8\nvalue = [7, 1]\nclass = collect"] ; +25 [label="days_since_last_collection <= 22.0\ngini = 0.219\nsamples = 8\nvalue = [7, 1]\nclass = collect"] ; 23 -> 25 ; 26 [label="gini = 0.0\nsamples = 6\nvalue = [6, 0]\nclass = collect"] ; 25 -> 26 ; -27 [label="days_since_last_collection <= 22.0\ngini = 0.5\nsamples = 2\nvalue = [1, 1]\nclass = collect"] ; +27 [label="odour_intensity <= 8.841\ngini = 0.5\nsamples = 2\nvalue = [1, 1]\nclass = collect"] ; 25 -> 27 ; 28 [label="gini = 0.0\nsamples = 1\nvalue = [1, 0]\nclass = collect"] ; 27 -> 28 ; diff --git a/collect.pdf b/collect.pdf index 3e1b6cf73613b87b7f654b8c5415471126fb1a0e..b0339fe31463d112b06c63c75f4be688fd7f39ef 100644 GIT binary patch delta 5507 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 delta 5495 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 self.fuel: continue - - - distance = heuristicfn(self.rect.x, self.rect.y, request.x_pos, request.y_pos) // 50 - - r = [ - self.fuel, - distance, - request.volume, - request.last_collection, - request.is_paid, - request.odour_intensity, - request.weight, - request.type - ] - if self.clf.predict([r]) == True: - self.request_list.pop(i) - self.free_space -= request.volume - self.weight_capacity -= request.weight - return request.x_pos, request.y_pos + self.request_list.pop(i) + self.free_space -= request.volume + self.weight_capacity -= request.weight + return request.x_pos, request.y_pos return self.dump_x, self.dump_y @@ -96,7 +83,10 @@ class GarbageTruck: self.weight_capacity_mixed = MAX_WEIGHT_MIXED self.weight_capacity_glass = MAX_WEIGHT_GLASS self.weight_capacity_paper = MAX_WEIGHT_PAPER - request = self.request_list[0] + if self.request_list==[]: + return 1 + else: + request = self.request_list[0] if garbage_type == "glass": if request.weight > self.weight_capacity_glass: return 1 diff --git a/genetic.py b/genetic.py new file mode 100644 index 0000000..b917977 --- /dev/null +++ b/genetic.py @@ -0,0 +1,162 @@ +import pygame +from treelearn import treelearn +import loadmodel +from astar import astar +from state import State +import time +from garbage_truck import GarbageTruck +from heuristicfn import heuristicfn +from map import randomize_map +from heuristicfn import heuristicfn +import pygame as pg +import random +from request import Request + +def determine_fitness(requests_list): + distances = [] + for i in range(len(requests_list)+1): #from: request_list[i].x_pos and .y_pos + temp = [] + for j in range(len(requests_list)+1): + if ji: + if i==0: + dist = heuristicfn(0, 0, requests_list[j-1].x_pos, requests_list[j-1].y_pos) + temp.append(dist) + else: + dist = heuristicfn(requests_list[i-1].x_pos, requests_list[i-1].y_pos, requests_list[j-1].x_pos, requests_list[j-1].y_pos) + temp.append(dist) + distances.append(temp) + return(distances) + + +def perform_permutation(obj_list, perm_list): + result = [None] * len(obj_list) + + for i, index in enumerate(perm_list): + result[int(index)-1] = obj_list[i-1] + return result + +def apply_genetic(request_list): + print("Genetic algorithm started") + + distances = determine_fitness(request_list) + population_size = 12 + num_generations = 8 + mutation_rate = 0.3 + NUM = len(distances) + + def initialize_population(): + population = [] + for _ in range(population_size): + chromosome = ['0'] + while True: + if len(chromosome) == NUM: + chromosome.append('0') + break + + temp = random.randint(1, NUM-1) + temp_str = str(temp) + if temp_str not in chromosome: + chromosome.append(temp_str) + population.append(chromosome) + return population + + def calculate_route_length(route): + length = 0 + for i in range(len(route)-1): + p = int(route[i]) + q = int(route[i + 1]) + length += distances[int(min(p,q))][int(max(p,q))] + return length + + def calculate_fitness(population): + fitness_scores = [] + for chromosome in population: + fitness_scores.append(1 / calculate_route_length(chromosome)) + return fitness_scores + + def parents_selection(population, fitness_scores): + selected_parents = [] + for _ in range(len(population)): + candidates = random.sample(range(len(population)), 2) + fitness1 = fitness_scores[candidates[0]] + fitness2 = fitness_scores[candidates[1]] + selected_parent = population[candidates[0]] if fitness1 > fitness2 else population[candidates[1]] + selected_parents.append(selected_parent) + return selected_parents + + + + def david_crossover(parent1, parent2): + start_index = random.randint(1, len(parent1)-3) + end_index = random.randint(start_index+1, len(parent1)-2) + parent1_chain = parent1[start_index:end_index+1] + parent2_letters = [] + for trash in parent2[1:-1]: + if trash not in parent1_chain: + parent2_letters.append(trash) + child = [parent2[0]]+parent2_letters[0:start_index] + parent1_chain + parent2_letters[start_index:]+[parent2[-1]] + """ print('PARENTS: ') + print(parent1) + print(parent2) + print('CHILDS:') + print(child) """ + return child + + def mutation(chromosome): + index1 = random.randint(1, len(chromosome)-2) + index2 = random.randint(1, len(chromosome)-2) + chromosome[index1], chromosome[index2] = chromosome[index2], chromosome[index1] + return chromosome + + def genetic_algorithm(): + population = initialize_population() + for _ in range(num_generations): + fitness_scores = calculate_fitness(population) + parents = parents_selection(population, fitness_scores) + offspring = [] + for i in range(0, len(parents), 2): + parent1 = parents[i] + parent2 = parents[i+1] + child1 = david_crossover(parent1, parent2) + child2 = david_crossover(parent2, parent1) + offspring.extend([child1, child2]) + population = offspring + for i in range(len(population)): + if random.random() < mutation_rate: + population[i] = mutation(population[i]) + return population + + + best_route = None + best_length = float('inf') + population = genetic_algorithm() + for chromosome in population: + length = calculate_route_length(chromosome) + if length < best_length: + best_length = length + best_route = chromosome + + print("Permutation chosen: ", best_route) + print("Its length:", best_length) + permuted_list = perform_permutation(request_list, best_route[1:-1]) + + + + + + + + + + + + + + + + + diff --git a/main.py b/main.py index 2a5b1cc..157f5a4 100644 --- a/main.py +++ b/main.py @@ -7,6 +7,8 @@ import time from garbage_truck import GarbageTruck from heuristicfn import heuristicfn from map import randomize_map +from tree import apply_tree +from genetic import apply_genetic pygame.init() @@ -38,6 +40,8 @@ def main(): clock = pygame.time.Clock() run = True fields, priority_array, request_list, imgpath_array = randomize_map() + apply_tree(request_list) + apply_genetic(request_list) agent = GarbageTruck(0, 0, pygame.Rect(0, 0, 50, 50), 0, request_list, clf) # tworzenie pola dla agenta low_space = 0 while run: diff --git a/tree.py b/tree.py new file mode 100644 index 0000000..8ca867c --- /dev/null +++ b/tree.py @@ -0,0 +1,35 @@ +import pygame +from treelearn import treelearn +import loadmodel +from astar import astar +from state import State +import time +from garbage_truck import GarbageTruck +from heuristicfn import heuristicfn +from map import randomize_map +from heuristicfn import heuristicfn +import pygame as pg +import random +from request import Request + +def apply_tree(request_list): + + print("Przed zastosowaniem drzewa na liście jest śmieci: ", len(request_list)) + + for address in request_list: + r = [ + 0, + 0, + address.volume, + address.last_collection, + address.is_paid, + address.odour_intensity, + address.weight, + address.type + ] + clf = treelearn() + if clf.predict([r]) == False: + request_list.pop(request_list.index(address)) + + print("Po zastosowaniu drzewa na liście jest śmieci: ", len(request_list)) + return request_list