java - apache commons LinearObjectiveFunction 算法

标签 java math apache-commons

apache commons 数学库如何计算给定不等式约束的目标函数的最小值和最大值。

例如

maximize 3x1+5x2 
given - 2x1+8x2<=13
5x1-x2<=11
x1>=0,x2>=0

apache commons 库为此应用什么算法。

最佳答案

有一个Simplex Apache commons math 中的求解器。

您可以使用此库解决您的问题:

@Test
public void testMathStackOverflow() {
    //      maximize 3x1+5x2
    //      subject to
    //          2x1+8x2<=13
    //          5x1-x2<=11
    //              x1>=0
    // x2>=0

    LinearObjectiveFunction f = new LinearObjectiveFunction(new double[] { 3, 5}, 0);

    ArrayList<LinearConstraint> constraints = new ArrayList<>();

    constraints.add(new LinearConstraint(new double[] {2, 8}, Relationship.LEQ, 13));
    constraints.add(new LinearConstraint(new double[] {5, -1}, Relationship.LEQ, 11));

    double epsilon = 1e-6;
    SimplexSolver solver = new SimplexSolver();
    PointValuePair solution = solver.optimize(f, new LinearConstraintSet(constraints),
            GoalType.MAXIMIZE,
            new NonNegativeConstraint(true),
            PivotSelectionRule.BLAND);
    System.out.printf("x1: %f; x2: %f; max: %f", solution.getPoint()[0], solution.getPoint()[1], solution.getValue());
}

结果是:

x1: 2.404762; x2: 1.023810; max: 12.333333

我使用了这些依赖项:

<groupId>org.apache.commons</groupId>
<artifactId>commons-math4</artifactId>
<version>4.0-SNAPSHOT</version>

有关此库中 Simplex 求解器的更多使用示例,请下载源代码并检查包中的单元测试:

org.apache.commons.math4.optim.linear

关于java - apache commons LinearObjectiveFunction 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46709079/

相关文章:

java - Apache Commons StringEscapeUtil 中的错误?

java - 如何从 Java 转换 csv 文件中的指数

java - IOUtils.copy 到指定长度

java - 如果使用@NotNull,双向一对一关系将无法保存

java - 一道面试题

java - 根据系统设置选择要加载的 native 库

java - 将 float 四舍五入到小数点后两位的最佳做法是什么?

ios - RGBA 十进制表示法到算术表示法

java - 如果我们想在 Hibernate 中存储日期,TemporalType = Timestamp 是否必要?

algorithm - 不重复地计算来自多个列表的成对项目的组合