Apache Commons Math 3.6.1中SimplexSolver的optimize方法正确使用示例
Apache Commons Math3 SimplexSolver 正确使用示例
入参差异说明
Apache Commons Math 3.1及以上版本对优化模块做了重构,SimplexSolver的optimize方法不再支持旧版分散参数的传入方式,改为接收可变长度的OptimizationData接口实现类实例。常用的OptimizationData实现类如下:
LinearObjectiveFunction:定义待求解的线性目标函数LinearConstraintSet:存储所有线性约束条件的集合GoalType:优化目标类型,可选GoalType.MINIMIZE(最小化)、GoalType.MAXIMIZE(最大化)NonNegativeConstraint:标识是否要求所有决策变量默认非负
完整代码示例
以下为最小化场景的完整可运行示例,求解场景如下:
目标函数:min 2x + 3y
约束条件:
- x + y ≥ 5
- x ≥ 1
- y ≥ 2
- 所有决策变量非负
import org.apache.commons.math3.optim.PointValuePair; import org.apache.commons.math3.optim.linear.*; import org.apache.commons.math3.optim.nonlinear.scalar.GoalType; import java.util.ArrayList; import java.util.List; public class SimplexDemo { public static void main(String[] args) { // 1. 定义目标函数:2x + 3y,最后一个参数为常数项,这里目标函数无常数项填0 LinearObjectiveFunction function = new LinearObjectiveFunction(new double[]{2, 3}, 0); // 2. 定义约束集合 List<LinearConstraint> constraints = new ArrayList<>(); // 约束1:x + y ≥5 constraints.add(new LinearConstraint(new double[]{1, 1}, Relationship.GEQ, 5)); // 约束2:x ≥1 constraints.add(new LinearConstraint(new double[]{1, 0}, Relationship.GEQ, 1)); // 约束3:y ≥2 constraints.add(new LinearConstraint(new double[]{0, 1}, Relationship.GEQ, 2)); // 3. 创建求解器并调用optimize方法 SimplexSolver solver = new SimplexSolver(); PointValuePair result = solver.optimize( function, new LinearConstraintSet(constraints), GoalType.MINIMIZE, new NonNegativeConstraint(true) // 所有变量非负 ); // 4. 输出结果 double[] variables = result.getFirst(); double optimalValue = result.getValue(); System.out.println("最优解 x = " + variables[0] + ", y = " + variables[1]); System.out.println("目标函数最小值 = " + optimalValue); } }
注意事项
- 构造
SimplexSolver时可自定义传入三个参数:epsilon(收敛判定阈值)、maxUlps(浮点误差校验阈值)、cutoff(退化判定阈值),无参构造会使用默认配置 - 若无特殊约束要求,
NonNegativeConstraint参数建议传true,避免出现无意义的负解 - 求解结果
PointValuePair的getFirst()方法返回决策变量的最优解数组,顺序和目标函数中定义的变量顺序一致,getValue()方法返回目标函数的最优值
内容的提问来源于stack exchange,提问作者Mr. Moose
相关产品推荐
相关产品推荐

