簡體   English   中英

如何在java apache數學中使用SimplexSolver或SimplexOptimizer?

[英]How to use SimplexSolver or SimplexOptimizer in java apache math?

我正在嘗試使用apache commons數學庫版本3.5+來解決優化問題。 基本上,我正在嘗試將(gamma)分布擬合到某些數據點。 我似乎無法找到如何使用新的(版本3.5)優化工具(如SimplexSolver,SimplexOptimizer或OptimizationData)來解決一個簡單的優化問題的簡單示例。

之前已經在這里提出了類似的問題,但所有答案似乎都是針對舊版本的apache數學 - 在3.5版本中進行了重組,並且我找不到任何示例代碼。

有沒有人有一個工作示例如何使用新的優化器或求解器? 我對SimplexOptimizer最感興趣,但此時任何東西都會有用。

實際上,優化器可能很難使用:許多參數,不同類型的優化器需要不同的組合,並且它們都隱藏在它們接收的通用OptimizationData數組中。 除非您開始將代碼與他們所引用的論文進行匹配,否則您幾乎無法獲得任何結果。

我還想偶爾使用一些求解器/優化器,對我來說,可靠的,工作“”示例“的主要來源是”這些類的單元測試 ,這些測試通常都是非常精細的,涵蓋了很多案例。 例如,關於SimplexOptimizer ,您可能需要查看org/apache/commons/math4/optim/nonlinear/scalar/noderiv/測試用例,其中包含測試類SimplexOptimizerMultiDirectionalTest.javaSimplexOptimizerNelderMeadTest.java

(對不起,也許這不是你期望或希望的那樣,但是......當我試圖弄清楚這些優化器實際需要哪些OptimizationData時,我發現這些測試非常有用......)

編輯

僅供參考,從一個基本單元測試中提取的完整示例:

import java.util.Arrays;

import org.apache.commons.math3.analysis.MultivariateFunction;
import org.apache.commons.math3.optim.InitialGuess;
import org.apache.commons.math3.optim.MaxEval;
import org.apache.commons.math3.optim.PointValuePair;
import org.apache.commons.math3.optim.nonlinear.scalar.GoalType;
import org.apache.commons.math3.optim.nonlinear.scalar.ObjectiveFunction;
import org.apache.commons.math3.optim.nonlinear.scalar.noderiv.NelderMeadSimplex;
import org.apache.commons.math3.optim.nonlinear.scalar.noderiv.SimplexOptimizer;
import org.apache.commons.math3.util.FastMath;

public class SimplexOptimizerExample
{
    public static void main(String[] args)
    {
        SimplexOptimizer optimizer = new SimplexOptimizer(1e-10, 1e-30);
        final FourExtrema fourExtrema = new FourExtrema();

        final PointValuePair optimum =
            optimizer.optimize(
                new MaxEval(100), 
                new ObjectiveFunction(fourExtrema), 
                GoalType.MINIMIZE, 
                new InitialGuess(new double[]{ -3, 0 }), 
                new NelderMeadSimplex(new double[]{ 0.2, 0.2 }));

        System.out.println(Arrays.toString(optimum.getPoint()) + " : "
            + optimum.getSecond());
    }

    private static class FourExtrema implements MultivariateFunction
    {
        // The following function has 4 local extrema.
        final double xM = -3.841947088256863675365;
        final double yM = -1.391745200270734924416;
        final double xP = 0.2286682237349059125691;
        final double yP = -yM;
        final double valueXmYm = 0.2373295333134216789769; // Local maximum.
        final double valueXmYp = -valueXmYm; // Local minimum.
        final double valueXpYm = -0.7290400707055187115322; // Global minimum.
        final double valueXpYp = -valueXpYm; // Global maximum.

        public double value(double[] variables)
        {
            final double x = variables[0];
            final double y = variables[1];
            return (x == 0 || y == 0) ? 0 : FastMath.atan(x)
                * FastMath.atan(x + 2) * FastMath.atan(y) * FastMath.atan(y)
                / (x * y);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM