在Google的OR工具库中,可以使用 Convert(begin_date, 'System.String') LIKE '*/2019*' OR Convert(end_date, 'System.String') LIKE '*/2019*' OR (begin_date < #01/01/2019# AND end_date > #31/12/2019#)
来播种“原始” CP-Solver(在此处讨论:https://developers.google.com/optimization/cp/original_cp_solver)。但是,较新的版本CP-SAT无法。
我的假设是CP-SAT将彻底尝试您问题中的每个选项,并从可行的方法中选择最大或最小(取决于您的优化目标)。由于它会尝试所有种子,因此不需要任何种子,因此该选项对您不可用。
这种理解正确吗?如果是,为什么原来的求解器有种子?如果我不正确,那么新的CpSolver中缺少.ReSeed()
是一个疏忽吗?
答案 0 :(得分:2)
不,您的推理不太正确。
是的,CP-SAT求解器将尝试所有选项,并会在有限的时间内找到解决方案或证明其不可行(在某些温和条件下:除了提及最简单的限制->内存,我不会尝试详细介绍) ;不太简单:随机重启进程)。求解器的这种性质通常称为 complete and(sound)(后者是指这样的事实:在可行的情况下,永远不会出现诸如不可行之类的错误分类输出)。 但是原始的CP-Solver也是完整且声音。
绝对不应将种子用作调整参数(用例非常有限)。种子用作PRNG-init(解算器中存在随机性,但它是确定性的),在比赛中使用此事实(表现出运气或无用的调优)可能是有意义的。
如@Stradivari的注释中所述,protobuf definition中有一个种子。如果需要,也可以设置这些值。
它可能看起来像这样:
24 from .nn import NeuralNetwork, Layer, Convolution, Native, ansi
这显示了python接口,但是protobuf文件是针对所有受支持的语言编译的,因此,这些setter应该在所有API(imho)中都可用。
如果我没记错的话,手动设置的参数将在求解开始时显示给您(或者可以通过某种方式获取此信息以进行其他检查)。