[PYTHON] Über die Warteschlange

Was machst du?

Lassen Sie uns einen kurzen Blick auf die Warteschlange werfen und sie mit einem Python-Programm simulieren und überprüfen.

Was ist eine Warteschlange?

Überlastungsphänomen eines Systems, das sich probabilistisch verhält Eine Theorie zur Analyse anhand eines mathematischen Modells. Ein Feld der Operationsforschung.

In der Warteschlange werden diejenigen, die Dienste bereitstellen, als Server bezeichnet, und diejenigen, die Dienste bereitstellen, werden als Kunden (Clients) bezeichnet. Kunden treten probabilistisch (oder deterministisch) auf und richten sich in einer FIFO-Matrix (First In First Out) aus. Dann dauert es von Anfang an eine probabilistische (oder bestimmte) Zeit, um den Dienst zu erhalten, und nach Beendigung des Dienstes wird er beendet. Ein solcher Mechanismus wird als System oder System bezeichnet.

image

Das einfachste Modell in der Warteschlange ist das M / M / 1-Modell.

Was ist das M / M / 1-Modell?

In der Warteschlange sind (A) wie es ankommt, (B) wie es gewartet wird und (C) wie viele Server es hat wichtig. Schreiben Sie diese drei Teile in einem Format wie A / B / C Kendalls Symbol Es heißt 83% 89% E3% 83% BC% E3% 83% AB% E3% 81% AE% E8% A8% 98% E5% 8F% B7). Mit anderen Worten bezieht sich M / M / 1 auf die folgenden Systeme.

  • Ankunftsprozess = M: Ankunft in Poisson (grob gesagt, zufällige Ankunft) --Service = M: Exponentialverteilung der Servicezeit
  • Anzahl der Server = 1: 1 Server

M ist [Markov](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%82%B3%E3%83%95%E9%81%8E%E7 % A8% 8B) (Markov), das Intervall ist [Exponentialverteilung](https://ja.wikipedia.org/wiki/%E6%8C%87%E6%95%B0%E5%88%86% Wenn es sich um E5% B8% 83 handelt, beträgt die Anzahl der Ankünfte Poisson-Verteilung. % B3% E5% 88% 86% E5% B8% 83), und das Verhalten ist der Markov-Prozess.

Parameter in der Warteschlange

--λ (Lambda): ** Durchschnittliche Ankunftsrate ** = Durchschnittliche Anzahl der Kunden, die in Zeiteinheit [^ 1] ankommen (Umkehrung des durchschnittlichen Ankunftsintervalls) --μ (Mu): ** Durchschnittliche Servicerate ** = Durchschnittliche Anzahl der Kunden, die den Service in einer Zeiteinheit beenden (Umkehrung der durchschnittlichen Servicezeit)

[^ 1]: Die Zeiteinheit ist die Standardzeit, die 1 Stunde oder 1 Minute betragen kann, und der Modellersteller kann entscheiden, was ihm gefällt.

Es kann berechnet werden, dass ρ, das unter Verwendung dieser Parameter wie folgt berechnet wird, ** die durchschnittliche Auslastungsrate des Servers ** ist (später beschrieben).

--ρ (niedrig): = $ \ frac {\ lambda} {\ mu} $

Statistiken in der Warteschlange

  • Durchschnittliche Anzahl der Personen im System ($ L $): Erwartete Anzahl der Personen im System
  • Durchschnittliche Warteschlangenlänge ($ L_q $): Erwartete Anzahl von Personen in der Warteschlange
  • Durchschnittliche systeminterne Zeit ($ W $): Erwarteter Wert der im System verbrachten Zeit
  • Durchschnittliche Wartezeit ($ W_q $): Erwarteter Wert der Zeit in der Warteschlange

Wichtige Ausdrücke in der Warteschlange

Kleiner Beamter

[Kleiner Beamter](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%88%E3%83%AB%E3%81%AE%E6%B3%95%E5 % 89% 87) bedeutet, dass die langfristig gemittelte Anzahl von Kunden $ L $ in einem stabilen System das Produkt der langfristig gemittelten Ankunftsrate $ λ $ und der langfristig gemittelten systeminternen Zeit $ W $ ist. Das Gesetz der Gleichheit. (Auch wenn das System in der Warteschlange steht)

L = \lambda W
L_q = \lambda W_q

Diese Formel gilt für jede Ankunft oder Serviceverteilung. Diese Formel ist auch intuitiv leicht zu verstehen. Das ist,

Empirisch kommen jede Stunde drei Personen ins Allgemeinkrankenhaus. Es ist auch bekannt, dass durchschnittlich 6 Personen im Wartezimmer warten. Die durchschnittliche Wartezeit beträgt 2 Stunden.

Dies bedeutet, dass wir $ W_q = L_q / \ lambda = 6/3 = 2 $ berechnet haben. Diese Berechnung gilt für Durchschnittswerte. Die erwartete Wartezeit für "6 Personen standen an, als ich ankam" beträgt 6 x durchschnittliche Servicezeit (wenn der Service M ist).

Theoretischer Wert des statistischen Wertes

Mit M / M / 1 kann der theoretische Wert des statistischen Wertes relativ leicht erhalten werden. Auch wenn Sie sich den theoretischen Wert nicht merken, können Sie ihn berechnen, indem Sie sich an die folgenden zwei Punkte erinnern.

  1. Die Wahrscheinlichkeit, dass sich die Anzahl der Personen im System erhöht, erhöht sich um das ρ-fache, wenn sich eine Person erhöht (abgeleitet aus dem Markov-Prozess).
  • Kleiner Beamter

Erstens ist die Wahrscheinlichkeit $ P_i $, dass sich $ i $ Personen im System befinden, von (1) bis $ \ alpha \ rho ^ i $. Wenn Sie alle Wahrscheinlichkeiten addieren, ist es 1, sodass Sie wie folgt berechnen können.

\ alpha (1 + \ rho + \ rho ^ 2 + \ rho ^ 3 + \ cdots) = \ frac {\ alpha} {1- \ rho} = 1 bis \ alpha = 1- \ rho
i Wahrscheinlichkeit, im System zu sein P_i = (1- \ rho) \ rho ^ i

Sie können dies auch verwenden, um zu sehen, dass die durchschnittliche Serverauslastung = $ \ sum_ {i = 1} {P_i} = 1 --P_0 = 1- (1- \ rho) = \ rho $ ist.

Sie können auch die Formel von Little verwenden, um Folgendes zu berechnen:

Durchschnittliche Anzahl von Personen im System ($ L $) = $ \ sum_ {i = 0} {i P_i} = (1- \ rho) (\ rho + 2 \ rho ^ 2 + 3 \ rho ^ 3 + \ cdots) = \ frac {\ rho} {1- \ rho} $ Durchschnittliche Warteschlangenlänge ($ L_q $) = $ Durchschnittliche Anzahl der Personen im System - Durchschnittliche Serverauslastung = L- \ rho = \ frac {\ rho ^ 2} {1- \ rho} $ Durchschnittliche Systemzeit ($ W $) = $ L / \ lambda = \ frac {1} {\ mu- \ lambda} $ Durchschnittliche Wartezeit ($ W_q $) = $ L_q / \ lambda = \ frac {\ rho} {\ mu- \ lambda} $

Mit Python bestätigt

Die Warteschlangensimulation ist mit Pythons $ \ mbox {simpy} $ nützlich. Die Installation kann mit "pip install simpy" erfolgen. Die Ankunftsrate λ = 1/5 und die Servicerate μ = 1/3.

python3


import simpy, random, numpy as np
random.seed(1)
env = simpy.Environment() #Simulationsumgebung
queue, intime = [], [] #Warteschlange(Liste der Ankunftszeiten)Und eine Liste der systeminternen Zeiten

#Ankunftsveranstaltung
def arrive():
    while True:
        yield env.timeout(random.expovariate(1.0 / 5)) #Durchschnittliche Ankunftsrate 1/5
        env.process(into_queue())

#Warteschlange
def into_queue():
    global queue
    queue.append(env.now)
    if len(queue) > 1:
        return
    while len(queue) > 0:
        yield env.timeout(random.expovariate(1.0 / 3)) #Durchschnittliche Servicerate 1/3
        tm, queue = queue[0], queue[1:]
        intime.append(env.now - tm)

#Lauf
env.process(arrive())
env.run(1000000)
print('total = %d clients, W = %.2f' % (len(intime), np.average(intime)))
>>>
total = 199962 clients, W = 7.53

Der theoretische Wert ist $ W = \ frac {1} {\ mu- \ lambda} = \ frac {1} {\ frac {1} {3} - \ frac {1} {5}} = 7,5 $, was ungefähr entspricht Sie können sehen, dass sie übereinstimmen.

das ist alles

Recommended Posts