C++ 如何在宏BranchCallback中修复边界/更改变量边界?C++;
在下面的代码中,我尝试使用CPLEX宏ILOBRANCHCALLBACK2创建一个分支回调,在这里我选择修复一些变量边界的方法。但是在进行修复时,我在读取一些空间时遇到了访问冲突错误。有人能告诉我做这件事的正确方法吗?我必须为所有变量执行make分支还是branchcallback自己执行C++ 如何在宏BranchCallback中修复边界/更改变量边界?C++;,c++,callback,branch,cplex,C++,Callback,Branch,Cplex,在下面的代码中,我尝试使用CPLEX宏ILOBRANCHCALLBACK2创建一个分支回调,在这里我选择修复一些变量边界的方法。但是在进行修复时,我在读取一些空间时遇到了访问冲突错误。有人能告诉我做这件事的正确方法吗?我必须为所有变量执行make分支还是branchcallback自己执行 ILOBRANCHCALLBACK2(simetria, const Instance&, instance, const IloNumVarMatrix&, X) { vector&
ILOBRANCHCALLBACK2(simetria, const Instance&, instance, const IloNumVarMatrix&, X) {
vector<coordenates> F_zeros;
vector<coordenates> F_ones;
vector<int> a;
a.resize(instance.getNbClients());
a[0] = 0;
coordenates first;
first.x = 0;
first.y = 0;
F_ones.push_back(first);
// Je verifie s'il y a deja des variables fixées
for(int i = 1; i < instance.getNbClients() - 1; ++i) {
for(int j = 1; j < instance.getNbVehicles() - 1; ++j) {
if(getUB(X[i][j]) <= 0.001) {
coordenates obj;
obj.x = i;
obj.y = j;
F_zeros.push_back(obj);
}
if(getLB(X[i][j]) >= 0.99) {
coordenates obj;
obj.x = i;
obj.y = j;
F_ones.push_back(obj);
}
}
}
// Je vais construir mon a.
for(int k = 1; k < instance.getNbClients() - 1; k++) {
// Zero setting
if(a[k - 1] == instance.getNbVehicles() - 1 || findInVector(F_zeros, k, a[k - 1] + 1)) {
a[k] = a[k - 1];
coordenates obj;
obj.x = k;
obj.y = a[k - 1];
} else {
a[k] = a[k - 1] + 1;
coordenates obj;
obj.x = k;
obj.y = a[k - 1] + 1;
}
}
// Je mets a jour le F_zero a partir de a
for(int k = 1; k < instance.getNbClients() - 1; k++) {
for(int p = 1; p < instance.getNbVehicles() - 1; p++) {
if(p > a[k]) {
coordenates obj;
obj.x = k;
obj.y = p;
F_zeros.push_back(obj);
}
}
}
// je fixe tout ce qui est en F_zero en zero (Changer les bornnes)
for(int i = 0; i < F_zeros.size(); i++) {
int a = F_zeros[i].x;
int b = F_zeros[i].y;
X[a][b].setUB(0);
// X[F_zeros[i].x][F_zeros[i].y].setBounds(0, 0);
// makeBranch(X[F_zeros[i].x][F_zeros[i].y], 0, IloCplex::BranchUp, getBestObjValue());
// makeBranch(X[F_zeros[i].x][F_zeros[i].y], 0, IloCplex::BranchDown, getBestObjValue());
}
ILOBRANCHCALLBACK2(simetria,const Instance&,Instance,const IloNumVarMatrix&,X){
向量F_零;
向量F_-one;
载体a;
a、 调整大小(instance.getNbClients());
a[0]=0;
首先协调;
第一,x=0;
第一,y=0;
F_一个。向后推(第一);
//我验证了变量的正确性
对于(int i=1;ia[k]){
协调obj;
obj.x=k;
对象y=p;
F_零。推回(obj);
}
}
}
//我要把钱花在零钱上(换成零钱)
对于(int i=0;i
在求解模型时,您不能修改模型(例如,请参阅文档中的注释)。您已经发现,这可能会导致segfault。因此,您不能在回调中使用setUB
方法
正如您可能知道的(根据您注释掉的代码),您可以使用以下方法:
指示调用IloCplex对象如何从中创建子节点
通过为一组节点指定新的、更紧的边界来创建当前节点
变量
我看到了一个函数,没有宏…你可以通过将所有内容翻译成英语,使你的代码更具自我解释性,从而增加你的机会…而且它甚至不是一个完整的函数。将它变成一个…将受益于一些一致的缩进。@Goratryan你的编辑非常小,小心点。但是,我同意,因为ev像这样的一个小的输入错误(或语言错误)在标题中确实会分散注意力。我这样做了,我发现Makebranch只将ilonumvarray作为参数,我的变量是ilonumvaratrix。我假设你的代码中有以下内容:
typedef ilonarray ilonumvaratrix
。所以,X[I]
应该给你一个ilunmvararray
。你有什么理由不能使用它吗?