Esercizio - Gara fra server con tempi di servizio esponenziali - minimo, massimo e richieste replicate
Testo. Tre server hanno tempi di servizio esponenziali indipendenti con tassi , , al secondo.
- La stessa richiesta viene inviata ai tre server e si usa la prima risposta. Legge e media del tempo di risposta; probabilità che risponda ciascun server.
- Tempo medio perché tutti e tre abbiano finito (massimo).
- Un lavoro su un server di tasso è in corso da secondi. Probabilità che duri ancora più di secondo.
- Tre server identici di tasso : media e della prima risposta rispetto a un singolo server.
- Una richiesta si divide in sotto-richieste indipendenti e finisce quando finiscono tutte: media e probabilità di superare s.
Soluzione
1. Il minimo è : tempo medio s. Risponde il server con probabilità : , indipendentemente dall'istante della risposta.
2. Metodo 1: fasi. Il primo completamento arriva dopo s in media. Poi restano due server, che per l'assenza di memoria ricominciano da zero. Il massimo di due esponenziali di tassi ha media (inclusione-esclusione sulle code: ):
- se ha finito il server (probabilità ): restano e , media ;
- se ha finito il (probabilità ): restano e , media ;
- se ha finito il (probabilità ): restano e , media .
Quindi .
Metodo 2: coda. , e integrando su : Lo stesso risultato: (simulazione: ).
3. Assenza di memoria: . L'attesa già trascorsa non dà alcuna informazione.
4. Il minimo di tre è : media s (contro s per un singolo server) e contro : la coda scende di un fattore . Il costo è che tre server lavorano per la stessa richiesta: il carico complessivo triplica (finché un server non chiude la richiesta degli altri).
5. Massimo di esponenziali i.i.d. : s (rispetto a s per una sotto-richiesta). Inoltre , circa dieci volte la probabilità di una singola sotto-richiesta. La varianza vale (deviazione standard ).
Codice di verifica
import numpy as np
from fractions import Fraction as F
mu = [1, 2, 3]
rng = np.random.default_rng(1)
X = rng.exponential(1 / np.array(mu), size=(2_000_000, 3))
print("min:", X.min(axis=1).mean(), " vince:", np.bincount(X.argmin(axis=1)) / len(X))
Emax = sum(F(1, m) for m in mu) - sum(F(1, mu[i] + mu[j]) for i in range(3) for j in range(i + 1, 3)) + F(1, sum(mu))
print("max esatto:", Emax, float(Emax), " simulato:", X.max(axis=1).mean())
Y = rng.exponential(1, size=(500_000, 10)).max(axis=1)
print("10 sotto-richieste:", Y.mean(), Y.var(), (Y > 5).mean())Output: min: 0.1666... vince: [0.1669 0.3333 0.4998], max esatto: 73/60 1.2166... simulato: 1.2168, 10 sotto-richieste: 2.926 1.545 0.0649 (simulato, circa i valori esatti , , ).
Versione ripasso
- Minimo: tassi : , media s; risponde con probabilità .
- Massimo: per fasi ; per inclusione-esclusione s.
- Assenza di memoria: .
- Repliche: tre server di tasso : , media contro , contro .
- Dieci sotto-richieste : ; ; varianza .
- Errori tipici: scambiare minimo e massimo (tassi che si sommano solo per il minimo); dimenticare che il tempo residuo riparte da zero; confondere tasso e media.