Tutorial 4: Round-Robin Load Balancing

This example considers a system of two parallel processor-sharing queues and studies the effect of load-balancing on the average performance of an open class of jobs. A Router node controls the routing using different strategies (random, round-robin).

Load Balancing Network Diagram
% Example 4: Round robin load balancing
model = Network('RRLB');

source = Source(model, 'Source');
lb = Router(model, 'LB');
queue1 = Queue(model, 'Queue1', SchedStrategy.PS);
queue2 = Queue(model, 'Queue2', SchedStrategy.PS);
sink  = Sink(model, 'Sink');

oclass = OpenClass(model, 'Class1');
source.setArrival(oclass, Exp(1));
queue1.setService(oclass, Exp(2));
queue2.setService(oclass, Exp(2));

model.addLink(source, lb);
model.addLink(lb, queue1);
model.addLink(lb, queue2);
model.addLink(queue1, sink);
model.addLink(queue2, sink);

lb.setRouting(oclass, RoutingStrategy.RAND);
ldesAvgTable = LDES(model,'seed',23000,'samples',10000).avgTable()

lb.setRouting(oclass, RoutingStrategy.RROBIN);
model.reset();
ldesAvgTableRR = LDES(model,'seed',23000,'samples',10000).avgTable()
from line_solver import *

model = Network('RRLB')
source = Source(model, 'Source')
lb = Router(model, 'LB')
queue1 = Queue(model, 'Queue1', SchedStrategy.PS)
queue2 = Queue(model, 'Queue2', SchedStrategy.PS)
sink = Sink(model, 'Sink')

oclass = OpenClass(model, 'Class1')
source.set_arrival(oclass, Exp(1))
queue1.set_service(oclass, Exp(2))
queue2.set_service(oclass, Exp(2))

model.add_link(source, lb)
model.add_link(lb, queue1)
model.add_link(lb, queue2)
model.add_link(queue1, sink)
model.add_link(queue2, sink)

lb.set_routing(oclass, RoutingStrategy.RAND)
ldesAvgTable = LDES(model, seed=23000, samples=10000).avg_table()

model.reset()
lb.set_routing(oclass, RoutingStrategy.RROBIN)
ldesAvgTableRR = LDES(model, seed=23000, samples=10000).avg_table()
import jline.lang.constant.RoutingStrategy;
import jline.lang.nodes.Node;
import jline.lang.nodes.Router;
import jline.solvers.ldes.LDES;

Network model = new Network("RRLB");
Source source = new Source(model, "Source");
Router lb = new Router(model, "LB");
Queue queue1 = new Queue(model, "Queue1", SchedStrategy.PS);
Queue queue2 = new Queue(model, "Queue2", SchedStrategy.PS);
Sink sink = new Sink(model, "Sink");

OpenClass jobclass = new OpenClass(model, "Class1");
source.setArrival(jobclass, new Exp(1.0));
queue1.setService(jobclass, new Exp(2.0));
queue2.setService(jobclass, new Exp(2.0));

model.addLinks(new Node[][]{{source, lb}, {lb, queue1}, {lb, queue2},
        {queue1, sink}, {queue2, sink}});
lb.setRouting(jobclass, RoutingStrategy.RAND);
new LDES(model, "seed", 23000, "samples", 10000).avgTable().print();

model.reset();
lb.setRouting(jobclass, RoutingStrategy.RROBIN);
new LDES(model, "seed", 23000, "samples", 10000).avgTable().print();
#include "line/solvers/wrappers/ldes/solver_ldes.h"

Network model("RRLB");
Source source(model, "Source");
Router lb(model, "LB");
Queue queue1(model, "Queue1", SchedStrategy::PS);
Queue queue2(model, "Queue2", SchedStrategy::PS);
Sink sink(model, "Sink");

OpenClass jobclass(model, "Class1");
source.set_arrival(jobclass, Exp(1.0));
queue1.set_service(jobclass, Exp(2.0));
queue2.set_service(jobclass, Exp(2.0));

Routing P;
P.set(source, lb, 1.0);
P.set(lb, queue1, 0.5);
P.set(lb, queue2, 0.5);
P.set(queue1, sink, 1.0);
P.set(queue2, sink, 1.0);
model.link(P);

// Change the router from the default random split to round-robin.
model.set_routing(lb, jobclass, RoutingStrategy::RROBIN);

// Solve with the LDES client: only a simulator tells the two policies apart.
ldes::LdesOptions options;
options.seed = 23000;
options.samples = 10000;
const ldes::LdesResult result =
    ldes::solver_ldes(model.get_struct(), options);

Expected Output (Random Routing)

ldesAvgTable =
    Station    JobClass     QLen       Util       RespT     ResidT      ArvR       Tput
    _______    ________    _______    _______    _______    _______    _______    _______
    Source      Class1           0          0          0          0          0          1
    Queue1      Class1     0.32106    0.24457    0.65206    0.32603    0.49285    0.49236
    Queue2      Class1     0.31951    0.24333    0.63701    0.31851    0.50201    0.50151

Expected Output (Round-Robin Routing)

ldesAvgTableRR =
    Station    JobClass     QLen       Util       RespT     ResidT      ArvR      Tput
    _______    ________    _______    _______    _______    _______    _______    ______
    Source      Class1           0          0          0          0          0         1
    Queue1      Class1     0.28284    0.24697     0.5691    0.28455    0.49749    0.4969
    Queue2      Class1     0.27521     0.2408    0.55377    0.27689    0.49739    0.4969