IloModel ReadModel(IloEnv env, const char* filename, IloConstraintArray& capacityCts, IloConstraintArray& precedenceCts) { std::ifstream file(filename); if (!file){ env.out() << "usage: sched_conflict <file> <failLimit>" << std::endl; throw FileError(); } IloModel model(env); IloInt nbTasks, nbResources, i, j; file >> nbTasks; file >> nbResources; IloCumulFunctionExprArray resources(env, nbResources); IloIntArray capacities(env, nbResources); for (j=0; j<nbResources; j++) { IloInt c; file >> c; capacities[j] = c; resources[j] = IloCumulFunctionExpr(env); } IloIntervalVarArray tasks(env, nbTasks); char name[32]; for (i=0; i<nbTasks; i++) { sprintf(name, "ACT%ld", i); tasks[i] = IloIntervalVar(env, name); ILOSETLOCATION(tasks[i]); } IloIntExprArray ends(env); for (i=0; i<nbTasks; i++) { IloIntervalVar task = tasks[i]; IloInt d, smin, emax, nbSucc; file >> d >> smin >> emax; task.setSizeMin(d); task.setSizeMax(d); task.setStartMin(smin); task.setEndMax(emax); ends.add(IloEndOf(task)); for (j = 0; j < nbResources; j++) { IloInt q; file >> q; if (q > 0) { resources[j] += IloPulse(task, q); } } file >> nbSucc; for (IloInt s=0; s<nbSucc; ++s) { IloInt succ; file >> succ; IloConstraint pct = IloEndBeforeStart(env, task, tasks[succ]); ILOADD(model, pct); precedenceCts.add(pct); } } for (j=0; j<nbResources; j++) { sprintf(name, "RES%ld", j); resources[j].setName(name); IloConstraint cct = (resources[j] <= capacities[j]); ILOADD(model, cct); capacityCts.add(cct); } model.add(IloMinimize(env, IloMax(ends))); return model; }