Я пытаюсь запустить симуляцию DES на Python с помощью Salabim и хотел бы сделать ее интерактивной с помощью кнопок, которые изменяют поведение симуляции.
В настоящее время я могу вносить изменения в уровни ресурсов во время работы анимации, но эти изменения затем проверяются задним числом до времени анимации, и любые запросы на то, чтобы это изменение эффектов ресурсов применялось задним числом.
Это кажется мне довольно странным. Как я могу сделать так, чтобы любые изменения, внесенные во время анимации, не влияли задним числом на симуляцию?
Например, приведенный ниже код настраивает клиента, который забирает товар со склада, ждет некоторое время и отправляет на вывод. Изначально запаса нет. Запустив симуляцию в течение 10 секунд, уровни ресурсов не изменятся. Если через 10 секунд анимации будет добавлен запас, клиент изменит уровень ресурсов задним числом, чтобы взять добавленные запасы до 10 секунд и добавить их в выходные данные.
import salabim as sim
window_length = 20
env = sim.Environment(trace=True, time_unit='seconds')
stock = sim.Resource("stock", capacity=5, initial_claimed_quantity=5,
anonymous=True)
output = sim.Resource("output", capacity=5, initial_claimed_quantity=5,
anonymous=True)
class Customer(sim.Component):
def process(self):
while True:
self.request(stock)
self.hold(sim.Uniform(2, 5))
self.put(output)
sim.AnimateMonitor(
stock.available_quantity,
x=0, y=-50, width=140, height=100,
horizontal_scale=1/window_length*140,
vertical_scale=1/stock.capacity()*90,
screen_coordinates=False
)
sim.AnimateMonitor(
output.available_quantity,
x=150, y=-50, width=140, height=100,
horizontal_scale=1/window_length*140,
vertical_scale=1/output.capacity()*90,
screen_coordinates=False
)
Customer()
sim.AnimateButton(x=-50, y=15, xy_anchor='se', width=100, text='Drop Stock',
action=lambda: stock.release(-stock.available_quantity()))
sim.AnimateButton(x=-50, y=45, xy_anchor='se', width=100, text='Add Stock',
action=lambda:stock.release(1))
env.animate(True)
env.animation_parameters(show_fps=True, show_time=True)
env.run(till=500)