LINE Solver
MATLAB API documentation
Loading...
Searching...
No Matches
ag_gnetwork.m
1%% G-Network (Gelenbe Network) with Negative Customers
2%
3% This example demonstrates MAM with RCAT methods on a G-network with negative customers.
4% Negative customers (signals) remove jobs from queues when they arrive,
5% modeling job cancellations or service interrupts.
6%
7% Network topology:
8% - Source generates positive customers (Class1) and negative signals (Class2)
9% - Positive customers flow: Source -> Queue1 -> Queue2 -> Sink
10% - Negative signals target Queue2, removing jobs from it
11%
12% Reference: Gelenbe, E. (1991). "Product-form queueing networks with
13% negative and positive customers", Journal of Applied Probability
14%
15% Copyright (c) 2012-2025, Imperial College London
16% All rights reserved.
17
18clear; clc;
19
20%% Parameters
21lambda_pos = 1.0; % Positive customer arrival rate
22lambda_neg = 0.3; % Negative signal arrival rate
23mu1 = 2.0; % Service rate at Queue1
24mu2 = 3.0; % Service rate at Queue2
25
26%% Create model
27model = Network('GNetwork-Example');
28
29source = Source(model, 'Source');
30queue1 = Queue(model, 'Queue1', SchedStrategy.FCFS);
31queue2 = Queue(model, 'Queue2', SchedStrategy.FCFS);
32sink = Sink(model, 'Sink');
33
34% Positive customer class (normal jobs)
35posClass = OpenClass(model, 'Positive');
36source.setArrival(posClass, Exp(lambda_pos));
37queue1.setService(posClass, Exp(mu1));
38queue2.setService(posClass, Exp(mu2));
39
40% Negative signal class (removes jobs from target queue)
41% Using Signal class with SignalType.NEGATIVE for automatic G-network handling
42negClass = Signal(model, 'Negative', SignalType.NEGATIVE);
43source.setArrival(negClass, Exp(lambda_neg));
44queue1.setService(negClass, Exp(mu1)); % Signals also get "served" (trigger)
45queue2.setService(negClass, Exp(mu2));
46
47% Set routing matrix
48P = model.initRoutingMatrix();
49% Positive customers: Source -> Queue1 -> Queue2 -> Sink
50P{posClass, posClass}(source, queue1) = 1.0;
51P{posClass, posClass}(queue1, queue2) = 1.0;
52P{posClass, posClass}(queue2, sink) = 1.0;
53% Negative signals: Source -> Queue1, then from Queue1 they target Queue2
54P{negClass, negClass}(source, queue1) = 1.0;
55P{negClass, negClass}(queue1, queue2) = 1.0; % Signal sent to Queue2 (removes job)
56P{negClass, negClass}(queue2, sink) = 1.0;
57model.link(P);
58
59%% Solve with MAM using INAP method
60solverMAM = MAM(model, 'method', 'inap');
61avgTableMAM = solverMAM.getAvgTable();
62disp(avgTableMAM);