Esempio n. 1
0
 shared_ptr<vector<Volume> > ProblemTweet::GetRandomCapacities()
 {
     uniform_int_distribution<Volume> dist_capacity(2, 200);
     uniform_int_distribution<Dimention> dist_dimention(2, 4);
     auto rand_capacity = bind(dist_capacity, random_engine);
     auto dimention = dist_dimention(random_engine);
     
     shared_ptr<vector<Volume> > capacities(new vector<Volume>(dimention));
     for (Dimention i = 0; i < dimention; i++)
     {
         (*capacities)[i] = rand_capacity();
     }
     
     return capacities;
 }
Esempio n. 2
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;
}                 
Esempio n. 3
0
int main(int, const char * []) {
  IloEnv env;
  try {
    IloModel model(env);
    IloInt m, o, c, q;

    IloInt         nbOrders   = 12;
    IloInt         nbSlabs    = 12;
    IloInt         nbColors   = 8;
    IloIntArray    capacities(env, 20, 0, 11, 13, 16, 17, 19, 20,
                                       23, 24, 25, 26, 27, 28, 29,
                                       30, 33, 34, 40, 43, 45);
    IloIntArray    sizes(env, nbOrders, 22, 9, 9, 8, 8, 6, 5, 3, 3, 3, 2, 2);
    IloIntArray    colors(env, nbOrders,  5, 3, 4, 5, 7, 3, 6, 0, 2, 3, 1, 5);
    IloIntVarArray where(env, nbOrders, 0, nbSlabs-1);
    IloIntVarArray load(env, nbSlabs, 0, IloSum(sizes));
  // Pack constraint
    model.add(IloPack(env, load, where, sizes));
  // Color constraints
    for(m = 0; m < nbSlabs; m++) {
      IloExprArray colorExpArray(env);
      for(c = 0; c < nbColors; c++) {
        IloOr orExp(env);
        for(o = 0; o < nbOrders; o++){
          if (colors[o] == c){
            orExp.add(where[o] == m);
          }
        }
        colorExpArray.add(orExp);
      }
      model.add(IloSum(colorExpArray) <= 2);
    }

  // Objective function
    IloIntArray lossValues(env);
    lossValues.add(0);
    for(q = 1; q < capacities.getSize(); q++){
      for(IloInt p = capacities[q-1] + 1; p <= capacities[q]; p++){
        lossValues.add(capacities[q] - p);
      }
    }
    IloExpr obj(env);
    for(m = 0; m < nbSlabs; m++){
      obj += lossValues[load[m]];
    }
    model.add(IloMinimize(env, obj));
    for(m = 1; m < nbSlabs; m++){
      model.add(load[m-1] >= load[m]);
    }
    IloCP cp(model);
    if (cp.solve(IloSearchPhase(env, where))){
      cp.out() << "Optimal value: " << cp.getValue(obj) << std::endl;
      for (m = 0; m < nbSlabs; m++) {
        IloInt p = 0;
        for (o = 0; o < nbOrders; o++)
          p += cp.getValue(where[o]) == m;
        if (p == 0) continue;
        cp.out() << "Slab " << m << " is used for order";
        if (p > 1) cp.out() << "s";
        cp.out() << " :";
        for (o = 0; o < nbOrders; o++) {
          if (cp.getValue(where[o]) == m)
            cp.out() << " " << o;
        }
        cp.out() << std::endl;
      }
    }
  }
  catch (IloException& ex) {
    env.out() << "Error: " << ex << std::endl;
  }
  env.end();
  return 0;
}