Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何删除约束集的子集,并使用c++/cplex?_C++_Constraints_Cplex - Fatal编程技术网

C++ 如何删除约束集的子集,并使用c++/cplex?

C++ 如何删除约束集的子集,并使用c++/cplex?,c++,constraints,cplex,C++,Constraints,Cplex,我为每个车辆“p”和属于该车辆路线的每个弧(k,m)设置了一个约束。 在每次迭代中,我都会更改车辆的路线。 然后,在每次迭代中,我需要更改与此车辆相关的约束。对于特定的“p”,我需要删除与之相关的约束并添加新的约束。 我该怎么做 我不知道在这种情况下如何使用删除功能。如何识别与要删除的“p”相关的子集约束?在我这样做的过程中,我删除了集合中的始终是第一个约束 typedef struct{ IloCplex cplex; IloEnv env; IloModel mod; Ilo

我为每个车辆“p”和属于该车辆路线的每个弧(k,m)设置了一个约束。 在每次迭代中,我都会更改车辆的路线。 然后,在每次迭代中,我需要更改与此车辆相关的约束。对于特定的“p”,我需要删除与之相关的约束并添加新的约束。 我该怎么做

我不知道在这种情况下如何使用删除功能。如何识别与要删除的“p”相关的子集约束?在我这样做的过程中,我删除了集合中的始终是第一个约束

typedef struct{
  IloCplex cplex;
  IloEnv env;
  IloModel mod;
  IloNumVarArray f;
  IloNumArray _f;
  IloNumVarArray q;
  IloNumArray _q;
  IloRangeArray constraints_r3;
  IloObjective fo;
  IloNum _fo;
} CPX_RHLPflow;

struct DATA {

  int n;
  vector<vector<vector<int> > > _x;
  int p;
  vector<double> tau;
};

int MAPf (int router, int nodei, int nodej, int nodeu, int nodev, int N) { 
  return router*N*N*N*N+nodei*N*N*N+nodej*N*N+nodeu*N+nodev;
}


void create_model_RHLPflow(CPX_RHLPflow &mono, DATA data){


  IloEnv& env = mono.env;
  mono.mod = IloModel(env);
  mono.cplex = IloCplex(mono.mod);

  int sizef = data.p*data.n*data.n*data.n*data.n;
  mono.f = IloNumVarArray(env, sizef, 0.0, +IloInfinity, ILOFLOAT);
  mono._f = IloNumArray(env,sizef);
  mono.q = IloNumVarArray(env, data.p, 0.0, +IloInfinity, ILOFLOAT);
  mono._q = IloNumArray(env,data.p);


  mono.constraints_r3 = IloRangeArray(env);

  char name[50];
  for (int p = 0; p < data.p; p++) {
    for (int k = 0; k < data.n; k++) {
      for (int m = 0; m < data.n; m++) { 
    if (k != m) { 
      if (data._x[p][k][m] == 1) { 
        IloExpr r_3(env);
        for (int i = 0; i < data.n; i++) {
          for (int j = 0; j < data.n; j++) {
        if (i != j) {
          if (k != j and m != i) { 
            r_3 += mono.f[MAPf(p,i,j,k,m,data.n)] ; 
            sprintf(name, "f(%d,%d,%d,%d,%d)",p,i,j,k,m);
                    mono.f[MAPf(p,i,j,k,m,data.n)].setName(name);
          }
        }
          }
        }
        r_3 -= mono.q[p] * data.tau[p]; 
        sprintf(name, "q(%d)",p);
            mono.q[p].setName(name);
        IloRange ctr;
        ctr = (r_3 <= 0);
        sprintf(name, "r3_%d_%d_%d",p,k,m);
        ctr.setName(name);
        mono.constraints_r3.add(ctr);
        r_3.end();
      }
    }
      }
    }
  }

  mono.mod.add(mono.constraints_r3);

}

void DeleteConstraints (CPX_RHLPflow &mono, DATA data, int vehicle) {

  char name[50];

  int cont = 0;

  for (int p = 0; p < data.p; p++) {
    if (vehicle == p) {
      for (int k = 0; k < data.n; k++) {
        for (int m = 0; m < data.n; m++) { 
      if (k != m) { 
        if (data._x[p][k][m] == 1) { 
          mono.mod.remove(mono.constraints_r3[cont]);
          cont += 1;
        }
      }
        }
      }
      break;
    }
  }



  sprintf(name, "ModelAfterModification.lp");
  mono.cplex.exportModel(name);

}

int main(int argc, char* argv[]) {

  CPX_RHLPflow mono;

  DATA data;
  data.n = 5;
  data.p = 3;

  data._x = vector<vector<vector<int> > > (data.p, vector<vector<int> > (data.n, vector<int> (data.n,0)));
  data.tau = vector<double> (data.p, 1.00);

  data._x[0][0][1] = 1;
  data._x[0][1][3] = 1;
  data._x[0][3][4] = 1;
  data._x[0][4][0] = 1;

  data._x[1][2][4] = 1;
  data._x[1][4][3] = 1;
  data._x[1][3][2] = 1;


  data._x[2][1][2] = 1;
  data._x[2][2][3] = 1;
  data._x[2][3][4] = 1;
  data._x[2][4][1] = 1;

  cout << "oi" << endl;

  create_model_RHLPflow (mono, data);

  char name[50];
  sprintf(name, "ModelBeforeModification.lp");
  mono.cplex.exportModel(name);

  int vehicle = 1;

  DeleteConstraints(mono,data,vehicle);

  data._x[1][2][4] = 0;
  data._x[1][4][3] = 0;
  data._x[1][3][2] = 0;

  data._x[1][2][3] = 1;
  data._x[1][3][1] = 1;
  data._x[1][1][4] = 1;
  data._x[1][4][2] = 1;





  return 0;

}
typedef结构{
IloCplex-cplex;
伊洛恩温;
IloModel-mod;
伊洛努姆瓦拉雷f;
伊洛努马里夫;
伊洛努姆瓦拉雷q;
伊洛努马里奥;
IloRangeArray约束条件_r3;
ilofo;
伊洛纳姆(IloNum)fo ;;
}CPX_RHLPflow;
结构数据{
int n;
向量x;
INTP;
向量tau;
};
int MAPf(int路由器,int节点,int节点,int节点,int节点,int节点,int节点)
返回路由器*N*N*N*N+nodei*N*N*N+nodej*N*N+nodeu*N+nodev;
}
void create_model_RHLPflow(CPX_RHLPflow&mono,数据){
ilonev&env=mono.env;
mono.mod=IloModel(env);
mono.cplex=IloCplex(mono.mod);
int sizef=data.p*data.n*data.n*data.n*data.n*data.n;
mono.f=ilonumvarray(env,sizef,0.0,+ilonfinity,ILOFLOAT);
mono._f=IloNumArray(环境、尺寸);
mono.q=ilonumvarray(env,data.p,0.0,+ilonfinity,ilofolary);
mono._q=IloNumArray(环境,数据.p);
mono.constraints_r3=IloRangeArray(env);
字符名[50];
对于(int p=0;pctr=(r_3如果我正确理解您的问题,您可以使用下面的解决方案

// Insert the constraint
// bc <- my branch-and-cut class
// bc.env_ <- IloEnv
// expr    <- IloExpr
// x       <- integer  
IloRange neigboor(bc.env_, -IloInfinity, expr, x, "constraintName");

// model_ <- IloModel
bc.model_->add(neigboor);

bc.solve();

bc.model_->remove(neigboor);
neigboor.end();
//插入约束

/BC这不是一个复杂的问题,它是一个C++问题。你需要安排你的数据结构,以便你可以找到你需要的对象。例如,如果你想删除所有与“P”相关的约束,那么首先要在构建约束时保持每个P’的约束列表。