import random
# 时间
hours = 8
days = 23
total_time = hours * days
# wood
wood_capacity = 500
init_wood = 200
# electronic
electronic_capacity = 100
initial_electronic = 60
# painter
body_pre_paint_capacity = 60
body_post_paint_capacity = 120
neck_pre_paint_capacity = 60
neck_post_paint_capacity = 120
# dispatch
dispatch_capacity = 500
# 数据分布
num_body = 2
mean_body = 1
std_body = 0.1
num_neck = 1
mean_neck = 1
std_neck = 0.2
num_paint = 3
mean_paint = 3
std_paint = 0.3
num_ensam = 2
mean_ensam = 1
std_ensam = 0.2
wood_critical_level = ((8/mean_body) * num_body + (8/mean_neck) * num_neck) * 3
electronic_critical_level = ((8/mean_ensam) * num_ensam) * 2
class Guitar_Factory:
def __init__(self, env):
self.wood = simpy.Container(env, capacity=wood_capacity, init=init_wood)
self.wood_control = env.process(self.wood_stock_level(env))
self.electronic = simpy.Container(env, capacity=electronic_capacity, init=initial_electronic)
self.electronic_control = env.process(self.electronic_stock_level(env))
self.body_pre_paint = simpy.Container(env, capacity=body_pre_paint_capacity, init=0)
self.body_post_paint = simpy.Container(env, capacity=body_post_paint_capacity, init=0)
self.neck_pre_paint = simpy.Container(env, capacity=neck_pre_paint_capacity, init=0)
self.neck_post_paint = simpy.Container(env, capacity=neck_post_paint_capacity, init=0)
self.dispatch = simpy.Container(env, capacity=dispatch_capacity, init=0)
self.dispatch_control = env.process(self.dispatch_control(env))
def wood_stock_level(self, env):
while True:
if self.wood.level <= wood_critical_level:
print(f'wood stock bellow critical level with {self.wood.level} at day {env.now/8} hour {env.now%8}')
print('call wood supplier')
print('------------------')
yield env.timeout(16)
print(f'wood arrive at day {env.now/8} hour {env.now%8}')
yield self.wood.put(300)
print(f'new wood stock {self.wood.level}')
print('------------------')
yield env.timeout(8)
else:
yield env.timeout(1)
def electronic_stock_level(self, env):
while True:
if self.electronic.level <= electronic_critical_level:
print(f'electronic stock bellow critical level with {self.electronic.level} at day {env.now/8} hour {env.now%8}')
print('call electronic supplier')
print('------------------')
yield env.timeout(9)
print(f'electronic arrive at day {env.now/8} hour {env.now%8}')
yield self.electronic.put(30)
print(f'new electronic stock {self.electronic.level}')
print('------------------')
yield env.timeout(8)
else:
yield env.timeout(1)
def dispatch_control(self, env):
while True:
global guitars_made
yield env.timeout(0)
while True:
if self.dispatch.level >= 50:
print(f'dispatch store {self.dispatch.level} , pick guitars at day {env.now/8} hour {env.now%8}')
print('-------------------')
yield env.timeout(4)
print(f'pick {self.dispatch.level} at day {env.now/8} hour {env.now%8}')
guitars_made += self.dispatch.level
yield self.dispatch.get(self.dispatch.level)
print('-------------')
yield env.timeout(8)
else:
yield env.timeout(1)
def body_maker(env, guitar_factory):
while True:
yield guitar_factory.wood.get(1)
body_time = random.gauss(mean_body, std_body)
yield env.timeout(body_time)
yield guitar_factory.body_pre_paint.put(1)
def neck_maker(env, guitar_factory):
while True:
yield guitar_factory.wood.get(1)
neck_time = random.gauss(mean_neck, std_neck)
yield env.timeout(neck_time)
yield guitar_factory.neck_pre_paint.put(2)
def painter(env, guitar_factory):
while True:
yield guitar_factory.body_pre_paint.get(5)
yield guitar_factory.neck_pre_paint.get(5)
paint_time = random.gauss(mean_paint, std_paint)
yield env.timeout(paint_time)
yield guitar_factory.body_post_paint.put(5)
yield guitar_factory.neck_post_paint.put(5)
def assembler(env, guitar_factory):
while True:
yield guitar_factory.body_post_paint.get(1)
yield guitar_factory.neck_post_paint.get(1)
yield guitar_factory.electronic.get(1)
assembling_time = max(random.gauss(mean_ensam, std_ensam), 1)
yield env.timeout(assembling_time)
yield guitar_factory.dispatch.put(1)
def body_maker_gen(env, guitar_factory):
for i in range(num_body):
env.process(body_maker(env, guitar_factory))
yield env.timeout(0)
def neck_maker_gen(env, guitar_factory):
for i in range(num_neck):
env.process(neck_maker(env, guitar_factory))
yield env.timeout(0)
def painter_maker_gen(env, guitar_factory):
for i in range(num_paint):
env.process(painter(env, guitar_factory))
yield env.timeout(0)
def assembler_maker_gen(env, guitar_factory):
for i in range(num_ensam):
env.process(assembler(env, guitar_factory))
yield env.timeout(0)
env = simpy.Environment()
guitar_factory = Guitar_Factory(env)
_ = env.process(body_maker_gen(env, guitar_factory))
_ = env.process(neck_maker_gen(env, guitar_factory))
_ = env.process(painter_maker_gen(env, guitar_factory))
_ = env.process(assembler_maker_gen(env, guitar_factory))
env.run(until=total_time)
print('Pre paint has {0} bodies and {1} necks ready to be painted'.format(
guitar_factory.body_pre_paint.level, guitar_factory.neck_pre_paint.level))
print('Post paint has {0} bodies and {1} necks ready to be assembled'.format(
guitar_factory.body_post_paint.level, guitar_factory.neck_post_paint.level))
print(f'Dispatch has %d guitars ready to go!' % guitar_factory.dispatch.level)
print(f'----------------------------------')
print('total guitars made: {0}'.format(guitars_made + guitar_factory.dispatch.level))
print(f'----------------------------------')
print(f'SIMULATION COMPLETED')
输出
electronic stock bellow critical level with 31 at day 2.75 hour 6
call electronic supplier
------------------
electronic arrive at day 3.875 hour 7
new electronic stock 44
------------------
dispatch store 51 , pick guitars at day 4.375 hour 3
-------------------
electronic stock bellow critical level with 29 at day 4.875 hour 7
call electronic supplier
------------------
pick 59 at day 4.875 hour 7
-------------
wood stock bellow critical level with 72 at day 5.25 hour 2
call wood supplier
------------------
electronic arrive at day 6.0 hour 0
new electronic stock 43
------------------
electronic stock bellow critical level with 29 at day 7.0 hour 0
call electronic supplier
------------------
wood arrive at day 7.25 hour 2
new wood stock 326
------------------
electronic arrive at day 8.125 hour 1
new electronic stock 42
------------------
dispatch store 51 , pick guitars at day 8.375 hour 3
-------------------
pick 58 at day 8.875 hour 7
-------------
electronic stock bellow critical level with 28 at day 9.125 hour 1
call electronic supplier
------------------
electronic arrive at day 10.25 hour 2
new electronic stock 42
------------------
electronic stock bellow critical level with 28 at day 11.25 hour 2
call electronic supplier
------------------
electronic arrive at day 12.375 hour 3
dispatch store 50 , pick guitars at day 12.375 hour 3
-------------------
new electronic stock 41
------------------
pick 58 at day 12.875 hour 7
-------------
electronic stock bellow critical level with 26 at day 13.375 hour 3
call electronic supplier
------------------
electronic arrive at day 14.5 hour 4
new electronic stock 40
------------------
electronic stock bellow critical level with 25 at day 15.5 hour 4
call electronic supplier
------------------
dispatch store 50 , pick guitars at day 16.25 hour 2
-------------------
electronic arrive at day 16.625 hour 5
new electronic stock 38
------------------
pick 57 at day 16.75 hour 6
-------------
electronic stock bellow critical level with 24 at day 17.625 hour 5
call electronic supplier
------------------
wood stock bellow critical level with 71 at day 17.625 hour 5
call wood supplier
------------------
electronic arrive at day 18.75 hour 6
new electronic stock 37
------------------
wood arrive at day 19.625 hour 5
new wood stock 324
------------------
electronic stock bellow critical level with 22 at day 19.75 hour 6
call electronic supplier
------------------
dispatch store 51 , pick guitars at day 20.25 hour 2
-------------------
pick 59 at day 20.75 hour 6
-------------
electronic arrive at day 20.875 hour 7
new electronic stock 35
------------------
electronic stock bellow critical level with 19 at day 21.875 hour 7
call electronic supplier
------------------
Pre paint has 4 bodies and 5 necks ready to be painted
Post paint has 33 bodies and 33 necks ready to be assembled
Dispatch has 34 guitars ready to go!
----------------------------------
total guitars made: 1480
----------------------------------
SIMULATION COMPLETED