decision structure
This commit is contained in:
parent
11f73635d6
commit
650b5ab787
@ -11,48 +11,48 @@ class ForkliftAgent(AgentBase):
|
|||||||
|
|
||||||
def __init__(self, model):
|
def __init__(self, model):
|
||||||
super().__init__(model)
|
super().__init__(model)
|
||||||
self.movement_queue = [Tuple[int, int]]
|
# self.movement_queue = [Tuple[int, int]]
|
||||||
self.current_position = Tuple[int, int]
|
# self.current_position = Tuple[int, int]
|
||||||
self.current_rotation = Direction.right
|
self.current_rotation = Direction.right
|
||||||
|
|
||||||
def assign_new_movement_task(self, movement_list):
|
# def assign_new_movement_task(self, movement_list):
|
||||||
self.movement_queue = []
|
# self.movement_queue = []
|
||||||
|
#
|
||||||
for m in movement_list:
|
# for m in movement_list:
|
||||||
self.movement_queue.append(m)
|
# self.movement_queue.append(m)
|
||||||
|
#
|
||||||
print("Assigned new movement queue to forklift agent")
|
# print("Assigned new movement queue to forklift agent")
|
||||||
|
#
|
||||||
def get_proper_rotation(self, next_pos: Tuple[int, int]) -> Direction:
|
# def get_proper_rotation(self, next_pos: Tuple[int, int]) -> Direction:
|
||||||
|
#
|
||||||
if next_pos[0] < self.current_position[0]:
|
# if next_pos[0] < self.current_position[0]:
|
||||||
return Direction.left
|
# return Direction.left
|
||||||
elif next_pos[0] > self.current_position[0]:
|
# elif next_pos[0] > self.current_position[0]:
|
||||||
return Direction.right
|
# return Direction.right
|
||||||
elif next_pos[1] > self.current_position[1]:
|
# elif next_pos[1] > self.current_position[1]:
|
||||||
return Direction.top
|
# return Direction.top
|
||||||
elif next_pos[1] < self.current_position[1]:
|
# elif next_pos[1] < self.current_position[1]:
|
||||||
return Direction.down
|
# return Direction.down
|
||||||
elif next_pos == self.current_position:
|
# elif next_pos == self.current_position:
|
||||||
return self.current_rotation
|
# return self.current_rotation
|
||||||
|
#
|
||||||
def move(self):
|
# def move(self):
|
||||||
if len(self.movement_queue) > 0:
|
# if len(self.movement_queue) > 0:
|
||||||
next_pos = self.movement_queue.pop(0)
|
# next_pos = self.movement_queue.pop(0)
|
||||||
|
#
|
||||||
dir = self.get_proper_rotation(next_pos)
|
# dir = self.get_proper_rotation(next_pos)
|
||||||
|
#
|
||||||
if dir == self.current_rotation:
|
# if dir == self.current_rotation:
|
||||||
print("move {} --> {}".format(self.current_position, next_pos))
|
# print("move {} --> {}".format(self.current_position, next_pos))
|
||||||
self.current_position = next_pos
|
# self.current_position = next_pos
|
||||||
else:
|
# else:
|
||||||
print("rotate {} --> {}".format(self.current_rotation, dir))
|
# print("rotate {} --> {}".format(self.current_rotation, dir))
|
||||||
self.current_rotation = dir
|
# self.current_rotation = dir
|
||||||
self.movement_queue.insert(0, next_pos)
|
# self.movement_queue.insert(0, next_pos)
|
||||||
|
#
|
||||||
def step(self) -> None:
|
# def step(self) -> None:
|
||||||
print("forklift step")
|
# print("forklift step")
|
||||||
self.move()
|
# self.move()
|
||||||
|
|
||||||
def creation_log(self):
|
def creation_log(self):
|
||||||
print("Created Forklift Agent [id: {}]".format(self.unique_id))
|
print("Created Forklift Agent [id: {}]".format(self.unique_id))
|
||||||
|
@ -1,22 +1,22 @@
|
|||||||
import random
|
import random
|
||||||
|
|
||||||
from data.Item import Item
|
from data.Item import Item
|
||||||
from data.ItemType import ItemType
|
from data.ItemType import ItemType
|
||||||
from data.Order import Order
|
from data.Order import Order
|
||||||
|
|
||||||
|
|
||||||
class Generator:
|
class InitialStateFactory:
|
||||||
def __init__(self, input_sequence_size: int, output_order_list_size: int):
|
|
||||||
self.input_sequence = self.generate_input_sequence(input_sequence_size)
|
|
||||||
self.output_order_list = self.generate_order_list(output_order_list_size)
|
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
def generate_order_list(self, output_order_list_size: int):
|
def generate_order_list(self, output_order_list_size: int):
|
||||||
order_list = [Order]
|
order_list = [Order]
|
||||||
for i in range(0, output_order_list_size):
|
for i in range(0, output_order_list_size):
|
||||||
order_list.append(self.generate_order())
|
order_list.append(self.__generate_order())
|
||||||
|
|
||||||
return order_list
|
return order_list
|
||||||
|
|
||||||
def generate_order(self) -> Order:
|
@staticmethod
|
||||||
|
def __generate_order(self) -> Order:
|
||||||
order_size = random.randint(1, 4)
|
order_size = random.randint(1, 4)
|
||||||
|
|
||||||
items = [Item]
|
items = [Item]
|
||||||
@ -30,14 +30,15 @@ class Generator:
|
|||||||
|
|
||||||
return Order(final_time, items, value)
|
return Order(final_time, items, value)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
def generate_input_sequence(self, input_sequence_size):
|
def generate_input_sequence(self, input_sequence_size):
|
||||||
sequence = [Item]
|
sequence = [Item]
|
||||||
for i in range(0, input_sequence_size):
|
for i in range(0, input_sequence_size):
|
||||||
sequence.append(self.generate_item())
|
sequence.append(self.__generate_item())
|
||||||
|
|
||||||
return sequence
|
return sequence
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def generate_item() -> Item:
|
def __generate_item() -> Item:
|
||||||
randomly_picked_type = random.choice(list(ItemType))
|
randomly_picked_type = random.choice(list(ItemType))
|
||||||
return Item(randomly_picked_type)
|
return Item(randomly_picked_type)
|
37
data/Game.py
37
data/Game.py
@ -1,37 +0,0 @@
|
|||||||
from data import Direction
|
|
||||||
from data.ItemType import ItemType
|
|
||||||
from data.Item import Item
|
|
||||||
from data.Order import Order
|
|
||||||
from typing import Dict
|
|
||||||
|
|
||||||
class Game:
|
|
||||||
def __init__(self, id: int, agentPos: (int, int), agentDirection: Direction, deliveryPos: (int, int), orderPos: (int,int), stockPilePos: Dict,
|
|
||||||
deliveryItem: Item, carriedItem: Item, orderStock: Dict, orderList: [Order]):
|
|
||||||
self.agentDirection = agentDirection
|
|
||||||
self.id = id
|
|
||||||
self.agentPos = agentPos
|
|
||||||
self.deliveryPos = deliveryPos
|
|
||||||
self.orderPos = orderPos
|
|
||||||
self.stockPilePos = stockPilePos
|
|
||||||
self.deliveryItem = deliveryItem
|
|
||||||
self.carriedItem = carriedItem
|
|
||||||
self.orderStock = orderStock
|
|
||||||
self.orderList = orderList
|
|
||||||
|
|
||||||
def getCopy(self):
|
|
||||||
newGame = Game(self)
|
|
||||||
return newGame
|
|
||||||
# def move(self, x: int, y: int):
|
|
||||||
# self.agentPos = (x, y)
|
|
||||||
#
|
|
||||||
# def pickUp(self, item: Item):
|
|
||||||
# self.deliveryItem = item
|
|
||||||
#
|
|
||||||
# def drop(self, item: Item):
|
|
||||||
# self.deliveryItem = -1
|
|
||||||
#
|
|
||||||
# def identify(item: Item, category: CATEGORY):
|
|
||||||
# item.category = category
|
|
||||||
#
|
|
||||||
# def finishOrder(order: Order):
|
|
||||||
# order.id = -1
|
|
15
data/GameConstants.py
Normal file
15
data/GameConstants.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
from typing import Dict
|
||||||
|
|
||||||
|
from data.ItemType import ItemType
|
||||||
|
from util.PathDefinitions import GridLocation
|
||||||
|
|
||||||
|
|
||||||
|
class GameConstants:
|
||||||
|
def __init__(self, grid_width: int, grid_height: int, delivery_pos: GridLocation, order_pos: GridLocation,
|
||||||
|
special_positions: Dict[ItemType, GridLocation], walls: [GridLocation]):
|
||||||
|
self.grid_width = grid_width
|
||||||
|
self.grid_height = grid_height
|
||||||
|
self.delivery_pos = delivery_pos
|
||||||
|
self.order_pos = order_pos
|
||||||
|
self.special_positions = special_positions
|
||||||
|
self.walls = walls
|
13
decision/ActionType.py
Normal file
13
decision/ActionType.py
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
|
||||||
|
class ActionType(Enum):
|
||||||
|
MOVE = 1
|
||||||
|
ROTATE_RIGHT = 2
|
||||||
|
ROTATE_DOWN = 3
|
||||||
|
ROTATE_LEFT = 4
|
||||||
|
ROTATE_UP = 5
|
||||||
|
PICK_ITEM = 6
|
||||||
|
DROP_ITEM = 7
|
||||||
|
SPECIAL = 8
|
||||||
|
NONE = 9
|
22
decision/State.py
Normal file
22
decision/State.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
from data.Direction import Direction
|
||||||
|
from data.Item import Item
|
||||||
|
from data.Order import Order
|
||||||
|
from decision.ActionType import ActionType
|
||||||
|
from util.PathDefinitions import GridLocation
|
||||||
|
|
||||||
|
|
||||||
|
class State:
|
||||||
|
def __init__(self,
|
||||||
|
action_taken: ActionType,
|
||||||
|
forklift_position: GridLocation,
|
||||||
|
forklift_rotation: Direction,
|
||||||
|
pending_orders: [Order],
|
||||||
|
filled_orders: [Order],
|
||||||
|
input_items: [Item]
|
||||||
|
):
|
||||||
|
self.action_taken = action_taken
|
||||||
|
self.forklift_position = forklift_position
|
||||||
|
self.forklift_rotation = forklift_rotation
|
||||||
|
self.pending_orders = pending_orders
|
||||||
|
self.filled_orders = filled_orders
|
||||||
|
self.input_items = input_items
|
25
decision/StateTree.py
Normal file
25
decision/StateTree.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
from typing import List
|
||||||
|
|
||||||
|
from InitialStateFactory import InitialStateFactory
|
||||||
|
from data.GameConstants import GameConstants
|
||||||
|
from decision.ActionType import ActionType
|
||||||
|
from decision.State import State
|
||||||
|
from util.PathDefinitions import GridLocation
|
||||||
|
|
||||||
|
|
||||||
|
class StateTree:
|
||||||
|
|
||||||
|
def __init__(self, initial_state_factory: InitialStateFactory, game_constants: GameConstants,
|
||||||
|
initial_forklift_position: GridLocation):
|
||||||
|
self.game_constants = game_constants
|
||||||
|
|
||||||
|
parent = State(
|
||||||
|
action_taken=ActionType.NONE,
|
||||||
|
forklift_position=initial_forklift_position,
|
||||||
|
pending_orders=initial_state_factory.generate_order_list(5),
|
||||||
|
filled_orders=[],
|
||||||
|
input_items=initial_state_factory.generate_input_sequence(20)
|
||||||
|
)
|
||||||
|
|
||||||
|
def expansion(self, from_state: State) -> List[State]:
|
||||||
|
return []
|
21
main.py
21
main.py
@ -49,19 +49,20 @@ def agent_portrayal(agent):
|
|||||||
return portrayal
|
return portrayal
|
||||||
|
|
||||||
|
|
||||||
base = 512
|
if __name__ == '__main__':
|
||||||
gridWidth = 10
|
base = 512
|
||||||
gridHeight = 10
|
gridWidth = 10
|
||||||
scale = base / gridWidth
|
gridHeight = 10
|
||||||
|
scale = base / gridWidth
|
||||||
|
|
||||||
diagram4 = GridWithWeights(gridWidth, gridHeight)
|
diagram4 = GridWithWeights(gridWidth, gridHeight)
|
||||||
diagram4.walls = [(5, 5), (5, 6)]
|
diagram4.walls = [(6, 5), (6, 6), (6, 7), (6, 8), (2, 3), (2, 4)]
|
||||||
|
|
||||||
grid = CanvasGrid(agent_portrayal, gridWidth, gridHeight, scale * gridWidth, scale * gridHeight)
|
grid = CanvasGrid(agent_portrayal, gridWidth, gridHeight, scale * gridWidth, scale * gridHeight)
|
||||||
|
|
||||||
server = ModularServer(GameModel,
|
server = ModularServer(GameModel,
|
||||||
[grid],
|
[grid],
|
||||||
"Automatyczny Wózek Widłowy",
|
"Automatyczny Wózek Widłowy",
|
||||||
{"width": gridHeight, "height": gridWidth, "graph": diagram4})
|
{"width": gridHeight, "height": gridWidth, "graph": diagram4})
|
||||||
server.port = 8888
|
server.port = 8888
|
||||||
server.launch()
|
server.launch()
|
||||||
|
@ -1,36 +1,36 @@
|
|||||||
from enum import Enum
|
from enum import Enum
|
||||||
from typing import Tuple, Dict
|
from typing import Tuple, Dict
|
||||||
|
|
||||||
from data import Game, Direction
|
from data import GameConstants, Direction
|
||||||
|
|
||||||
def getHotSpot(game:Game) -> (int, int):
|
def getHotSpot(game:GameConstants) -> (int, int):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def isOrderReady(game:Game) -> bool:
|
def isOrderReady(game:GameConstants) -> bool:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def getReadyOrderId(game:Game) -> int:
|
def getReadyOrderId(game:GameConstants) -> int:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class Action():
|
class Action():
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, game: Game):
|
def __init__(self, game: GameConstants):
|
||||||
self.game = Game
|
self.game = GameConstants
|
||||||
|
|
||||||
def rotate(self, direction: Direction) -> Game:
|
def rotate(self, direction: Direction) -> GameConstants:
|
||||||
self.game.agentDirection = direction
|
self.game.agentDirection = direction
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def move(self) -> Game:
|
def move(self) -> GameConstants:
|
||||||
# w zaleznosci od kierunku napierdala do przodu
|
# w zaleznosci od kierunku napierdala do przodu
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def special(self) -> Game:
|
def special(self) -> GameConstants:
|
||||||
# w zaleznosci od miejsca gdzie jest i czy ma cos na lapie odklada albo bierze przedmiot
|
# w zaleznosci od miejsca gdzie jest i czy ma cos na lapie odklada albo bierze przedmiot
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def orderOut(self, orderId: int) -> Game:
|
def orderOut(self, orderId: int) -> GameConstants:
|
||||||
# nalicza punkty wypierdalaorder i czysci orderStock
|
# nalicza punkty wypierdalaorder i czysci orderStock
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -52,7 +52,7 @@ def getRotationEvaluation(direction: Direction):
|
|||||||
# get evaluationForMoveAfterRotation
|
# get evaluationForMoveAfterRotation
|
||||||
return 1.0
|
return 1.0
|
||||||
|
|
||||||
def evaluateMoves(game: Game) -> Dict:
|
def evaluateMoves(game: GameConstants) -> Dict:
|
||||||
posibleMoves = Dict
|
posibleMoves = Dict
|
||||||
currPos = game.agentPos
|
currPos = game.agentPos
|
||||||
gameCopy = game.getCopy()
|
gameCopy = game.getCopy()
|
||||||
@ -77,12 +77,12 @@ def getMaxFromList(list: [float]) -> float:
|
|||||||
|
|
||||||
return maxi
|
return maxi
|
||||||
|
|
||||||
def getBestPossibleMove(game: Game) -> PossibleMoves:
|
def getBestPossibleMove(game: GameConstants) -> PossibleMoves:
|
||||||
movesDict = evaluateMoves()
|
movesDict = evaluateMoves()
|
||||||
bestChoice = getMaxFromList(movesDict.values())
|
bestChoice = getMaxFromList(movesDict.values())
|
||||||
return getIndex(bestChoice, movesDict)
|
return getIndex(bestChoice, movesDict)
|
||||||
|
|
||||||
def getBestMove(game: Game) -> Game:
|
def getBestMove(game: GameConstants) -> GameConstants:
|
||||||
gameCopy = game.getCopy()
|
gameCopy = game.getCopy()
|
||||||
bestPossibleMove = getBestPossibleMove(gameCopy)
|
bestPossibleMove = getBestPossibleMove(gameCopy)
|
||||||
|
|
||||||
@ -99,7 +99,7 @@ def getBestMove(game: Game) -> Game:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
def nastepnik(game: Game) -> Game:
|
def nastepnik(game: GameConstants) -> GameConstants:
|
||||||
if isOrderReady(game) > -1:
|
if isOrderReady(game) > -1:
|
||||||
return Action(game.getCopy()).orderOut(getReadyOrderId(game))
|
return Action(game.getCopy()).orderOut(getReadyOrderId(game))
|
||||||
elif game.agentPos == getHotSpot(game):
|
elif game.agentPos == getHotSpot(game):
|
||||||
|
@ -1,27 +0,0 @@
|
|||||||
from data import Game, Order
|
|
||||||
|
|
||||||
|
|
||||||
def pickBestOrder(game: Game) -> Order:
|
|
||||||
maxi = game.orderList[0]
|
|
||||||
for i in range(len(game.orderList)):
|
|
||||||
if(game.orderList[i].money > maxi.money):
|
|
||||||
maxi = game.orderList[i]
|
|
||||||
|
|
||||||
return maxi
|
|
||||||
|
|
||||||
def realizeOrder(game: Game, orderId: int):
|
|
||||||
return 1
|
|
||||||
|
|
||||||
def getCorrectStockPile(game: Game) -> (int, int):
|
|
||||||
return game.stockPilePos[game.carriedItem.category].pos
|
|
||||||
|
|
||||||
def TwojStary(game: Game) -> (int, int):
|
|
||||||
if len(game.orderList) == 0:
|
|
||||||
if game.carriedItem is None:
|
|
||||||
return game.deliveryPos
|
|
||||||
else:
|
|
||||||
return getCorrectStockPile(game)
|
|
||||||
elif game.carriedItem is None:
|
|
||||||
return realizeOrder(game, pickBestOrder(game))
|
|
||||||
else:
|
|
||||||
return getCorrectStockPile(game)
|
|
Loading…
Reference in New Issue
Block a user