from heuristicfn import heuristicfn FIELDWIDTH = 50 TURN_FUEL_COST = 10 MOVE_FUEL_COST = 200 MAX_FUEL = 20000 MAX_SPACE = 5 MAX_WEIGHT = 200 class GarbageTruck: garbage_types = {'bio': 0, 'electronics': 1, 'mixed': 2, 'recyclable': 3} def __init__(self, dump_x, dump_y, rect, orientation, request_list: list, clf): self.dump_x = dump_x self.dump_y = dump_y self.fuel = MAX_FUEL self.free_space = MAX_SPACE self.weight_capacity = MAX_WEIGHT self.rect = rect self.orientation = orientation self.request_list = request_list #lista domów do odwiedzenia self.clf = clf def turn_left(self): self.orientation = (self.orientation - 1) % 4 self.fuel -= TURN_FUEL_COST def turn_right(self): self.orientation = (self.orientation + 1) % 4 self.fuel -= TURN_FUEL_COST def forward(self): self.fuel -= MOVE_FUEL_COST if self.orientation == 0: self.rect.x += FIELDWIDTH elif self.orientation == 1: self.rect.y += FIELDWIDTH elif self.orientation == 2: self.rect.x -= FIELDWIDTH else: self.rect.y -= FIELDWIDTH def next_destination(self): for i in range(len(self.request_list)): request = self.request_list[i] #nie ma miejsca w zbiorniku lub za ciężkie śmieci if request.volume > self.free_space or request.weight > self.weight_capacity: continue #nie straczy paliwa na dojechanie i powrót na wysypisko if heuristicfn(request.x_pos, request.y_pos, self.dump_x, self.dump_y) // 50 * 200 > 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 return self.dump_x, self.dump_y def collect(self): if self.rect.x == self.dump_x and self.rect.y == self.dump_y: self.fuel = MAX_FUEL self.free_space = MAX_SPACE self.weight_capacity = MAX_WEIGHT print(f'agent at ({self.rect.x}, {self.rect.y}); fuel: {self.fuel}; free space: {self.free_space}; weight capacity: {self.weight_capacity}') pass