使用Apache Commons Math优化函数

时间:2012-07-17 21:04:05

标签: optimization

我尝试使用SuanShu优化库解决了以下问题,但没有成功。

优化问题是:

找到最大的积分h,使得以下约束成立:

(h-2) * ArithmeticUtils.binomialCoefficient(b+h-2, h-1) -
        ArithmeticUtils.binomialCoefficient(b+h-3, h-3) +
        ArithmeticUtils.binomialCoefficientDouble(b+h-3,h-2)
        - 2*epsilon*N

其中给出了b,epsilon,N,它们分别是int,double,int。

请告诉我应该使用哪种优化器以及优化功能?

到目前为止,代码如下所示:

    public void optimize(){
            //create the univariate function to be optimized
    UnivariateRealFunction functionToOptimize = new UnivariateRealFunction() {

        @Override
        public double evaluate(double h) {
            return -h;
        }
    };
    UnivariateRealFunction hConstraint = new UnivariateRealFunction() {

        public double evaluate(double h) {
                          (h-2) * ArithmeticUtils.binomialCoefficient(b+h-2, h-1) -
                                  ArithmeticUtils.binomialCoefficient(b+h-3, h-3) +
                                  ArithmeticUtils.binomialCoefficientDouble(b+h-3,h-2)
                                  - 2*epsilon*N
        }
    };

    List<RealScalarFunction> constraints = new ArrayList<RealScalarFunction>();
    constraints.add(hConstraint);

    ConstrainedOptimProblem problem = new ConstrainedOptimProblem(
            functionToOptimize, 
            null, 
            new GeneralLessThanConstraints(constraints));

    BFGS bfgs = new BFGS();

    PenaltyMethodMinimizer optim = new PenaltyMethodMinimizer(
            PenaltyMethodMinimizer.DEFAULT_PENALTY_FUNCTION_FACTORY, 
            1e30,
            bfgs);

    optim.solve(problem,1e-3,200);

    Vector xmin = optim.search(new DenseVector(new int[]{8}));
    double fxmin = functionToOptimize.evaluate(xmin.get(1));    
    System.out.println("fxmin: "+fxmin);
    System.out.println(String.format("f(%s) = %f",
            DoubleUtils.doubleArray2StringArray(xmin.toArray()), fxmin));

    }

我看了一下Apache commons数学库,我不知道如何使用它来解决这个问题。

2 个答案:

答案 0 :(得分:0)

我放弃了使用Apache commons的想法,主要是因为它对非线性约束的优化问题不是很有用。 我使用了蛮力最小化器,它完成了这项工作。

答案 1 :(得分:0)

如果您使用SuanShu,则可以尝试brute force minimizerDeOptim。对于DeOptim,您需要编写整数约束单元工厂的代码,例如:IntegralCellFactory.java