Пример #1
0
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;
}