Compare commits

...

13 Commits

Author SHA1 Message Date
7fdc198997 Poprawiono zapisywanie do pliku 2019-06-05 01:28:25 +02:00
60e9a253be Poprawiono zapisywanie map i inputu pod Linucha 2019-06-04 23:32:44 +02:00
6fbd5c76d0 Naprawiono bledy z rozwiazywania konfliktow 2019-06-04 23:26:26 +02:00
113b8ebea9 Vowpal odroznia domki nieodwiedzone 2019-06-04 23:16:42 +02:00
d95378c72e Fixed index error 2019-06-01 21:52:34 +02:00
913dba936f Added parsing data into a file 2019-06-01 21:46:02 +02:00
c969355d70 Merge branch 'VowpalWabbit' of https://git.wmi.amu.edu.pl/s440556/SZI2019SmieciarzWmi into VowpalWabbit 2019-05-30 21:37:03 +02:00
42d124cc6e Dodano parser 2019-05-30 21:32:56 +02:00
Magdalena Wilczyńska
94064f5d03 Fixed autoshut 2019-05-30 20:23:56 +02:00
Magdalena Wilczyńska
635292d9f5 Added startup flags 2019-05-30 19:37:26 +02:00
Magdalena Wilczyńska
15f88b9e20 Merged master to branch 2019-05-30 19:04:23 +02:00
Magdalena Wilczyńska
abb6dbb5dd Added auto flag to start 2019-05-30 18:37:26 +02:00
22e4a12eff Initialize 2019-05-30 18:09:57 +02:00
18 changed files with 305 additions and 47 deletions

View File

@ -0,0 +1,7 @@
14 5
10 1
R R R R R R R R R R R R R R
R R H H R H E E E Y R B E R
E R E E R H E E E E R R E R
E R E G R E E R E E R H E E
R R R R R R R R R R R R R R

View File

@ -0,0 +1,10 @@
10 8
5 3
E R R R H R R R H E
E R E R E R R R E E
E R E R H R E R E E
E R H R E R E R E E
E R E R E R E R H Y
R R R R R R R R R R
H G B R E R E R E E
R R R R R R R R R R

View File

@ -0,0 +1,8 @@
9 6
6 3
R R R R R R R R R
E R E E R E R H R
R R R R R R R R R
Y H B E R E R E R
E E E E R E R G R
E E E E R E H E R

View File

@ -0,0 +1,7 @@
14 5
6 1
E R E E E E E R E R E E R H
R R R R R R R R R R R R R R
H E R E E H E R E H E E R E
G E E B H E E R E Y H H R E
R R R R R R R R R R R R R R

View File

@ -0,0 +1,59 @@
3 1.0 map20190603114044897991_auto|GC_Position 5,1 |GC_Area E(4,0) R(4,1) E(4,2) E(5,0) H(5,2) E(6,0) R(6,1) E(6,2)
1 1.0 map20190603114044897991_auto|GC_Position 5,1 |GC_Area E(4,0) R(4,1) E(4,2) E(5,0) H(5,2) E(6,0) R(6,1) E(6,2)
3 1.0 map20190603114044897991_auto|GC_Position 4,1 |GC_Area E(3,0) R(3,1) E(3,2) E(4,0) E(4,2) E(5,0) R(5,1) H(5,2)
3 1.0 map20190603114044897991_auto|GC_Position 3,1 |GC_Area E(2,0) R(2,1) R(2,2) E(3,0) E(3,2) E(4,0) R(4,1) E(4,2)
3 1.0 map20190603114044897991_auto|GC_Position 2,1 |GC_Area R(1,0) R(1,1) E(1,2) E(2,0) R(2,2) E(3,0) R(3,1) E(3,2)
3 1.0 map20190603114044897991_auto|GC_Position 1,1 |GC_Area E(0,0) R(0,1) H(0,2) R(1,0) E(1,2) E(2,0) R(2,1) R(2,2)
3 1.0 map20190603114044897991_auto|GC_Position 0,1 |GC_Area E(0,0) H(0,2) R(1,0) R(1,1) E(1,2)
1 1.0 map20190603114044897991_auto|GC_Position 0,1 |GC_Area E(0,0) H(0,2) R(1,0) R(1,1) E(1,2)
2 1.0 map20190603114044897991_auto|GC_Position 1,1 |GC_Area E(0,0) R(0,1) H(0,2) R(1,0) E(1,2) E(2,0) R(2,1) R(2,2)
2 1.0 map20190603114044897991_auto|GC_Position 2,1 |GC_Area R(1,0) R(1,1) E(1,2) E(2,0) R(2,2) E(3,0) R(3,1) E(3,2)
2 1.0 map20190603114044897991_auto|GC_Position 3,1 |GC_Area E(2,0) R(2,1) R(2,2) E(3,0) E(3,2) E(4,0) R(4,1) E(4,2)
2 1.0 map20190603114044897991_auto|GC_Position 4,1 |GC_Area E(3,0) R(3,1) E(3,2) E(4,0) E(4,2) E(5,0) R(5,1) H(5,2)
2 1.0 map20190603114044897991_auto|GC_Position 5,1 |GC_Area E(4,0) R(4,1) E(4,2) E(5,0) H(5,2) E(6,0) R(6,1) E(6,2)
2 1.0 map20190603114044897991_auto|GC_Position 6,1 |GC_Area E(5,0) R(5,1) H(5,2) E(6,0) E(6,2) R(7,0) R(7,1) R(7,2)
2 1.0 map20190603114044897991_auto|GC_Position 7,1 |GC_Area E(6,0) R(6,1) E(6,2) R(7,0) R(7,2) E(8,0) R(8,1) E(8,2)
2 1.0 map20190603114044897991_auto|GC_Position 8,1 |GC_Area R(7,0) R(7,1) R(7,2) E(8,0) E(8,2) R(9,0) R(9,1) H(9,2)
2 1.0 map20190603114044897991_auto|GC_Position 9,1 |GC_Area E(8,0) R(8,1) E(8,2) R(9,0) H(9,2) E(10,0) R(10,1) E(10,2)
1 1.0 map20190603114044897991_auto|GC_Position 9,1 |GC_Area E(8,0) R(8,1) E(8,2) R(9,0) H(9,2) E(10,0) R(10,1) E(10,2)
2 1.0 map20190603114044897991_auto|GC_Position 10,1 |GC_Area R(9,0) R(9,1) H(9,2) E(10,0) E(10,2) E(11,0) R(11,1) E(11,2)
2 1.0 map20190603114044897991_auto|GC_Position 11,1 |GC_Area E(10,0) R(10,1) E(10,2) E(11,0) E(11,2) R(12,0) R(12,1) R(12,2)
2 1.0 map20190603114044897991_auto|GC_Position 12,1 |GC_Area E(11,0) R(11,1) E(11,2) R(12,0) R(12,2) H(13,0) R(13,1) E(13,2)
2 1.0 map20190603114044897991_auto|GC_Position 13,1 |GC_Area R(12,0) R(12,1) R(12,2) H(13,0) E(13,2)
1 1.0 map20190603114044897991_auto|GC_Position 13,1 |GC_Area R(12,0) R(12,1) R(12,2) H(13,0) E(13,2)
3 1.0 map20190603114044897991_auto|GC_Position 12,1 |GC_Area E(11,0) R(11,1) E(11,2) R(12,0) R(12,2) H(13,0) R(13,1) E(13,2)
3 1.0 map20190603114044897991_auto|GC_Position 11,1 |GC_Area E(10,0) R(10,1) E(10,2) E(11,0) E(11,2) R(12,0) R(12,1) R(12,2)
3 1.0 map20190603114044897991_auto|GC_Position 10,1 |GC_Area R(9,0) R(9,1) H(9,2) E(10,0) E(10,2) E(11,0) R(11,1) E(11,2)
3 1.0 map20190603114044897991_auto|GC_Position 9,1 |GC_Area E(8,0) R(8,1) E(8,2) R(9,0) H(9,2) E(10,0) R(10,1) E(10,2)
3 1.0 map20190603114044897991_auto|GC_Position 8,1 |GC_Area R(7,0) R(7,1) R(7,2) E(8,0) E(8,2) R(9,0) R(9,1) H(9,2)
3 1.0 map20190603114044897991_auto|GC_Position 7,1 |GC_Area E(6,0) R(6,1) E(6,2) R(7,0) R(7,2) E(8,0) R(8,1) E(8,2)
5 1.0 map20190603114044897991_auto|GC_Position 7,2 |GC_Area R(6,1) E(6,2) E(6,3) R(7,1) R(7,3) R(8,1) E(8,2) E(8,3)
5 1.0 map20190603114044897991_auto|GC_Position 7,3 |GC_Area E(6,2) E(6,3) R(6,4) R(7,2) R(7,4) E(8,2) E(8,3) R(8,4)
5 1.0 map20190603114044897991_auto|GC_Position 7,4 |GC_Area E(6,3) R(6,4) R(7,3) E(8,3) R(8,4)
3 1.0 map20190603114044897991_auto|GC_Position 6,4 |GC_Area E(5,3) R(5,4) E(6,3) R(7,3) R(7,4)
3 1.0 map20190603114044897991_auto|GC_Position 5,4 |GC_Area H(4,3) R(4,4) E(5,3) E(6,3) R(6,4)
3 1.0 map20190603114044897991_auto|GC_Position 4,4 |GC_Area B(3,3) R(3,4) H(4,3) E(5,3) R(5,4)
1 1.0 map20190603114044897991_auto|GC_Position 4,4 |GC_Area B(3,3) R(3,4) H(4,3) E(5,3) R(5,4)
2 1.0 map20190603114044897991_auto|GC_Position 5,4 |GC_Area H(4,3) R(4,4) E(5,3) E(6,3) R(6,4)
2 1.0 map20190603114044897991_auto|GC_Position 6,4 |GC_Area E(5,3) R(5,4) E(6,3) R(7,3) R(7,4)
2 1.0 map20190603114044897991_auto|GC_Position 7,4 |GC_Area E(6,3) R(6,4) R(7,3) E(8,3) R(8,4)
2 1.0 map20190603114044897991_auto|GC_Position 8,4 |GC_Area R(7,3) R(7,4) E(8,3) Y(9,3) R(9,4)
2 1.0 map20190603114044897991_auto|GC_Position 9,4 |GC_Area E(8,3) R(8,4) Y(9,3) H(10,3) R(10,4)
2 1.0 map20190603114044897991_auto|GC_Position 10,4 |GC_Area Y(9,3) R(9,4) H(10,3) H(11,3) R(11,4)
1 1.0 map20190603114044897991_auto|GC_Position 10,4 |GC_Area Y(9,3) R(9,4) H(10,3) H(11,3) R(11,4)
2 1.0 map20190603114044897991_auto|GC_Position 11,4 |GC_Area H(10,3) R(10,4) H(11,3) R(12,3) R(12,4)
1 1.0 map20190603114044897991_auto|GC_Position 11,4 |GC_Area H(10,3) R(10,4) H(11,3) R(12,3) R(12,4)
3 1.0 map20190603114044897991_auto|GC_Position 10,4 |GC_Area Y(9,3) R(9,4) H(10,3) H(11,3) R(11,4)
3 1.0 map20190603114044897991_auto|GC_Position 9,4 |GC_Area E(8,3) R(8,4) Y(9,3) H(10,3) R(10,4)
1 1.0 map20190603114044897991_auto|GC_Position 9,4 |GC_Area E(8,3) R(8,4) Y(9,3) H(10,3) R(10,4)
3 1.0 map20190603114044897991_auto|GC_Position 8,4 |GC_Area R(7,3) R(7,4) E(8,3) Y(9,3) R(9,4)
3 1.0 map20190603114044897991_auto|GC_Position 7,4 |GC_Area E(6,3) R(6,4) R(7,3) E(8,3) R(8,4)
3 1.0 map20190603114044897991_auto|GC_Position 6,4 |GC_Area E(5,3) R(5,4) E(6,3) R(7,3) R(7,4)
3 1.0 map20190603114044897991_auto|GC_Position 5,4 |GC_Area H(4,3) R(4,4) E(5,3) E(6,3) R(6,4)
3 1.0 map20190603114044897991_auto|GC_Position 4,4 |GC_Area B(3,3) R(3,4) H(4,3) E(5,3) R(5,4)
3 1.0 map20190603114044897991_auto|GC_Position 3,4 |GC_Area E(2,3) R(2,4) B(3,3) H(4,3) R(4,4)
1 1.0 map20190603114044897991_auto|GC_Position 3,4 |GC_Area E(2,3) R(2,4) B(3,3) H(4,3) R(4,4)
3 1.0 map20190603114044897991_auto|GC_Position 2,4 |GC_Area E(1,3) R(1,4) E(2,3) B(3,3) R(3,4)
3 1.0 map20190603114044897991_auto|GC_Position 1,4 |GC_Area G(0,3) R(0,4) E(1,3) E(2,3) R(2,4)
3 1.0 map20190603114044897991_auto|GC_Position 0,4 |GC_Area G(0,3) E(1,3) R(1,4)
1 1.0 map20190603114044897991_auto|GC_Position 0,4 |GC_Area G(0,3) E(1,3) R(1,4)

View File

@ -0,0 +1,18 @@
2 1.0 map_001|GC_Position 3,1 |GC_Area E(2,0) R(2,1) E(2,2) V(3,0) R(3,2) E(4,0) E(4,1) E(4,2)
5 1.0 map_001|GC_Position 3,2 |GC_Area R(2,1) E(2,2) E(2,3) R(3,1) R(3,3) E(4,1) E(4,2) R(4,3)
5 1.0 map_001|GC_Position 3,3 |GC_Area E(2,2) E(2,3) E(2,4) R(3,2) E(3,4) E(4,2) R(4,3) R(4,4)
2 1.0 map_001|GC_Position 4,3 |GC_Area R(3,2) R(3,3) E(3,4) E(4,2) R(4,4) R(5,2) R(5,3) V(5,4)
2 1.0 map_001|GC_Position 5,3 |GC_Area E(4,2) R(4,3) R(4,4) R(5,2) V(5,4) E(6,2) R(6,3) E(6,4)
2 1.0 map_001|GC_Position 6,3 |GC_Area R(5,2) R(5,3) V(5,4) E(6,2) E(6,4) G(7,2) R(7,3) R(7,4)
2 1.0 map_001|GC_Position 7,3 |GC_Area E(6,2) R(6,3) E(6,4) G(7,2) R(7,4) E(8,2) E(8,3) E(8,4)
5 1.0 map_001|GC_Position 7,4 |GC_Area R(6,3) E(6,4) R(6,5) R(7,3) R(7,5) E(8,3) E(8,4) E(8,5)
5 1.0 map_001|GC_Position 7,5 |GC_Area E(6,4) R(6,5) R(6,6) R(7,4) V(7,6) E(8,4) E(8,5) E(8,6)
3 1.0 map_001|GC_Position 6,5 |GC_Area V(5,4) E(5,5) R(5,6) E(6,4) R(6,6) R(7,4) R(7,5) V(7,6)
5 1.0 map_001|GC_Position 6,6 |GC_Area E(5,5) R(5,6) R(5,7) R(6,5) E(6,7) R(7,5) V(7,6) E(7,7)
3 1.0 map_001|GC_Position 5,6 |GC_Area R(4,5) E(4,6) R(4,7) E(5,5) R(5,7) R(6,5) R(6,6) E(6,7)
5 1.0 map_001|GC_Position 5,7 |GC_Area E(4,6) R(4,7) V(4,8) R(5,6) R(5,8) R(6,6) E(6,7) R(6,8)
3 1.0 map_001|GC_Position 4,7 |GC_Area V(3,6) R(3,7) E(3,8) E(4,6) V(4,8) R(5,6) R(5,7) R(5,8)
3 1.0 map_001|GC_Position 3,7 |GC_Area R(2,6) R(2,7) V(2,8) V(3,6) E(3,8) E(4,6) R(4,7) V(4,8)
3 1.0 map_001|GC_Position 2,7 |GC_Area B(1,6) E(1,7) E(1,8) R(2,6) V(2,8) V(3,6) R(3,7) E(3,8)
4 1.0 map_001|GC_Position 2,6 |GC_Area R(1,5) B(1,6) E(1,7) R(2,5) R(2,7) R(3,5) V(3,6) R(3,7)
1 1.0 map_001|GC_Position 2,6 |GC_Area R(1,5) B(1,6) E(1,7) R(2,5) R(2,7) R(3,5) V(3,6) R(3,7)

View File

@ -0,0 +1,5 @@
2 1.0 map_005|GC_Position 2,6 |GC_Area R(1,5) R(1,6) E(2,5) E(3,5) R(3,6)
2 1.0 map_005|GC_Position 3,6 |GC_Area E(2,5) R(2,6) E(3,5) E(4,5) R(4,6)
2 1.0 map_005|GC_Position 4,6 |GC_Area E(3,5) R(3,6) E(4,5) R(5,5) R(5,6)
2 1.0 map_005|GC_Position 5,6 |GC_Area E(4,5) R(4,6) R(5,5) E(6,5) V(6,6)
1 1.0 map_005|GC_Position 5,6 |GC_Area E(4,5) R(4,6) R(5,5) E(6,5) V(6,6)

2
.gitignore vendored
View File

@ -5,4 +5,4 @@ env
.vscode
*.swp
linux_env
moveset_data.json
moveset_data.json

View File

@ -2,26 +2,27 @@ from DataModels.Cell import Cell
from DataModels.Road import Road
from DataModels.House import House
from DataModels.Dump import Dump
from config import GRID_WIDTH, GRID_HEIGHT, DELAY
from config import GRID_WIDTH, GRID_HEIGHT, DELAY, CLOSE_ON_END
from utilities import movement, check_moves, save_moveset
from vowpal_utils import parse_list, MAP_CONTENT
from Traversal.DFS import DFS
from Traversal.BestFS import BestFS
from Traversal.BFS import BFS
import pygame
import pygame, sys
class GC(Cell):
moves_made = 0
algorithm_run = False
def __init__(self, x, y, max_rubbish, yellow=0, green=0, blue=0):
Cell.__init__(self, x, y, max_rubbish, yellow, green, blue)
self.moves = []
self.old_time = pygame.time.get_ticks()
def move(self, direction, environment):
self.x, self.y = movement(environment, self.x, self.y)[0][direction]
self.update_rect(self.x, self.y)
self.moves_made = self.moves_made + 1 #moves counter
print(check_moves(environment, self.x, self.y,direction))
def collect(self, enviromnent):
x, y = [self.x, self.y]
coordinates = [(x, y - 1), (x, y + 1), (x - 1, y), (x + 1, y)]
@ -41,80 +42,96 @@ class GC(Cell):
return self.moves_made
def find_houses(self,enviromnent, house_count,dump_count, mode):
self.algorithm_run = True
x = self.x
y = self.y
result = []
whole_result=[]
element_list=[]
house_count_after_search=house_count
for home in range(house_count):
last_x = x
last_y = y
avalible_moves = check_moves(enviromnent, x,y)
if mode == "DFS":
house,[x,y],result = DFS(enviromnent,avalible_moves,[[x,y]],House)
elif mode == "BFS":
house,[x,y],result = BFS(enviromnent,avalible_moves,[[x,y]],House)
result = result[1::]
self.moves.extend(result)
self.moves.extend(parse_list(result[1:], last_x,last_y))
element_list.append(house)
MAP_CONTENT[house.y][house.x] = 'V'
for dump in range(dump_count):
last_x = x
last_y = y
avalible_moves = check_moves(enviromnent, x,y)
if mode == "DFS":
dump,[x,y],result = DFS(enviromnent,avalible_moves,[[x,y]],Dump)
elif mode == "BFS":
dump,[x,y],result = BFS(enviromnent,avalible_moves,[[x,y]],Dump)
self.moves.extend(result)
self.moves.extend(parse_list(result[1:], last_x,last_y))
element_list.append(dump)
for x in element_list:
x.unvisited = True
self.moves.reverse()
save_moveset(self.moves)
def find_houses_BestFS(self, environment):
self.algorithm_run = True
x = self.x
y = self.y
result = [[x,y]]
whole_result=[]
houses_list = []
dump_list = []
a = 0
for row in environment:
b = 0
for col in row:
if (type(col) is House):
for col in row:
if (type(col) is House):
houses_list.append([col,[a,b]])
if (type(col) is Dump):
dump_list.append([col,[a,b]])
if (type(col) is Dump):
dump_list.append([col,[a,b]])
b += 1
a += 1
x, y = self.x, self.y
print(MAP_CONTENT)
for i in range(len(houses_list)):
last_x = x
last_y = y
available_movement = check_moves(environment, x, y)
output = BestFS(environment, available_movement, [[x,y]], houses_list)
if(output != None):
[x,y],result,houses_list = output[0], output[1], output[2]
self.moves.extend(result[1:])
[x,y],result,houses_list,house = output[0], output[1], output[2], output[3]
MAP_CONTENT[house.y][house.x] = 'V'
self.moves.extend(parse_list(result[1:], last_x,last_y))
for i in range(len(dump_list)):
last_x = x
last_y = y
available_movement = check_moves(environment, x, y)
output = BestFS(environment, available_movement, [[x,y]], dump_list)
if(output != None):
[x,y],result,dump_list = output[0], output[1], output[2]
self.moves.extend(result[1:])
self.moves.extend(parse_list(result[1:], last_x,last_y))
self.moves.reverse()
print(MAP_CONTENT)
save_moveset(self.moves)
def make_actions_from_list(self,environment):
now = pygame.time.get_ticks()
if len(self.moves)==0 or now - self.old_time <= DELAY:
if(len(self.moves)==0 and CLOSE_ON_END=="true" and self.algorithm_run):
print("DONE")
sys.exit()
return
self.old_time = pygame.time.get_ticks()
if self.moves[-1] == "pick_garbage":
self.collect(environment)
self.moves.pop()
return
self.x, self.y = self.moves.pop()
self.moves_made = self.moves_made + 1 #moves counter
self.update_rect(self.x,self.y)
direction = self.moves.pop()
self.move(direction,environment)

View File

@ -5,4 +5,4 @@ class Road( pygame.sprite.Sprite ):
def __init__( self, x, y ):
pygame.sprite.Sprite.__init__( self )
self.rect = pygame.Rect( x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE )
self.image = pygame.image.load("Resources/Images/Image_Road.png")
self.image = pygame.image.load("Resources/Images/Image_Road.png")

View File

@ -59,7 +59,7 @@ def GenerateMap():
possible_roads_to_modify = [i for i in roads if i not in intersections_area]
roads_to_modify = []
for i in range(1,len(possible_roads_to_modify)//3):
for i in range(1,len(possible_roads_to_modify)//3):
choice = random.choice(possible_roads_to_modify)
possible_roads_to_modify.remove(choice)
roads_to_modify.append(choice)
@ -90,7 +90,7 @@ def GenerateMap():
else:
route.append(current_tile)
current_tile = [current_tile[0]+direction,current_tile[1]]
#choose if the route should be complete or not
if(len(route)>1):
if(random.randint(1,100)<=65): #40% chance for route not to be full length
@ -113,7 +113,7 @@ def GenerateMap():
objects_area = [c for c in objects_area if c not in roads] #remove coords that contain roads
objects_area.sort()
objects_area = [objects_area[i] for i in range(len(objects_area)) if i == 0 or objects_area[i] != objects_area[i-1]] #remove duplicates
houses_area = [i.copy() for i in objects_area]
for o in objects_area:
if(o[0] < 0 or o[1] < 0 or o[0] >= width or o[1] >= height):
@ -132,7 +132,7 @@ def GenerateMap():
houses_to_leave_count = len(houses_area)//4
while(len(houses_area) > houses_to_leave_count):
houses_area.remove(random.choice(houses_area))
#insert houses into the grid
for coord in houses_area:
grid[coord[1]][coord[0]] = "H"
@ -141,7 +141,7 @@ def GenerateMap():
GC_position = random.choice(roads)
#Save map to file
name = ".\\Resources\\Maps\\map"+str(datetime.datetime.now().strftime("%Y%m%d%H%M%S"))+"_auto.txt"
name = "./Resources/Maps/map"+str(datetime.datetime.now().strftime("%Y%m%d%H%M%S%f"))+"_auto.txt"
map_file = open(name, "w+")
map_file.write(str(width)+" "+str(height)+"\n")
map_file.write(str(GC_position[0])+" "+str(GC_position[1])+"\n")
@ -150,4 +150,4 @@ def GenerateMap():
map_file.close()
print(name)
return(name)
return(name)

View File

@ -15,7 +15,7 @@ def CalculateDistance(gc, object_list):
return min_distance_goal
def BestFS(grid, available_movement, gc_moveset, object_list, depth = 0):
x, y = gc_moveset[-1][0], gc_moveset[-1][1]
#calculate distance to the nearest object
@ -25,11 +25,11 @@ def BestFS(grid, available_movement, gc_moveset, object_list, depth = 0):
gc_moveset.append("pick_garbage")
cell = grid[min_distance_goal[0][0]][min_distance_goal[0][1]]
object_list.remove([cell,min_distance_goal[0]])
return([x, y], gc_moveset, object_list)
return([x, y], gc_moveset, object_list,cell)
#if depth exceeded, return
if(depth > 15 or len(available_movement) == 0):
return
return
#set preffered directions based on the closest object
preffered_directions = []
@ -65,4 +65,4 @@ def BestFS(grid, available_movement, gc_moveset, object_list, depth = 0):
gc_moveset_next.append([x_next,y_next])
result = BestFS(grid, available_movement_next, gc_moveset_next, object_list, depth + 1)
if result!= None:
return result
return result

View File

@ -1,15 +1,34 @@
import sys, random
from MapGenerator import GenerateMap
import sys, random, MapGenerator
CELL_SIZE = 64
FPS = 60
DELAY = 50
DELAY = 10
try:
MAP_NAME = sys.argv[1]
map_mode = sys.argv[1]
if(map_mode == "auto"):
MAP_NAME = MapGenerator.GenerateMap()
else:
MAP_NAME = map_mode
except:
MAP_NAME = GenerateMap()
print("ERROR: Invalid map mode\n Please enter \"auto\" for generated map or provide a path to an existing map.")
sys.exit()
if(len(sys.argv)>2):
CLOSE_ON_END = sys.argv[2]
if(CLOSE_ON_END != "true" and CLOSE_ON_END != "false"):
print("ERROR: Invalid close on end statement\n Please enter \"true\" or \"false\" to specify if app has to shut after finding solution.")
sys.exit()
else:
print("ERROR: Invalid close on end statement\n Please enter \"true\" or \"false\" to specify if app has to shut after finding solution.")
sys.exit()
ALGORITHM = None
if(len(sys.argv)>3):
ALGORITHM = sys.argv[3]
if(ALGORITHM != "bfs" and ALGORITHM != "dfs" and ALGORITHM!= "bestfs"):
print("ERROR: Invalid agorithm statement\n Please enter \"bfs\", \"dfs\" or \"bestfs\" to specify algorithm you want to use.")
sys.exit()
map = open( MAP_NAME, 'r' )

13
main.py Normal file → Executable file
View File

@ -3,7 +3,7 @@
import pygame
import sys
from random import randint
from config import WINDOW_HEIGHT, WINDOW_WIDTH, GRID_HEIGHT, GRID_WIDTH, HOUSE_CAPACITY, FPS, GC_X, GC_Y, MAP_NAME
from config import WINDOW_HEIGHT, WINDOW_WIDTH, GRID_HEIGHT, GRID_WIDTH, HOUSE_CAPACITY, FPS, GC_X, GC_Y, MAP_NAME, ALGORITHM
from PIL import Image,ImageDraw
@ -21,6 +21,8 @@ dump_count=0
FPS_CLOCK = pygame.time.Clock()
GAME_WINDOW = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT), 0, 32)
algorithm = ALGORITHM
map = open(MAP_NAME, 'r')
map.readline()
map.readline()
@ -83,6 +85,15 @@ pygame_sprites.add(gc)
while True:
if(algorithm != None):
if(algorithm == "bfs"):
gc.find_houses(map_objects,house_count,dump_count, "BFS")
elif(algorithm == "dfs"):
gc.find_houses(map_objects,house_count,dump_count, "DFS")
elif (algorithm == "bestfs"):
gc.find_houses_BestFS(map_objects)
algorithm = None
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()

View File

@ -1,7 +1,6 @@
from config import GRID_WIDTH, GRID_HEIGHT
from DataModels.Road import Road
import json, os, platform
import platform,os,json
def movement(environment, x ,y):
movement = {
"right": (x + 1, y) if x + 1 < GRID_WIDTH and type(environment[x + 1][y]) == Road else (x, y),
@ -24,13 +23,14 @@ def check_moves(environment, x,y,direction=None):
return ([dir for dir in movement(environment, x, y)[0] if movement(environment, x,y)[0][dir] != (x,y)])
return ([dir for dir in movement(environment, x, y)[0] if movement(environment, x,y)[0][dir] != (x,y) and dir != movement(environment,x,y)[1][direction]])
def save_moveset(moveset):
if platform.system() == 'Windows':
path = '\moveset_data.json'
else:
path = '/moveset_data.json'
output_file = os.path.normpath(os.getcwd()) + path
results = {}
try:
f = open(output_file, 'r+')
@ -38,16 +38,16 @@ def save_moveset(moveset):
open(output_file, 'a').close()
finally:
f = open(output_file, 'r+')
try:
results = json.load(f)
except:
pass
finally:
finally:
if "moveset" not in results:
results = { "moveset": [] }
results["moveset"].append(moveset)
f.seek(0)
json.dump(results, f, indent=1)
f.close()
f.close()

7
vowpal_auto_run.ps1 Normal file
View File

@ -0,0 +1,7 @@
param (
[Parameter(Mandatory=$true)][string]$loop
)
for($i = 1; $i -le $loop; $i++){
python main.py auto true bestfs
}

4
vowpal_run.sh Executable file
View File

@ -0,0 +1,4 @@
#!/bin/bash
python3 main.py ./Resources/Maps/$1 true bestfs
python3 main.py ./Resources/Maps/$1 true bfs
python3 main.py ./Resources/Maps/$1 true dfs

86
vowpal_utils.py Normal file
View File

@ -0,0 +1,86 @@
import re
from config import MAP_NAME, GRID_WIDTH, GRID_HEIGHT, GC_X, GC_Y
import os.path
COORDINATES_LIST = []
MOVES_LIST = []
with open( MAP_NAME, 'r' ) as map:
MAP_CONTENT = map.readlines()[2:]
MAP_CONTENT = [list(row.strip().replace(" ","")) for row in MAP_CONTENT]
moves_mapping = {
"pick_garbage": 1,
"right": 2,
"left": 3,
"up": 4,
"down": 5
}
def parse_list(whole_result,current_x,current_y):
global COORDINATES_LIST, MOVES_LIST
COORDINATES_LIST = whole_result.copy()
moves = []
parser = {'[0,1]':"down",'[0,-1]':"up",'[1,0]':"right",'[-1,0]':"left"}
for x in range(len(whole_result)):
if whole_result[x]=="pick_garbage":
moves.append(whole_result[x])
else:
x_subtraction = whole_result[x][0] - current_x
y_subtraction = whole_result[x][1] - current_y
current_x = whole_result[x][0]
current_y = whole_result[x][1]
moves.append(parser[f"[{x_subtraction},{y_subtraction}]"])
MOVES_LIST = moves.copy()
generate_input(1.0)
return moves
def generate_input(importance):
i = 0 #we'll use it to map coords to moves
input_file_content = []
for position in COORDINATES_LIST:
coords = check_position(position, i) #set valid gc position
#vowpal config goes here
label = moves_mapping[MOVES_LIST[i]]
tag = re.findall("(map_[0-9]+|map[0-9]+_auto)", MAP_NAME)[0]
gc_position = "|GC_Position "+str(coords[0])+","+str(coords[1])
input_line = str(label) + " " + str(importance) + " " + tag + gc_position+" |GC_Area "
area = get_gc_area(coords,1)
for a in area:
input_line += a + " "
i += 1
input_file_content.append(input_line)
#save to file
filename = "./VowPalInputData/input_" + str(tag) + ".txt"
if os.path.exists(filename):
input_file = open(filename,"a+")
else:
input_file = open(filename,"w+")
for line in input_file_content:
print(line)
input_file.write(line+"\n")
input_file.close()
def get_gc_area(position, radius):
area = []
for x in range(max(0, position[0] - radius), min(position[0] + radius + 1, GRID_WIDTH)): #prevents giong abroad
for y in range(max(0, position[1] - radius), min(position[1] + radius + 1, GRID_HEIGHT)):
if([x,y] == position): #we dont need gc data here
continue
area.append(MAP_CONTENT[y][x]+"("+str(x)+","+str(y)+")")
return area
def check_position(position, i):
if(type(position) is list): #if position valid, return it
return position
elif(position == "pick_garbage"): #if invalid, look for recent coords. if not found, return initial coords
for j in range(i-1,-1,-1):
if(type(COORDINATES_LIST[j]) is list):
return COORDINATES_LIST[j]
return [GC_X, GC_Y]
else: #in case sh t happened
print("An error has ocurred while processing GC position.")