0

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

我已经检查了多样性过滤器作为将多样性计算限制为二进制变量的一种方式,但我看不出它如何用于在解决方案之间强制执行多样性而不是在每个解决方案和参考解决方案之间。除此之外,我不知道还能做什么。

帮助表示赞赏。另外,这是我的第一个问题,如果格式错误,我深表歉意。

4

2 回答 2

1

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

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

现在,通过 cplex 回调之一添加约束,可以在“填充”方法中实现类似的东西。我手头没有最近的文档,所以我只是凭记忆猜测......

希望这可以帮助

于 2013-03-11T17:42:52.037 回答
0

我在 IBM 的论坛 -链接上得到了所需的答案。

解决方案池多样性替换策略,SolnPoolReplace=2,只计算关于解决方案多样性的二进制变量。

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

于 2013-04-19T20:17:41.170 回答