1%% G-Network (Gelenbe Network) with Negative Customers
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.
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
12% Reference: Gelenbe, E. (1991).
"Product-form queueing networks with
13% negative and positive customers", Journal of Applied Probability
15% Copyright (c) 2012-2025, Imperial College London
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
27model = Network(
'GNetwork-Example');
29source = Source(model,
'Source');
30queue1 = Queue(model,
'Queue1', SchedStrategy.FCFS);
31queue2 = Queue(model,
'Queue2', SchedStrategy.FCFS);
32sink = Sink(model,
'Sink');
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));
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));
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;
59%% Solve with MAM
using INAP method
60solverMAM = MAM(model,
'method',
'inap');
61avgTableMAM = solverMAM.getAvgTable();