Tutorial 8: Optimizing Performance Metrics

This example shows how to optimize a performance metric using LINE. We find the optimal routing probabilities that minimize average response times for two parallel processor sharing queues in a closed network.

Optimization Network Diagram
model = Network('LoadBalCQN');
% Block 1: nodes
delay = Delay(model,'Think');
queue1 = Queue(model, 'Queue1', SchedStrategy.PS);
queue2 = Queue(model, 'Queue2', SchedStrategy.PS);
% Block 2: classes
cclass = ClosedClass(model, 'Job1', 16, delay);
delay.setService(cclass, Exp(1));
queue1.setService(cclass, Exp(0.75));
queue2.setService(cclass, Exp(0.50));
% Block 3: topology
P = model.initRoutingMatrix;
P{cclass}(queue1, delay) = 1.0;
P{cclass}(queue2, delay) = 1.0;
model.link(P);

% Block 4: solution - optimization
objFun = @(p) evalOptimization(p, model, P, cclass, delay, queue1, queue2);
p_opt = fminbnd(objFun, 0, 1);

function R = evalOptimization(p, model, P, cclass, delay, queue1, queue2)
    P{cclass}(delay, queue1) = p;
    P{cclass}(delay, queue2) = 1-p;
    model.relink(P);
    R = MVA(model,'exact','verbose',false).getAvgSysRespT;
end
// Example 8: Optimizing performance metrics
val model = Network("LoadBalCQN")

// Block 1: nodes
val delay = Delay(model, "Think")
val queue1 = Queue(model, "Queue1", SchedStrategy.PS)
val queue2 = Queue(model, "Queue2", SchedStrategy.PS)

// Block 2: classes
val cclass = ClosedClass(model, "Job1", 16, delay)
delay.setService(cclass, Exp(1.0))
queue1.setService(cclass, Exp(0.75))
queue2.setService(cclass, Exp(0.50))

// Block 3: topology
val P = model.initRoutingMatrix()
P.set(cclass, cclass, queue1, delay, 1.0)
P.set(cclass, cclass, queue2, delay, 1.0)
model.link(P)

// Block 4: solution - optimization using external optimizer
fun objFun(p: Double): Double {
    P.set(cclass, cclass, delay, queue1, p)
    P.set(cclass, cclass, delay, queue2, 1.0 - p)
    model.relink(P)
    return MVA(model, "method", "exact").avgSysRespT[0][0]
}
// Use Apache Commons Math or similar for optimization
from line_solver import *
from scipy import optimize

model = Network('LoadBalCQN')
# Block 1: nodes
delay = Delay(model, 'Think')
queue1 = Queue(model, 'Queue1', SchedStrategy.PS)
queue2 = Queue(model, 'Queue2', SchedStrategy.PS)
# Block 2: classes
cclass = ClosedClass(model, 'Job1', 16, delay)
delay.set_service(cclass, Exp(1))
queue1.set_service(cclass, Exp(0.75))
queue2.set_service(cclass, Exp(0.50))
# Block 3: topology
P = model.init_routing_matrix()
P.set(cclass, cclass, queue1, delay, 1.0)
P.set(cclass, cclass, queue2, delay, 1.0)
model.link(P)

def objFun(p):
    P.set(cclass, cclass, delay, queue1, p)
    P.set(cclass, cclass, delay, queue2, 1.0 - p)
    model.relink(P)
    R = MVA(model, method='exact', verbose=False).avg_sys_resp_t()
    return R[0]

p_opt = optimize.fminbound(objFun, 0, 1)
print(f"Optimal routing probability: {p_opt}")

Expected Output

Optimal routing probability: 0.6105