sets:
model.Tasks = Set(initialize=unified_data['Tasks'].unique().tolist())
model.specialist = Set(initialize=unified_data['Name'].unique().tolist())
Variable:
model.Assign = Var(model.Tasks, model.specialist, within=Binary)
Constraints:
task only assigned to one person
def _SingleAssignment(model, task):
return sum(model.Assign[task, specialist] for specialist in model.specialist) == 1
model.con_singleassign = Constraint(model.Tasks, rule=_SingleAssignment)
Skill Mapping Matrix
def _CanDoTask(model, task, specialist):
return model.Assign[task, specialist] <= model.Skill_Mapping[task, specialist]
model.con_candotask = Constraint(model.Tasks, model.specialist, rule=_CanDoTask)
no longer than 8 hours
def _TimeConstraint(model, specialist):
return sum(model.Assign[task, specialist] * model.ProcessingTime[task] for task in model.Tasks) <=
8*60 * 60
model.con_timeconstraint = Constraint(model.specialist, rule=_TimeConstraint)
no less than 1 hour
def _MinWorkHours(model, specialist):
return sum(model.Assign[task, specialist] * model.ProcessingTime[task] for task in model.Tasks) >= 3600 * 1
model.con_minworkhours = Constraint(model.specialist, rule=_MinWorkHours)
Objective:
def _obj_competence(model):
return sum(model.Competence[task, specialist] * model.Assign[task, specialist] for task in model.Tasks for specialist in model.specialist)
model.obj_competence = Objective(rule=_obj_competence, sense=maximize)
Adding the _MinWorkHours constraint causing the infeasibility, even without the _TimeConstraint constraint.