实际生产中很多的组合优化问题包含上百万甚至上亿的变量,很容易出现内存溢出和计算超时的问题。在试探计算机“底线”的过程中,我们如果能利用分布式的优势,会让很多问题的求解规模成倍增加。
1. 多线程优化
在Cplex多进程分确定性和机会性两种。确定性指的是重复求解时遵循相同的求解路径,而机会性则是随机应变。可以使用并行方式开关 (ParallelMode/CPX_PARAM_PARALLELMODE) 来控制机会性算法的调用。 在使用其缺省设置 0 时,除非线程参数更改为严格大于 1 的值,否则将使用确定性算法。要强制 CPLEX 在所有情况下使用确定性算法,请将并行方式参数设置为 1。要允许 CPLEX 在所有情况下使用机会性算法,请将并行方式参数设置为 -1。
2. 分布式算法
混合整数规划的基本方法是分支定界法。分布式算法的主要流程是:
- 预求解:在master node上预求解 MIP。
- 提升:将简化模型发送到各个work node构建搜索树。当master node断定至少work node创建了足够大的搜索树时,提升将停止。
- 分发:master node将获胜的搜索树分发到所有机器,进行分支定界搜索。
在 CPLEX 实现的分布式并行分支定界中,master node保留全局搜索树的大量节点。 如果某个work node变为空闲状态,那么master node会将其中一些节点发送到该work node。 然后,该node将此节点视为新的 MIP,并预求解该 MIP、使用分支定界法找到该节点的最优解。 换而言之,work node不仅仅求解单个节点,而是求解根位于该节点处的整个子树。
下面说一下ssh方式的配置。首先在集群所有节点上安装python和cplex。不妨假设cplex安装目录为/nfs/CPLEX,然后创建配置文件configuration.vmc(虚拟机配置文件是一个 XML 文件,用于指定分布式并行优化应用程序中主控与工作程序之间的通信协议,以及每个工作程序的配置。):
<?xml version="1.0"?>
<vmc>
<machine name="host2">
<transport type="process">
<cmdline>
<item value="ssh"/>
<item value="host2"/>
<item value="/nfs/CPLEX/cplex"/>
<item value="-worker=process"/>
<item value="-stdio"/>
<item value="-libpath=/nfs/CPLEX"/>
</cmdline>
</transport>
</machine>
<machine name="host3">
<transport type="process">
<cmdline>
<item value="ssh"/>
<item value="host2"/>
<item value="/nfs/CPLEX/cplex"/>
<item value="-worker=process"/>
<item value="-stdio"/>
<item value="-libpath=/nfs/CPLEX"/>
</cmdline>
</transport>
</machine>
</vmc>
其中host2和host3为work node的别名。然后从主节点host1上启动cplex即可,关键语句是:
cplex.read_copy_vmconfig(“configuration.vmc”)
找到配置文件后,Cplex会自动执行分布式MIP优化。