MVA (Mean Value Analysis)

Methods · Configuration · Shared options · All solvers

The MVA solver implements exact and approximate mean value analysis for open, closed and mixed queueing networks. The default dispatch selects a route from the model structure, including single queues, load dependence, blocking, priorities, polling and caches. Each named approximation has its own model restrictions.

Methods

The method names and defaults below describe the MATLAB interface. Aliases share a row; model-specific restrictions and backend differences are noted. Use solver.listValidMethods() to inspect the names available for your model.

MVA methods and aliases
MethodAlgorithm and applicabilityReference
defaultLet mvaDispatch pick the route: exact MVA on a product-form model, AMVA otherwise, plus the single-queue, load-dependent, BAS, OI/PAS, SJN, polling and cache-in-QN routes on the shapes that own them.
mvaExact mean value analysis, the Reiser-Lavenberg recursion over the population lattice.
exactThe same exact recursion asked for by name; refused where no product-form solution exists.[1]
amvaApproximate MVA: the default AMVA fixed point over the arrival-instant queue lengths.
sumSummation method: closed models via sum_closed, open and mixed via the closing method sum_closing.
esumExtended summation: the same analyzer plus the SCV corrections at FCFS and SIRO stations.
bs, amva.bsBard-Schweitzer proportional estimate of the arrival-instant queue length.[3]
lin, amva.linChandy-Neuse Linearizer: Bard-Schweitzer plus the per-class Delta correction refreshed over three passes.[2]
gflinGeneralized fixed-point Linearizer, one uniform scaling exponent for all classes.
egflinExtended generalized fixed-point Linearizer, a per-class scaling exponent; the AMVA default on single-server models.
dmlin, amva.dmlinDe Souza e Silva-Muntz Improved Linearizer: Linearizer's aggregate rewriting, same answer at lower cost.
qd, amva.qdQueue-dependent AMVA: the arrival-instant estimate conditioned on the station's own queue length.[4]
qdlin, amva.qdlinQueue-dependent Linearizer, the QD correction inside the Linearizer fixed point.
aql, amva.aqlAggregate Queue Length: carries R+1 population points and removes Schweitzer's proportionality error. Single-server models only.
qsa, amva.qsaQueue-shift approximation correcting the arrival-instant queue lengths. Single-server models only.
tay, amva.tayTay's arrival-instant approximation: throughput elasticities in place of the population shift. Single-server models only.
scat, amva.scatNeuse-Chandy SCAT, i.e. the generalized Linearizer at alpha = 1 with a single Delta refresh pass.
qli, amva.qliWang-Sevcik Queue Line approximation of the arrival-instant queue.
fli, amva.fliWang-Sevcik Fraction Line approximation, the FL correction term.
lcp, amva.lcpBard's large customer population estimate: Bard-Schweitzer with the (N-1)/N factor dropped.
chow, amva.chowChow's second approximation: the LCP solution corrected once by forward-difference theta terms.
pamb, amva.pambProportional approximation PAM-B, noniterative: proportional seed of the queue lengths plus one final MVA step.
pami, amva.pamiPAM-I: the proportional seed with throughputs capped at full centre utilization.
pamt, amva.pamtPAM-T: the proportional seed plus the last two MVA steps.
clust, amva.clustClustering: subnetworks solved exactly for their local classes, foreign classes carried as a per-centre utilization.
ab, amva.abAkyildiz-Bolch AMVA, which handles multiserver stations directly instead of through the Seidmann surrogate delay.
schmidt, amva.schmidtSchmidt's MVA for class-dependent FCFS multiserver stations.
schmidt-ext, amva.schmidt-extThe extended Schmidt multiserver correction, built from the network with one class-r customer tagged.
marie, amva.marieMarie's iterative aggregation-decomposition for closed networks with non-exponential (Coxian) FCFS service.
priomva, amva.priomvaChandy-Lakshmi preemptive-resume priority arm: the tagged job's own service is inflated by 1/(1-sigma) along with the queued work.
sqniSquare-root noniterative closed form for one queueing station plus one delay.
mvacExact mean value analysis by chain: recurs on chains rather than on the population vector, closed single-server product-form only.
sqdSmith Queue Decomposition, the AMVA handler for Blocking-After-Service; runs on the single closed chain and disaggregates back to classes.
sjn.mvaShortest-job-next: the conditional waiting-time equation stepped exactly over the population lattice.
sjn.amvaShortest-job-next closed by a Schweitzer fixed point on the size-resolved queue length.
amva.mapqnHorizontal-cut MVA for one exponential delay and one FCFS queue with MAP service: one linear solve per lattice point.
qnaWhitt's Queueing Network Analyzer: two-moment traffic decomposition of an open network into GI/G/1 queues.
rqnaRobust queueing network analyzer: index-of-dispersion decomposition and robust queueing bounds, the default for bursty (MAP/MMPP) open arrivals.
rqtRobust queueing theory: polyhedral uncertainty sets and the worst-case system time per node, with the robust Burke calculus for the network.

Single queueing systems (open, 2 stations, 1 class; Source -> Queue -> Sink):

Single-queue methods
MethodAlgorithm and applicabilityReference
mm1M/M/1 exact response time.
mmkM/M/k exact response time (Erlang C).
mg1, mgi1M/G/1 exact response time (Pollaczek-Khinchine).
gm1, gim1G/M/1 exact response time: the PH/M/1 sigma root when the arrival law is Markovian, an LST root otherwise.
gig1, gig1.allenG/G/1 Allen-Cunneen two-moment approximation.
gig1.kingmanKingman's heavy-traffic upper bound on the G/G/1 waiting time.
gig1.heymanHeyman's G/G/1 approximation.
gig1.gelenbeGelenbe's diffusion approximation with instantaneous-return boundary.
gig1.kimuraKimura's diffusion-interpolation G/G/1 approximation.
gig1.kobayashiKobayashi's diffusion G/G/1 approximation.
gig1.klbKraemer-Langenbach-Belz refinement of Allen-Cunneen; the default choice for G/G/1.
gig1.marchalMarchal's G/G/1 approximation.
gig1.extremalTight two-moment extremal upper bound on the G/G/1 queue.
gigkG/G/k approximation with the rho-dependent alpha correction; the default choice for k > 1.
gigk.kingman_approxG/G/k approximation scaling the M/M/k waiting time by (ca^2+cs^2)/2.
gigk.whittWhitt's (1993) G/G/k refinement.
gigk.diffusionG/GI/n/m diffusion approximation with asymptotic peakedness; carries a finite buffer.
qedHalfin-Whitt quality-and-efficiency-driven limit of the M/M/k queue.
erlangaErlang A, the exact M/M/s/r+M chain with exponential abandonment; the default choice when the patience law is exponential.
mgisrgiWhitt's M/GI/s/r+GI engineering solution by state-dependent Markovian abandonment; the default choice for a non-exponential patience law.

Configuration options

The solver-specific fields below belong to options.config. Set them on an options struct, for example opt.config.name = value, and pass that struct to the solver constructor. See shared solver options for all top-level fields, shared configuration, defaults and usage. Options apply only to the methods and model features that consume them.

Relevant top-level options: iter_max, iter_tol.

The default convergence tolerance is iter_tol=1e-6. Also see the shared multiserver, highvar, np_priority and fork_join settings. For bounds, use BA.

Solver-specific configuration
OptionDefaultDescription and values
rqna_alphapaper defaultRobust queueing network analyzer: the arrival-side uncertainty-set parameter.
rqna_betapaper defaultThe service-side parameter of the same uncertainty set.
rqna_feedback_elimtrueEliminate immediate feedback before the RQNA decomposition (Algorithm 2, Section 4.2).
rqt_alpha_aderivedRobust queueing transform: arrival-side alpha, scalar or per station.
rqt_alpha_sderivedService-side alpha of the same, scalar or per station.
rqt_exactfalseReplace the tabulated adaptation with the exact optimization.
rqt_regime'independent'Which Table 1 adaptation regime is used: 'independent', 'normal', 'pareto'.
sjn_lattice_maxcapThe SJN (shortest-job-next) analyzer refuses once its lattice exceeds this many states.
sjn_lfactormethod defaultLattice refinement factor of that grid.
sjn_nsmethod defaultNumber of lattice points per dimension.
sjn_umaxmethod defaultUpper truncation of the utilization axis of the same grid.

Example

This example demonstrates solving a simple M/M/1 queue using the MVA solver. The queue has an arrival rate of 0.9 jobs/sec and a service rate of 1.0 jobs/sec.

% Create a simple M/M/1 queue
model = Network('M/M/1 Example');
source = Source(model, 'Source');
queue = Queue(model, 'Queue1', SchedStrategy.FCFS);
sink = Sink(model, 'Sink');

jobclass = OpenClass(model, 'Class1');
source.setArrival(jobclass, Exp(0.9));
queue.setService(jobclass, Exp(1.0));

model.link(Network.serialRouting(source, queue, sink));

% Solve with MVA and display average performance metrics
MVA(model).avgTable()

Output:

MVA analysis [method: default; type: approximate, deterministic; lang: matlab; env: 2025a] completed in 0.004175s.

ans =
  2×8 table
    Station    JobClass    QLen    Util    RespT    ResidT    ArvR    Tput
    _______    ________    ____    ____    _____    ______    ____    ____
    Source      Class1      0        0       0         0        0     0.9
    Queue1      Class1      9      0.9      10        10      0.9     0.9 
import jline.lang.*;
import jline.lang.constant.SchedStrategy;
import jline.lang.nodes.*;
import jline.lang.processes.Exp;
import jline.solvers.NetworkAvgTable;
import jline.solvers.mva.MVA;

public class MVAExample {
    public static void main(String[] args) {
        // Create a simple M/M/1 queue
        Network model = new Network("M/M/1 Example");

        Source source = new Source(model, "Source");
        Queue queue = new Queue(model, "Queue1", SchedStrategy.FCFS);
        Sink sink = new Sink(model, "Sink");

        OpenClass jobclass = new OpenClass(model, "Class1");
        source.setArrival(jobclass, Exp.fitRate(0.9));
        queue.setService(jobclass, Exp.fitRate(1.0));

        model.link(Network.serialRouting(source, queue, sink));

        // Solve with MVA and display average performance metrics
        System.out.println(new MVA(model).avgTable);
    }
}

Output:

MVA analysis [method: default; type: approximate, deterministic; lang: java; env: 17.0.9] completed.

Station    JobClass    QLen    Util    RespT    ResidT    ArvR    Tput
Source     Class1      0.0     0.0     0.0      0.0       0.0     0.9
Queue1     Class1      9.0     0.9     10.0     10.0      0.9     0.9
from line_solver import *

# Create a simple M/M/1 queue
model = Network('M/M/1 Example')

source = Source(model, 'Source')
queue = Queue(model, 'Queue1', SchedStrategy.FCFS)
sink = Sink(model, 'Sink')

jobclass = OpenClass(model, 'Class1')
source.setArrival(jobclass, Exp(0.9))
queue.setService(jobclass, Exp(1.0))

model.link(Network.serialRouting(source, queue, sink))

# Solve with MVA and display average performance metrics
print(MVA(model).avg_table)

Output:

MVA analysis [method: default; type: approximate, deterministic; lang: python; env: 3.13.7] completed.

  Station  JobClass  QLen  Util  RespT  ResidT  ArvR  Tput
0  Source    Class1   0.0   0.0    0.0     0.0   0.0   0.9
1  Queue1    Class1   9.0   0.9   10.0    10.0   0.9   0.9

References

  1. Reiser, M., & Lavenberg, S. S. (1980). Mean-value analysis of closed multichain queuing networks. Journal of the ACM, 27(2), 313-322.
  2. Chandy, K. M., & Neuse, D. (1982). Linearizer: a heuristic algorithm for queueing network models. Communications of the ACM, 25(2), 126-134.
  3. Bolch, G., Greiner, S., de Meer, H., & Trivedi, K. S. (2006). Queueing Networks and Markov Chains (2nd ed.). Wiley-Interscience.
  4. Casale, G., Pérez, J. F., & Wang, W. (2015). Deconvolving system load from queue length snapshots. ACM SIGMETRICS, 159-171.
  5. Casale, G., Muntz, R. R., & Serazzi, G. (2008). Geometric bounds on queueing systems. IEEE Transactions on Computers, 57(4), 508-521.
  6. Harel, A., Namn, S. M., & Sturm, R. (1999). Performance and reliability of communication networks. Kluwer Academic Publishers.