在CPLEX java API的填充方法中最大化二进制变量的多样性,同时限制最优性

时间:2013-03-11 17:29:23

标签: cplex

我正在尝试为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个结果,这些结果在二进制变量的值中彼此不同。

我已将diversity filters视为将多样性计算限制为二元变量的一种方法,但我不知道它如何用于在解决方案中强制实施多样性在每个解决方案和参考解决方案之间。除此之外,我还无能为力。

帮助表示赞赏。另外,这是我的第一个问题,所以如果我将其格式化错误,我会道歉。

2 个答案:

答案 0 :(得分:1)

道歉,但我的背景是以旧的方式这样做,而且我通常使用C#或C ++。我从来没有尝试过使用这种新奇的“填充”东西......但我可能应该这样做!但也许我过去所做的一些事情可能有所帮助。

我“手动”完成此操作的方法是在循环中重复解决问题,每次添加约束以强制某些二进制变量不同。这可以像添加约束以强制单个变量不同一样简单(如果在解决方案中为1,则尝试添加约束以强制它为零(反之亦然))。或者更聪明一点,并添加一个约束,m个变量中至少有n个必须是不同的。这种方法的好处在于,它可以让您直接控制解决方案必须与之不同的内容和数量。

现在,通过其中一个cplex回调添加约束,可以在“填充”方法中实现类似的功能。我没有最近的文档,所以我只是从记忆中猜测......

希望这有帮助

答案 1 :(得分:0)

我在IBM的论坛上得到了答案 - link

解决方案池多样性替换策略Soln​​PoolReplace = 2仅计算有关解决方案多样性的二元变量。

因此,就二元变量而言,由于不同的原因,我的解决方案似乎并不多样,而且这种策略仍然是正确的方法。