能否为MPModelProto设置初始值提示?GLOP相关Java实现性能疑问
问题分析与修复建议
我正在用MPModelProto + GLOP做开发,实现了一种启发式算法,会在修改部分约束的前提下持续运行线性模型。理论上,每次运行时用上一次的实际解作为线性优化器的初始提示,应该能提升性能。但下面这段代码能正常运行,却没观测到明显的性能提升,想确认实现是否合理:
PartialVariableAssignment partialVariableAssignment = PartialVariableAssignment.newBuilder() .addAllVarIndex(IntStream .range(0, mpSolutionResponse.getVariableValueCount() - 1) .boxed() .collect(Collectors.toList())) .addAllVarValue(mpSolutionResponse.getVariableValueList()) .build(); model.setSolutionHint(partialVariableAssignment);
代码里的明显问题
这段代码存在索引与值数量不匹配的错误:
IntStream.range(0, mpSolutionResponse.getVariableValueCount() - 1)生成的索引范围是0到变量数-2(因为range是左闭右开),但mpSolutionResponse.getVariableValueList()包含了所有变量的值(共变量数个)。这会导致最后一个变量的值没有对应的索引,相当于丢失了一个变量的初始提示信息。
修正后的代码
把索引生成部分的-1去掉,保证索引和值的数量完全对应:
PartialVariableAssignment partialVariableAssignment = PartialVariableAssignment.newBuilder() .addAllVarIndex(IntStream .range(0, mpSolutionResponse.getVariableValueCount()) .boxed() .collect(Collectors.toList())) .addAllVarValue(mpSolutionResponse.getVariableValueList()) .build(); model.setSolutionHint(partialVariableAssignment);
性能无提升的其他可能原因
即使修复了代码,还是可能因为以下原因看不到性能变化:
- 约束修改幅度小:如果每次修改的约束对最优解影响极小,GLOP本身的求解速度已经很快,初始提示的优化效果不明显。
- GLOP自身策略覆盖:GLOP的预解器或内置初始化策略可能已经自动采用了高效的起始点,外部传入的解提示被弱化了作用。
- 变量索引对应关系变化:如果每次修改约束时,模型的变量顺序或索引发生了变化,旧解的索引和新模型的变量不匹配,初始提示就完全无效。
内容的提问来源于stack exchange,提问作者epol
相关产品推荐
相关产品推荐

