# How to form math model to solve this problem using cplex

Hiring company has the following requirement within a year;

week 1 to 5: 20

week 6 to 20: 40

week 21 to 40: 35

week 41 to 60: 55

week 61 to 80:75

week 81 to 100: 60

• Training time for an employee is 4 weeks and they are unproductive at times.
• An employee can work up to 20% overtime and 10% undertime in a week.
• Overtime cost is 1.5 times the regular cost.
• The regular cost is 10 per hour.
• The hiring cost is \$2000 per employee.
• In week 1, the company has 20 employees.

• Let me hazard a guess that this is a school assignment, in which case you should show some evidence of effort, other than hoping a stranger on the internet will do it for you. – Mark L. Stone Apr 9 '20 at 16:11
• Hi @mark , I had this question in an interview for operations research analyst intern position , I have tried it many times but was not able to solve this , there is nothing other than knowledge ,that I am going to gain out of this – sudarsan vs Apr 9 '20 at 16:22
• Well, you've had some time to think about in a less-pressured environment than a job interview. So why don't you show us your efforts so far. Can you formulate a simplified version of this problem which avoids aspects which you don;t know how to deal with? – Mark L. Stone Apr 9 '20 at 16:31
• @sudarsanvs, Do you have a mathematical formulation on your problem? If so, would you share it? – A.Omidi Apr 9 '20 at 22:27
• Following the comments other guys provided, I think the right path is to formulate the problem first, and then implement it in Cplex. Try to formulate the problem, and share with us, if you stuck somewhere. Then, try to implement the model in Cplex. – Mostafa Apr 9 '20 at 23:03

In general it's good to write some equations before. But when you rely on an algebraic modeling language like OPL you may also directly try your ideas.

Disclosure: I am the author of the linked article.

Let me share a starting point with OPL CPLEX

execute
{
cplex.optimalitytarget=3;
}

range weeks=1..100;

tuple need
{
int startweek;
int endweek;
int quantity;
}

{need} needs={<1,5,20>,<6,20,40>,<21,40,35>,
<41,60,55>,<61,80,75>,<81,100,60>};

int demand[w in weeks]=
first({n | n in needs : n.startweek<=w && w<=n.endweek}).quantity;

int trainingTime=4;
float overtime=0.2;
float undertime=-0.1;
float overtimecost=1.5;
float cost=10;
float hiringcost=2000;
int startEmployees=20;
int nbhours=8;

dvar int+ hire[weeks];
dvar int+ nbEmployees[weeks];
dvar float underover[weeks];

dexpr float hiringCost=hiringcost*sum(w in weeks) hire[w];
dexpr float salaryCost=nbhours*cost*sum(w in weeks)nbEmployees[w];
dexpr float underovertimeCost=nbhours*cost*
sum(w in weeks) (overtimecost*(underover[w]>=0)*underover[w]+
(underover[w]<=0)*underover[w]);

minimize hiringCost+salaryCost+underovertimeCost;

subject to
{
// stating point
forall(i in 1..trainingTime)nbEmployees[i]==startEmployees;

// satisfy demand
forall(w in weeks)
{
nbEmployees[w]+underover[w]>=demand[w];
nbEmployees[w]+underover[w]<=demand[w];
}

// undertime and overtime
forall(w in weeks)
{
underover[w]<=overtime*nbEmployees[w];
underover[w]>=undertime*nbEmployees[w];
}

// hiring employees
forall(i in weeks:(i+trainingTime) in weeks )
nbEmployees[i+trainingTime]==nbEmployees[i+trainingTime-1]+hire[i];
}