public class LocalSearchSingleImpl extends AbstractLocalSearchSingle
Note if the user uses RepSimParams
as the simulator parameters, then
the call center must have only 1 period.
LocalSearchSingle.Solution
bestSolution, callGroups, cc, currPeriod, incrSimFactor, maxIncrSim, numGroups, numTypes, rMinusCost, rPlusCost, serviceRates, sim, skillSetList, staffCost, verbose
Constructor and Description |
---|
LocalSearchSingleImpl(CallCenterSim sim,
double[] staffCost,
double[] rPlusCost,
double[] rMinusCost)
Constructs a new instance of the local search algorithm.
|
Modifier and Type | Method and Description |
---|---|
protected void |
add(int[] staffing,
int[] rPlus,
int[] rMinus,
double slTol)
Adds one agent at a time until the effective staffing vector becomes feasible
(satisfies all the service level targets).
|
static int |
argmax(double[] p)
Returns the index of the maximum value inside the array.
|
protected int |
argmaxSet(Set<Integer> C,
DoubleMatrix2D served,
int[] newStaffing,
double[] staffCost,
int type)
This method is used to add agents.
|
protected double[] |
differenceSL(DoubleMatrix2D sl)
Returns the difference between the service level target and the actual service level measures,
for the current period.
|
protected Set<Integer> |
effectiveGroups(int[] newStaffing)
Returns the set of groups that contains at least 1 agent.
|
String |
formatTargetSL()
Reads and returns the service level targets of the period to optimize as a String.
|
protected double[][] |
getBusyFrac(DoubleMatrix2D served,
double[][] serviceRates)
Returns a matrix that contains a crude estimation of the fraction of time
spent by each agent group working on each call type.
|
static Set<Integer> |
intersection(Set<Integer> s1,
Set<Integer> s2)
Returns a set containing the intersection of 2 sets.
|
static void |
main(String[] args)
Executes a local search on the recourse variables for 1 scenario.
|
LocalSearchSingle.Solution |
optimize(int[] staffInit,
int[] rPlusInit,
int[] rMinusInit,
int maxIter,
int maxCPUSec)
Executes the local search for this scenario.
|
void |
randomChange(int[] staffing,
int[] rPlus,
int[] rMinus,
int numChanges)
Applies random modification to the vector
rPlus and rMinus . |
protected void |
remove(int[] staffing,
int[] rPlus,
int[] rMinus)
Removes one agent at a time, while keeping the solution feasible.
|
protected double |
servedPerAgent(DoubleMatrix2D served,
int[] newStaffing,
double[] staffCost,
int i,
int k)
Returns the served rate divided by the agent costs.
|
protected void |
switching(int[] staffing,
int[] rPlus,
int[] rMinus,
int maxIt)
Switches one agent at a time from one group to another group.
|
protected boolean |
updateBestSolution(int[] staffing,
int[] rPlus,
int[] rMinus)
Replaces the current best solution, stored in
AbstractLocalSearchSingle.bestSolution ,
if the given solution has a lower cost. |
protected boolean |
updateBestSolution(int[] staffing,
int[] rPlus,
int[] rMinus,
DoubleMatrix2D sl)
Replaces the current best solution, stored in
AbstractLocalSearchSingle.bestSolution ,
if the given solution is feasible and its cost is lower. |
computeCost, evalSL, evalSL, getBestSolution, getVerbose, isFeasible, isFeasible, isStaffingNonNegative, printSolution, setVerbose, verbosePrint, verbosePrintln
public LocalSearchSingleImpl(CallCenterSim sim, double[] staffCost, double[] rPlusCost, double[] rMinusCost)
sim
- the call center simulator to be usedstaffCost
- the staffing cost vector for non-recourse solutionrPlusCost
- the recourse cost vector for adding an agent, for each grouprMinusCost
- the recourse cost vector for removing an agent, for each grouppublic LocalSearchSingle.Solution optimize(int[] staffInit, int[] rPlusInit, int[] rMinusInit, int maxIter, int maxCPUSec)
optimize
in interface LocalSearchSingle
optimize
in class AbstractLocalSearchSingle
staffInit
- the initial staffing variables (non-recourse)rPlusInit
- the initial recourse variables for adding agentsrMinusInit
- the initial recourse variables for removing agentsmaxIter
- maximum number of iterationsmaxCPUSec
- maximum CPU time in secondsprotected boolean updateBestSolution(int[] staffing, int[] rPlus, int[] rMinus, DoubleMatrix2D sl)
AbstractLocalSearchSingle.bestSolution
,
if the given solution is feasible and its cost is lower.
This function returns true
if the best solution has changed, else
it returns false
.
This function calls and returns int[], int[])
if the given service level measures sl
is feasible.
staffing
- the staffing solution before applying recourse actionsrPlus
- the recourse vector for adding agentsrMinus
- the recourse vector for removing agentssl
- the service level measure associated with the given solutiontrue
if the best solution has changed, else
it returns false
(no change)protected boolean updateBestSolution(int[] staffing, int[] rPlus, int[] rMinus)
AbstractLocalSearchSingle.bestSolution
,
if the given solution has a lower cost.
This function assumes the given solution is feasible.
This function returns true
if the best solution has changed, else
it returns false
.staffing
- the staffing solution before applying recourse actionsrPlus
- the recourse vector for adding agentsrMinus
- the recourse vector for removing agentstrue
if the best solution has changed, else
it returns false
(no change)public void randomChange(int[] staffing, int[] rPlus, int[] rMinus, int numChanges)
rPlus
and rMinus
.
A random change consists to select a group randomly and to increase or decrease
(also determined randomly) this group by one agent, while keeping the effective
staffing vector admissible (no negative group size).staffing
- the staffing vector (without recourse)rPlus
- the recourse vector for adding agentsrMinus
- the recourse vector for removing agentsnumChanges
- the number of random changes to performprotected void add(int[] staffing, int[] rPlus, int[] rMinus, double slTol)
It can be useful to increase the staffing several points above the
service level targets. Because the returned solution may have more chance to
be decreased. To increase the SL targets, set a negative value to slTol
.
See also cern.colt.matrix.DoubleMatrix2D, int)
.
staffing
- the staffing vector before recourse actionsrPlus
- the recourse vector for adding agentsrMinus
- the recourse vector for removing agentsslTol
- the service level target tolerance (set negative value to obtain higher SL)protected void remove(int[] staffing, int[] rPlus, int[] rMinus)
staffing
- the staffing vector before applying recourse actionsrPlus
- the recourse vector for adding agentsrMinus
- the recourse vector for removing agentsprotected void switching(int[] staffing, int[] rPlus, int[] rMinus, int maxIt)
Note that this method does not verify if the modified solution is feasible or not.
staffing
- the staffing vector before applying recourse actionsrPlus
- the recourse vector for adding agentsrMinus
- the recourse vector for removing agentsmaxIt
- the maximum number of switches to performprotected double[] differenceSL(DoubleMatrix2D sl)
sl
- the actual service level measurespublic static int argmax(double[] p)
p
- the array to search for index with the maximum valueprotected double servedPerAgent(DoubleMatrix2D served, int[] newStaffing, double[] staffCost, int i, int k)
served
, yi is the number
of agents in group i given by newStaffing
and ci is the
cost of an agent of group i given by staffCost
.served
- the served rates, PerformanceMeasureType.SERVEDRATES
newStaffing
- the staffing vectorstaffCost
- the cost vectori
- the agent groupk
- the call typeprotected int argmaxSet(Set<Integer> C, DoubleMatrix2D served, int[] newStaffing, double[] staffCost, int type)
servedPerAgent(cern.colt.matrix.DoubleMatrix2D, int[], double[], int, int)
.C
- the set of agent group candidatesserved
- the served rates PerformanceMeasureType.SERVEDRATES
newStaffing
- the staffing vectorstaffCost
- the staffing costtype
- the call typeservedPerAgent(cern.colt.matrix.DoubleMatrix2D, int[], double[], int, int)
public static Set<Integer> intersection(Set<Integer> s1, Set<Integer> s2)
s1
- set 1s2
- set 2protected Set<Integer> effectiveGroups(int[] newStaffing)
newStaffing
- the staffing vector to checkprotected double[][] getBusyFrac(DoubleMatrix2D served, double[][] serviceRates)
[group][type]
.
These time ratios are computed with the service rates and the
served rates PerformanceMeasureType.SERVEDRATES
.
served
- the served rates PerformanceMeasureType.SERVEDRATES
serviceRates
- the service ratespublic String formatTargetSL()
public static void main(String[] args) throws Exception
args
- see the descriptionException