Compare commits

...

2 Commits

4 changed files with 311 additions and 142 deletions

1
a1/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
./venv

1
a1/code/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.venv/

169
a1/code/main.py Normal file
View File

@ -0,0 +1,169 @@
import pygad
import numpy as np
global punish_matrix
global start_pos
global end_pos
global shortest_path
def walk_through_maze(solution_matrix):
global punish_matrix, start_pos, end_pos, maze
solution_matrix = solution_matrix.reshape((len(maze), len(maze)))
queue = [[start_pos]]
def add_to_queue(full_path, x, y):
if (x,y) not in full_path:
full_path.append((x, y))
queue.append(full_path)
while queue != []:
full_path = queue.pop()
x, y = full_path[-1]
if(maze[x][y] == 'E'):
return len(full_path)
if x + 1 < len(maze) :
if solution_matrix[x+1, y] == 1:
add_to_queue(full_path, x+1, y)
if x - 1 >= 0:
if solution_matrix[x-1, y] == 1:
add_to_queue(full_path, x-1, y)
if y + 1 < len(maze) :
if solution_matrix[x, y+1] == 1:
add_to_queue(full_path, x, y+1)
if y - 1 >= 0:
if solution_matrix[x, y-1] == 1:
add_to_queue(full_path, x, y-1)
return 42069
def fitness_func(path, solution_idx):
global punish_matrix, start_pos, end_pos, shortest_path
punish = np.sum(path * punish_matrix.reshape(-1))
print('Matrix multiplication', punish)
# chekc if path is valied from start to end
path = path.reshape(len(punish_matrix), len(punish_matrix))
if path[start_pos] == 0:
punish -= 1000
if path[end_pos] == 0:
punish -= 1000
if path[start_pos] == 1 and path[end_pos] == 1:
walk = walk_through_maze(path)
if walk < shortest_path:
punish += 10000
shortest_path = walk
return punish
def run_genetic_algorithm(m, pm, sp, ep):
# Set global punish matrix
global punish_matrix, start_pos, end_pos, maze, shortest_path
punish_matrix = pm
start_pos = sp
end_pos = ep
maze = m
shortest_path = len(maze) *2
fitness_function = fitness_func
num_generations = 500
num_parents_mating = 4
sol_per_pop = 20
num_genes = punish_matrix.size
init_range_low = 0
init_range_high = 1
parent_selection_type = "sss"
keep_parents = 1
crossover_type = "single_point"
mutation_type = "random"
ga_instance = pygad.GA(num_generations=num_generations,
num_parents_mating=num_parents_mating,
fitness_func=fitness_function,
sol_per_pop=sol_per_pop,
num_genes=num_genes,
init_range_low=init_range_low,
init_range_high=init_range_high,
parent_selection_type=parent_selection_type,
keep_parents=keep_parents,
crossover_type=crossover_type,
mutation_type=mutation_type,
mutation_num_genes=2,
gene_space=[0, 1])
ga_instance.run()
solution, solution_fitness, solution_idx = ga_instance.best_solution()
print("Parameters of the best solution : {solution}".format(
solution=solution))
print(solution.reshape(len(maze), len(maze)))
print("Fitness value of the best solution = {solution_fitness}".format(
solution_fitness=solution_fitness))
def read_mazes():
with open('./mazes.r', 'r') as f:
mazes = []
maze = []
for line in f:
if line == '\n':
mazes.append(maze)
maze = []
continue
maze.append(line.strip())
return mazes
def prepare_maze(maze_ix, mazes):
maze = mazes[maze_ix]
punish_matrix_t = np.zeros((len(maze), len(maze)), dtype=np.int64)
start_index_t = 0, 0
end_index_t = 0, 0
for i, x in enumerate(maze):
for j, y in enumerate(x):
if y == "#":
punish_matrix_t[i, j] = -300
if y == ".":
punish_matrix_t[i, j] = +200
if y == "S":
start_index_t = i, j
if y == "E":
end_index_t = i, j
return maze, punish_matrix_t, start_index_t, end_index_t
def print_maze(maze):
for row in maze:
print(row)
def main():
# Read mazes
mazes = read_mazes()
for i in range(1):
maze, punish_matrix_t, start_index_t, end_index_t = prepare_maze(1, mazes)
run_genetic_algorithm(maze, punish_matrix_t, start_index_t, end_index_t)
print_maze(maze)
if __name__ == "__main__":
main()
"""
mutascija -> nesme mutirati u zid
-> more mutirat v start ce tam ni poti
-> more mutirat v end ce tam ni poti
-> ce je na zidu enka mutiri v 0
tresure kdr bo
crossover ->
malo z weights
TRESURE -> spremeni fitrnes mutacijo in crossover
"""

View File

@ -1,153 +1,151 @@
maze1 = c("##E##",
"#...#",
"#...#",
"#S..#",
"#####")
##E##
#...#
#...#
#S..#
#####
maze2 = c("#####E#",
"#.#.#.#",
"#.....#",
"##.####",
"#....S#",
"#.#..##",
"#######")
#####E#
#.#.#.#
#.....#
##.####
#....S#
#.#..##
#######
maze3 = c("##########",
"#S.......#",
"########.#",
"#........#",
"#.########",
"#........#",
"########.#",
"#........#",
"#.########",
"#E########")
##########
#S.......#
########.#
#........#
#.########
#........#
########.#
#........#
#.########
#E########
maze4 = c("#####E####",
"#...#....#",
"#.######.#",
"#.#......#",
"#.###.####",
"#....S...#",
"#####.##.#",
"#..##.####",
"##.......#",
"##########")
#####E####
#...#....#
#.######.#
#.#......#
#.###.####
#....S...#
#####.##.#
#..##.####
##.......#
##########
maze5 = c("###E###########",
"#........###..#",
"########.....##",
"#.....##.###.##",
"#.###.....##..#",
"#.....###...###",
"####.####.#.###",
"##......#.....#",
"#######.#.###.#",
"#.........#####",
"#.####.S#....##",
"##....#.#######",
"#..##.........#",
"##...###.##.###",
"###############")
###E###########
#........###..#
########.....##
#.....##.###.##
#.###.....##..#
#.....###...###
####.####.#.###
##......#.....#
#######.#.###.#
#.........#####
#.####.S#....##
##....#.#######
#..##.........#
##...###.##.###
###############
maze6 = c("##################",
"##...#####...#####",
"##.#.##....#.....#",
"##.S....##...###.#",
"###.####.#.#.....#",
"#........#.##.####",
"##.#######......##",
"##......##########",
"#####.####....##.#",
"##.........##..#.#",
"#######.#####.##.#",
"####.##.##.....#.#",
"####.##.########.#",
"#................#",
"#..###############",
"##.#.##.#.##.##.##",
"##...............#",
"##########E#######")
##################
##...#####...#####
##.#.##....#.....#
##.S....##...###.#
###.####.#.#.....#
#........#.##.####
##.#######......##
##......##########
#####.####....##.#
##.........##..#.#
#######.#####.##.#
####.##.##.....#.#
####.##.########.#
#................#
#..###############
##.#.##.#.##.##.##
##...............#
##########E#######
maze7 = c("####################",
"#..................#",
"#.##############.###",
"#.########.......###",
"#.#........######..#",
"#.##.##.##........##",
"#.#...#.##.######.##",
"#.###.#.##.....##.##",
"#.###..##########.##",
"#.####.###.........#",
"#.#....#...####.####",
"#.#.####.####.....##",
"#.#......#......####",
"#.###.####.#####...#",
"#.#......#.....#.###",
"#.######...#####.#.#",
"#.#.....##S#...#.#.#",
"#.#########..#.....#",
"#..........###.##.##",
"##########E#########")
####################
#..................#
#.##############.###
#.########.......###
#.#........######..#
#.##.##.##........##
#.#...#.##.######.##
#.###.#.##.....##.##
#.###..##########.##
#.####.###.........#
#.#....#...####.####
#.#.####.####.....##
#.#......#......####
#.###.####.#####...#
#.#......#.....#.###
#.######...#####.#.#
#.#.....##S#...#.#.#
#.#########..#.....#
#..........###.##.##
##########E#########
##########
#S.......#
########.#
#..T.....#
#.########
#........#
########.#
#..T.....#
#.########
#E########
maze3_T = c("##########",
"#S.......#",
"########.#",
"#..T.....#",
"#.########",
"#........#",
"########.#",
"#..T.....#",
"#.########",
"#E########")
#####E####
#...#....#
#.######.#
#.#T.....#
#.###.####
#....S...#
#####.##.#
#..##.####
##....T..#
##########
maze4_T = c("#####E####",
"#...#....#",
"#.######.#",
"#.#T.....#",
"#.###.####",
"#....S...#",
"#####.##.#",
"#..##.####",
"##....T..#",
"##########")
###E###########
#........###..#
########.....##
#..T..##.###.##
#.###.....##..#
#.....###...###
####.####.#.###
##......#.....#
#######.#.###.#
#.........#####
#.####.S#....##
##....#.#######
#..##T........#
##...###.##.###
###############
maze5_T = c("###E###########",
"#........###..#",
"########.....##",
"#..T..##.###.##",
"#.###.....##..#",
"#.....###...###",
"####.####.#.###",
"##......#.....#",
"#######.#.###.#",
"#.........#####",
"#.####.S#....##",
"##....#.#######",
"#..##T........#",
"##...###.##.###",
"###############")
maze7_T = c("####################",
"#..................#",
"#.##############.###",
"#.########.......###",
"#.#.T......######..#",
"#.##.##.##........##",
"#.#...#.##.######.##",
"#.###.#.##....T##.##",
"#.###..##########.##",
"#.####.###.........#",
"#.#....#...####.####",
"#.#.####.####.....##",
"#.#......#......####",
"#.###.####.#####...#",
"#.#T.....#.....#.###",
"#.######...#####.#.#",
"#.#.....##S....#.#.#",
"#.#########..#...T.#",
"#..........###.##.##",
"##########E#########")
####################
#..................#
#.##############.###
#.########.......###
#.#.T......######..#
#.##.##.##........##
#.#...#.##.######.##
#.###.#.##....T##.##
#.###..##########.##
#.####.###.........#
#.#....#...####.####
#.#.####.####.....##
#.#......#......####
#.###.####.#####...#
#.#T.....#.....#.###
#.######...#####.#.#
#.#.....##S....#.#.#
#.#########..#...T.#
#..........###.##.##
##########E#########