2012-07-17 114 views
0

我尝试使用SuanShu优化库解决以下问题,但没有成功。使用Apache Commons优化函数数学

优化问题是:

找到最大的整数^ 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,ε,N给出他们是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的公地数学库,我没有对如何使用它这个问题的线索。

回答

0

如果您使用酸煮,您可以尝试brute force minimizerDeOptim。对于DeOptim,您需要对您的积分约束单元工厂进行编码,例如:IntegralCellFactory.java

+0

好的,我使用了蛮力最小化器。出于好奇,当我使用Penalty minimizer时,结果绝对错误。我认为它陷入了当地的最低限度。问题是为什么会发生这种情况,而最小化者是否有防范机制?我知道MultiStartOptimizer,但我指的是其他机制。 – Razvan 2012-07-22 19:25:22

+0

所有惩罚最小化者的做法是通过对约束添加一个巨大的惩罚将一个不受限制的问题转化为一个约束问题。然后运行你喜欢的任何不受约束的优化器。不能保证约束条件不会被违反。 “制造”了无约束的目标函数可以是丑陋的(非凸,跳跃,你的名字......),是的,它可以很容易陷入局部。 每个最小化类应保持最小。如果我们想要获得某种保护,应该在最小化类之外“添加”或“编码”。否则,我们需要重复相同的机制。 – Ryu 2012-07-24 16:24:58

0

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