Возможная реализация среды моделирования - PullRequest
0 голосов
/ 30 ноября 2018

Я создал простую среду моделирования с одним генератором и двумя потребителями, используя библиотеку simpy python.Генератор генерирует запросы со случайной скоростью, а также другое случайное число.Это случайное число передается первому потребителю , который использует это число в качестве времени обработки.То же случайное число передается от первого потребителя второму потребителю 1006 *, который снова использует его в качестве времени обработки.Код для этой реализации (упомянутый ниже) кажется неосуществимым, когда есть больше потребителей , так как мне придется добавить больше consumer_() методов.Я хочу, чтобы можно было смоделировать ту же настройку более возможным способом.Приветствуются некоторые рекомендации о том, как выполнить эту задачу.Спасибо!

import pandas
import simpy
import numpy as np
import scipy.stats as st
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import random

RANDOM_SEED = 42
NEW_REQUEST = 100

s1_totalQueueLength = 0
s1_sumWaitingTime = 0.0

s2_totalQueueLength = 0
s2_sumWaitingTime = 0.0


def generator(env, number, s1_counter, s2_counter):
    for i in range(number):
        r = random.expovariate(75.00)
        s1 = server_one(env, i, s1_counter, s2_counter, r)
        env.process(s1)
        t = random.expovariate(15)
        yield env.timeout(t)


def consumer_1(env, i, s1_counter, s2_counter, s3_counter, r):
    global s1_totalQueueLength
    global s1_sumWaitingTime
    global arrivalTime

    arrive = env.now
    arrivalTime = arrive

    with s1_counter.request() as req:
        results = yield req
        wait = env.now - arrive
        yield env.timeout(r)

        s2 = consumer_2(env, i, s2_counter, s3_counter, tib)
        env.process(s2)

        s1_totalQueueLength = s1_totalQueueLength + len(s1_counter.queue)
        s1_sumWaitingTime = s1_sumWaitingTime + wait
        if i > 0:
            print("Server 1: average queue length = " + str(s1_totalQueueLength/i) + " average waiting time = " + str(s1_sumWaitingTime/i))

        file1.write(str(wait) + "\n")


def consumer_2(env, i, s2_counter, s3_counter, tib):
    global s2_totalQueueLength
    global s2_sumWaitingTime
    print("S2 received " + str(tib)+" from Server One")

    arrive = env.now

    with s2_counter.request() as req:
        results = yield req
        wait = env.now - arrive
        yield env.timeout(tib)

        s2_totalQueueLength = s2_totalQueueLength + len(s2_counter.queue)
        s2_sumWaitingTime = s2_sumWaitingTime + wait

        if i > 0:
            print("Server 2: average queue length = " + str(s2_totalQueueLength / i) + " average waiting time = " + str(
                s2_sumWaitingTime / i))

        file2.write(str(wait)) + "\n")


random.seed(RANDOM_SEED)
env = simpy.Environment()

file1 = open("c1.csv", "w")
file1.write("Waiting_time" + "\n")

file2 = open("c2.csv", "w")
file2.write("Waiting_time" + "\n")

# Start processes and run
s1_counter = simpy.Resource(env, capacity=1)
s2_counter = simpy.Resource(env, capacity=1)
env.process(generator(env, NEW_REQUEST, s1_counter, s2_counter))
env.run()
...