我有一个项目,我试图模拟一个RMFS仓库与simpy。我真的很感激任何人都能帮助我,因为我刚开始学习,而且我不知道如何去模仿它。我试过不同的密码,但没有一种能发挥应有的作用。这里是我的假设: 1-仓库是一个网格,每个单元格包含许多数量的1类项目(项目1、2、3、.),.something就像附加的照片一样。它有一个唯一的地址2-订单在一个预定义的时间内到达(就像均匀分布的2分钟) 3-然后命令被分配给一个机器人(我们有10个机器人)去检索订单。这将需要3分钟,4-然后机器人交付到工作站下一个步骤(如从机器人中挑选订单,并包装)。需要2分钟。然后机器人去把订单放回去,等待下一个订单。

发布于 2021-06-25 23:24:48
试了一试,我模拟的过程是
基本程序:
细胞
因此,相反,将单元格作为一个资源池(需要一个匹配的函数来获得所需的单元),每个单元都有自己的容量为1的资源库。
在事后看来,我认为如果我能在抓取机器人之前先命令抓住手机,我就能获得更好的吞吐量。
"""
modes a robot warehouse where robots get pulls a cell
and brings it to a picker who picks stuff from the cell,
then returns the cell back to the warehouse
basic process:
order arrives
order gets a robot (wait in a queue if all robots are in use)
order gets cell (wait if cell has been seized by another order)
pick from cell
put cell back
release robot
programmer: Michael R. Gibbs
"""
import simpy
import random
class Order():
"""
Order to be fulfilled
has unique id for tracking
and the cell id to pull
"""
# class var used to gen unique ids
next_id = 1
def __init__(self, cell):
"""
initalizes a order with a unique id and a cell to pull
"""
# set unique id
self.id = Order.next_id
Order.next_id += 1
# set cell to pull
self.cell = cell
class Cell():
"""
Cell that robots retrieve so pickers can pick
A cell can only be seized by one robot at a time
so each cell has its own request queue implemented
with a simple resouce. Could have put all the cells in
one matching store, but I think this is more effecient
as the matching can be slow with big queues
"""
def __init__(self, env, id):
"""
Initializes a cell with a id, and a request/resouce queue
"""
self.id = id
self.env = env
# used to queue requests for the cell
self.resQueue = simpy.Resource(env, capacity=1)
# request that currently holds the cell's resource
self.request = None
def seize(self):
"""
gets in queue and waits to seize cell
"""
request = self.resQueue.request() # Generate a request event
yield request
# save the request that has the cell so can release latter
self.request = request
return self
def release(self):
"""
releases the cell so other robots can seize it
"""
yield self.resQueue.release(self.request)
self.request = None
def gen_orders(env, cellMap, robots):
"""
Generates orders at a random distrubution
and kicks off the fill order process for the order
"""
while True:
# time between arrivals
yield env.timeout(random.uniform(0,2))
# create order and assign cell
cell = random.randint(1,len(cellMap))
order = Order(cell)
print(env.now, f'Order {order.id} has been created')
# start process to fulfill the order
# do not use yield here, just drop and go to next order
env.process(fill_order(order,cellMap, robots))
def fill_order(order, cellMap, robots):
"""
the order filling process
this process gets created for each order
"""
# get a robot
print(env.now, f'order {order.id} waits for robot')
with robots.request() as req:
yield req
print(env.now, f'order {order.id} has a robot')
# get the cell
print(env.now, f'order {order.id} waits for cell {order.cell}')
cell = cellMap[order.cell]
yield env.process(cell.seize())
print(env.now, f'order {order.id} has seized cell {order.cell}')
# pull the cell
yield env.timeout(3)
print(env.now, f'order {order.id} has pulled cell {order.cell}')
# pick
yield env.timeout(2)
print(env.now, f'order {order.id} has picked')
# return cell
yield env.timeout(3)
env.process(cell.release())
print(env.now, f'order {order.id} has return cell {order.cell}')
# release robot
print(env.now, f'order {order.id} has released a robot')
# start building the sim
env = simpy.Environment()
# made only 10 cells so orders are more likely to compete for a cell
cellMap = {id:Cell(env,id) for id in range(1,10)}
robots = simpy.Resource(env,capacity=10)
# start generating orders, which also kicks off the processing for each order
env.process(gen_orders(env, cellMap, robots))
env.run(100)发布于 2021-06-29 14:23:43
这是考虑到6*9仓库的代码的更新。我还增加了一个提升装置。我很感谢你对我们如何改进和优化它的意见。以及如何将报告添加到其中。
"""
modes a robot warehouse where robots get pulls a cell
and brings it to a picker who picks stuff from the cell,
then returns the cell back to the warehouse
basic process:
order arrives
order gets a robot (wait in a queue if all robots are in use)
order gets cell (wait if cell has been seized by another order)
pick from cell
put cell back
release robot
programmer: Michael R. Gibbs
"""
import simpy
import random
random.seed(0)
NUM_ROBOTS = 10
NUM_PICKERS = 1
NUM_GANTRY = 2
EXT_CELLS = [1,2,3,4,5,6,7,12,13,18,19,24,25,30,31,36,37,42,43,48,49,50,51,52,53,54]
INT_CELLS = [8,9,10,11,14,15,16,17,20,21,22,23,26,27,28,29,32,33,34,35,38,39,40,41,44,45,46,47]
class Order():
"""
Order to be fulfilled
has unique id for tracking
and the cell id to pull
"""
# class var used to gen unique ids
next_id = 1
def __init__(self, cell):
"""
initalizes a order with a unique id and a cell to pull
"""
# set unique id
self.id = Order.next_id
Order.next_id += 1
# set cell to pull
self.cell = cell
class Cell():
"""
Cell that robots retrieve so pickers can pick
A cell can only be seized by one robot at a time
so each cell has its own request queue implemented
with a simple resource.
"""
def __init__(self, env, id):
"""
Initializes a cell with a id, and a request/resource queue
"""
self.id = id
self.env = env
# used to queue requests for the cell
self.resQueue = simpy.Resource(env, capacity=1)
# request that currently holds the cell's resource
self.request = None
def seize(self):
"""
gets in queue and waits to seize cell
"""
request = self.resQueue.request() # Generate a request event
yield request
# save the request that has the cell so can release latter
self.request = request
return self
def release(self):
"""
releases the cell so other robots can seize it
"""
yield self.resQueue.release(self.request)
self.request = None
def gen_orders(env, cellMap, robots):
"""
Generates orders at a random distribution
and kicks off the fill order process for the order
"""
while True:
# time between arrivals
yield env.timeout(random.expovariate(1.0/1.5))
# create order and assign cell
cell = random.randint(1, len(cellMap))
order = Order(cell)
print('{:.2f} Order {} received for item in cell #{}'.format(env.now, order.id,order.cell))
# start process to fulfill the order
# do not use yield here, just drop and go to next order
if cell in EXT_CELLS:
env.process(fill_order(order, cellMap, robots, pickers))
else:
env.process(fill_order_internal(order, cellMap, robots, pickers,gantry))
def fill_order(order, cellMap, robots, pickers):
"""
the order filling process
this process gets created for each order
"""
#indicate cell status
print(format(env.now,'.2f'), f'order {order.id} cell {order.cell} is an external cell')
# get a robot
print('{:.2f} order {} waits for robot'.format(env.now,order.id))
with robots.request() as req:
yield req
print('{:.2f} order {} assigned to robot# {}'.format(env.now, order.id, robots.count))
# get the cell
print(format(env.now, '.2f'), f'order {order.id} waits for cell {order.cell}')
cell = cellMap[order.cell]
yield env.process(cell.seize())
print(format(env.now, '.2f'), f'order {order.id} has seized cell {order.cell}')
# pull the cell
yield env.timeout(3)
print(format(env.now,'.2f'), f'order {order.id} has pulled cell {order.cell} by robot#{robots.count}')
# pick
with pickers.request() as picker_req:
yield picker_req
yield env.timeout(random.triangular(0.5,1.2,1.8))
print(format(env.now,'.2f'), f'order {order.id} has picked')
# return cell
yield env.timeout(3)
env.process(cell.release())
print(format(env.now,'.2f'), f'order {order.id} has return cell {order.cell} by robot# {robots.count}')
# release robot
print('{:.2f} order {} has released a robot'.format(env.now,order.id))
def fill_order_internal(order, cellMap, robots, pickers,gantry):
"""
the order filling process for internal cells
this process gets created for each order
"""
#indicate cell status
print(format(env.now,'.2f'), f'order {order.id} cell {order.cell} is an internal cell')
# get a robot
print('{:.2f} order {} waits for robot and gantry'.format(env.now,order.id))
with robots.request() as req:
yield req
print('{:.2f} order {} assigned to robot# {}'.format(env.now, order.id, robots.count))
# get the cell
print(format(env.now, '.2f'), f'order {order.id} waits for cell {order.cell}')
cell = cellMap[order.cell]
yield env.process(cell.seize())
print(format(env.now, '.2f'), f'order {order.id} has seized cell {order.cell}')
# get the gantry
with gantry.request() as req_gantry:
yield req_gantry
print('{:.2f} order {} assigned to gantry# {}'.format(env.now, order.id, gantry.count))
#lift obstacle cells
yield env.timeout(2)
print(format(env.now, '.2f'), f'order {order.id} has lifted obstacles of cell {order.cell} by gantry{gantry.count}')
# pull the cell
yield env.timeout(3)
print(format(env.now,'.2f'), f'order {order.id} has pulled cell {order.cell} by robot#{robots.count}')
# pick
with pickers.request() as picker_req:
yield picker_req
yield env.timeout(random.triangular(0.5,1.2,1.8))
print(format(env.now, '.2f'), f'order {order.id} has picked')
# get the gantry
with gantry.request() as req_gantry:
yield req_gantry
print('at {:.2f} order {} assigned to gantry# {}'.format(env.now, order.id, gantry.count))
# lift obstacle cells for return
yield env.timeout(2)
print(format(env.now, '.2f'), f'order {order.id} has lifted obstacles of cell {order.cell} by gantry{gantry.count}')
# return cell
yield env.timeout(3)
env.process(cell.release())
print(format(env.now,'.2f'), f'order {order.id} has return cell {order.cell} by robot# {robots.count}')
# release robot
print('at {:.2f} order {} has released a robot'.format(env.now,order.id))
# start building the sim
env = simpy.Environment()
# 54 cells for a 6*9 Warehouse
cellMap = {id: Cell(env, id) for id in range(1, 55)}
#print(cellMap)
robots = simpy.Resource(env, capacity= NUM_ROBOTS)
pickers = simpy.Resource(env, capacity= NUM_PICKERS)
gantry = simpy.Resource(env, capacity= NUM_GANTRY)
# start generating orders, which also kicks off the processing for each order
env.process(gen_orders(env, cellMap, robots))
env.run(100)https://stackoverflow.com/questions/68120280
复制相似问题