内容发布更新时间 : 2024/12/23 0:22:59星期一 下面是文章的全部内容请认真阅读。
SolnPoolIntensity设置为它的最大值。
填充解池
填充与模型相关的解池的方法有两个:你可以累计连续的现解或通过移入解池产生可选的解。这个方法是由参数SolnPoolPop选择的。
? 现解一经发现,常规的优化程序就会自动地把它添加到解池
(SolnPoolPop=1)。
? Cplex还提供了一个专门产生多个解的程序。你可以通过设置选项
SolnPoolPop=2来调用这个程序。你可以多次调用该程序去寻找多个解,特别是第一个找到的解并不是很让人满意的时候。这是通过制定一个GAMS程序(选项SolnPoolPopRepeat)来考察解。在这个GAMS程序正常终止,也就是没有执行或编译错误的情况下,就会继续寻找可选的解 选项SolnPoolPopRepeat在解池饱和的情况下,指定替换解的策略。值0代表了根据先进先出规则的方法替换解。值1保留了最佳目标值的解。值2是以建立多样性的解集的规则替换解。
如果你获得的解彼此都太过相似,请尝试把SolnPoolPopRepeat设为2。 替换策略仅适用于由当前调用的解的子集,而不影响解池中已有的解。解池中的解即使满足替换条件,也不会被替换掉。所以每一次完整的重复调用转移程序,解池就会被新发现的解扩展一个。在GAMS程序指定决定继续搜索可选解的SolnPoolPopRepeat后,由选项SolnPoolPopRepeat指定的文件就会被读入。文件中解的个数在转移程序被再次调用之前会被删掉。程序执行结束,GAMS/Cplex会自动删掉这个文件。
详情请参见GAMS模型库的模型solnpool。 枚举所有解
有了解池,你可以收集模型的所有解。为了这么做,须设置解池强度参数SolnPoolIntensity为最大值4并设SolnPoolPop=2。
你也可以枚举所有的可行解。例如,如果你想枚举所有可选择的最优解,做如下设置:
? 设置池绝对间距参数SolnPoolAGap=0.0。
? 设置池强度参数SolnPoolIntensity=4。
? 设置转移限制参数PopulateLim 对于你的模型足够大,例如,
2100000000。
? 设置池转移参数SolnPoolPop=2。
请注意,但是即使是小模型,解的数目也有可能是很大的。因此,枚举所有的解需要消耗大量的时间和内存。
连续变量可能会有无数的解,所以实际上在电脑中不可能枚举所有的解。因此,转移只在一组二进制集合中给出一个解。而对于二进制和整数变量,即使可能存在着值是一样的几个解,但是对于连续型变量,解的值是不一样的。
同样地,因为同样的原因,转移程序对无限模型并不产生所有的可行解。只要有无限的迹象,转移程序就会停止。
Cplex使用有限精度数值的数学方法,因此,解的可行性取决于一定的容差性。评价解得可行性的容差度由两个参数决定:
? 完整性容差度EnInt ? 可行性容差度EpRHS
一个解可能因为一对参数的值决定而被认为是可行的,因为另一对不同的参数值而被认为是不可行的。这个现象在数值上有困难的模型中尤其明显,例如,在大M系数模型。
由于可行解的定义受容差度影响,用不同的枚举解的方法或容差度的精确程度,所得到的模型的解的数目可能是不同的。在大部分模型中,容差度问题不算是个问题,但是在数字难题面前,Cplex可能创造稍微不可行或整数不可行的,从而可行得出比预期更多的解。 过滤解池
过滤使得你能控制产生和存储在池中的解的属性。Cplex提供了两种预定义的方法来过滤解。
如果你想基于与参考解的差异来过滤解,就使用多样性过滤器。这个过滤器对于大多数目标是切实可行的。然而,如果你需要更好地控制保留哪个解去除哪个解,就使用现任过滤器(incumbent filter)。
多样性过滤器
一个多样过滤器使你能产生与你为二进制变量集合指定的一组参考值相似(或不同)解,这个二进制变量集合是使用点选项divflt和上下限divfltlo和divfltup决定的。特殊地,你可以使用多样性过滤器产生更多的与现有的解或部分解相似的解。如果你需要多于一个多样性过滤器,比如,产生拥有多个不同解的特征的解,可以通过Cplex过滤器文件使用参数ReadFLT指定多个过滤器。详情请见GAMS模型库中的例子模型solnpool。 现任过滤器
如果你约束比较复杂(如非线性约束),就可以使用现任过滤器。现任过滤器的检查路径是GAMS BCH设施的一部分。它会独立于解池接受或拒绝现解。在转移或其他普通的程序中,现解检查路径是由参数userincbcall指定的,当发现一个新解,尽管新解并没有当前的目标值,现解检查路径就会被调用。现任过滤器使得你的程序能够基于你自己的标准接受或拒绝新解。如果由userincbcall指定的GAMS程序正常终止,解就被拒绝了。如果程序返回一个编译或执行错误,现任解就会被接受。 评价解池
如果GAMS/Cplex链接程序被正确引导,一个包含元素file1、file2,??名为SolnPool的GDX文件就会被创建。这些元素相关的文本包含各个独立的GDX解文件的文件名。它的名字是使用前缀soln(通过选项SolnPoolPrefix指定)、模型的名字和一系列数字组成的。比如,soln loc p1.gdx。GAMS/Cplex覆盖现存的GDX文件而不会被警告。指标集使得我们能方便地遍历解池中得不同解: ...
solve mymodel min z using mip;
set soln possible solutions in the solution pool /file1*file1000/ solnpool(soln) actual solutions; file fsol;
execute_load 'solnpool.gdx', solnpool=Index; loop(solnpool(soln),
put_utility fsol 'gdxin' / solnpool.te(soln):0:0; execute_loadpoint; display z.l; );
4. GAMS选项
下列的GAMS选项是在GAMS/Cplex中使用的: 选项 Bratio = x;
决定是否使用高级基础。数值1.0表示GAMS不用高级基础引导Cplex。数值0.0表示GAMS从任意可用信息构造基础。默认值0.25 通常会使得GAMS在求解语句执行过的时候用到高级基础。
选项IterLim = n;
设置单纯迭代极限。单纯形算法会终止或传递现解给GAMS。在前解pre-solve完成后,后解路径就会在报告解决方案前被激活。
Cplex处理MIP(混合整数规划)问题的迭代限制时与别的GAMS求解器不同。每个节点都会应用迭代限制,而不是所有的节点一起应用迭代限制。对于MIP问题,有限使用通过限制执行时间(ResLim)控制解运行的时间。
同样地,当使用筛选算法时,每次筛选迭代都会应用到迭代极限(例如,每次Lp)。筛选迭代的数目可通过设置Cplex参数siftitlim,它代表使用迭代时报告给GAMS的筛选迭代次数。
选项 ResLim = x;
以秒为单位设置时间限制。该算法会终止或传递当前解给GAMS,在前解pre-solve完成后,后解路径就会在报告解决方案前被激活。
选项 SysOut = On;
(Will echo Cplex messages to the GAMS listing file.)这个选项在求解失败时有用。
ModelName.Cheat = x;
Cheat的值:每一个新的整数解肯定比前一个解至少优x。它可以加速搜索,但是你可能错失最优解。Cheat参数指定为绝对值(如OptCA选项)。Cplex选项objdif能覆盖GAMScheat参数。
ModelName.Cutoff = x;
Cutoff的值:当分支定界搜索开始时,如果树中有部分分支的目标值比x差,就会被剪枝。这也同样可以缩短分支定界算法的初始阶段的时间。
ModelName.NodLim = x;
处理混合整数规划问题的最大节点数。
ModelName.OptCA = x;
混合整数规划问题的绝对最优判据。 ModelName.OptCR = x;
混合整数规划的相对最优判据。注意,Cplex使用与GAMS通常使用的定义不同。当满足下式时OptCR要求Cplex停止:
(BP?BF)(1.0??10?BF)?OptCR
BF是当前最优整数解的目标函数值,而BP是可能最优的整数解的目标函数值。GAMS的定义是:
?BP?BF??BP??OptCR
ModelName.OptFile = 1;
指导Cplex读取选项文件,选项文件的名字是cplex.opt。 ModelName.PriorOpt = 1;
指导Cplex使用GAMS通过变量.prior参数传递的优先分支信息。 ModelName.TryInt = x;
促使GAMS/Cplex求解混合整数规划时使用当前变量值。如果变量值在x范围内,那么这个变量就会被移动到这个范围内,同时它的首选分支方向被设置为指向这个范围。首选分支方向仅在优先权被使用时有效。优先权和Tryint有时不是很有效,但它们一般都优于GAMS / CPLEX的默认设置。如果想了解有关用不同方法把已知解传递给GAMS / CPLEX的知识,请阅读章节——从混合整数规划问题的解开始。
5. Cplex选项总结
这里以目录的形式列了各种Cplex选项,还以简短的文字介绍了其功能。在本文的最后一节,将会再次以字母顺序详细介绍这些选项。 5.1 预处理和一般选项
advind 高级基础使用 aggfill 聚合器填充参数 aggind 聚合器开/关