我正在尝试为 CPLEX 中的混合整数问题生成许多解决方案,其中所有整数变量都是二进制的。该问题有大约 1000 个连续变量和 1000 个二元变量,作为指标,大约有 2500 个线性约束。
我的目标函数是指标变量的最小化,我想产生许多接近最优的解决方案,它们在为二元变量选择的值方面彼此不同。我当前的代码可以总结为-
IloCplex cplexModel = new IloCplex();
---build the problem, set objective---
cplexModel.setParam(IloCplex.IntParam.SolnPoolCapacity, N);
cplexModel.setParam(IloCplex.IntParam.PopulateLim, K*N);
cplexModel.setParam(IloCplex.IntParam.SolnPoolReplace, 2);
cplexModel.setParam(IloCplex.DoubleParam.SolnPoolGap, D);
cplexModel.setParam(IloCplex.IntParam.MIPEmphasis, 0);
cplexModel.populate();
其中 N、K 和 D 是所需解决方案数量的缩写名称,分别是我愿意在求解时缩放生成的解决方案数量的因素,以及我愿意从最优最小化中接受的相对差距。我还使用了其他几个似乎与问题无关的 CPLEX 参数。
我的问题是解决方案的多样性是在所有变量中测量的,包括连续变量,而我只对二进制变量值不同的解决方案感兴趣。这意味着我得到的大多数结果共享二进制变量的相同值,并且对我来说无法区分(因为我只对二进制值感兴趣)。我目前的解决方法是通过设置 -
cplexModel.setParam(IloCplex.IntParam.SolnPoolCapacity, T*N);
cplexModel.setParam(IloCplex.IntParam.PopulateLim, T*K*N);
T 通常为 50,然后(希望)从解决方案池中选择 N 个结果,这些结果在二进制变量的值上彼此不同。
我已经检查了多样性过滤器作为将多样性计算限制为二进制变量的一种方式,但我看不出它如何用于在解决方案之间强制执行多样性,而不是在每个解决方案和参考解决方案之间。除此之外,我不知道还能做什么。
帮助表示赞赏。另外,这是我的第一个问题,如果格式错误,我深表歉意。