2012-01-05 20 views
2

私は複雑な関数を定義しました(4つの二重パラメータ)。私はそれが分化可能であるべきだと考える理由はない。私が知ることができるのは、(興味深い)最適化が見つかるハイパーキューブだけです。アルゴリズムの速度よりも優れた局所最適を見つけることがより重要であることを不規則関数の最適化

public static OptimalParameters brutForce(Model function) throws FunctionEvaluationException, OptimizationException { 
    System.out.println("BrutForce"); 
    double startingStep = 0.02; 
    double minStep = 1e-6; 
    int steps = 30; 

    double[] start = function.startingGuess(); 
    int n = start.length; 
    Comparer comparer = comparer(function); 

    double[] minimum = start; 
    double result = function.value(minimum); 
    double step = startingStep; 
    while (step > minStep) { 
     System.out.println("STEP step=" + step); 
     GridGenerator gridGenerator = new GridGenerator(steps, step, minimum); 
     double[] point; 
     while ((point = gridGenerator.NextPoint()) != null) { 
      double value = function.value(point); 
      if (comparer.better(value, result)) { 
       System.out.println("New optimum " + value + " at " + model.timeSeries(point)); 
       result = value; 
       minimum = point; 
      } 
     } 
     step /= 1.93; 
    } 
    return new OptimalParameters(result, function.timeSeries(minimum)); 
} 

private static Comparer comparer(Model model) { 
    if (model.goalType() == GoalType.MINIMIZE) { 
     return new Comparer() { 
      @Override 
      public boolean better(double newVal, double optimumSoFar) { 
       return newVal < optimumSoFar; 
      } 
     }; 
    } 
    return new Comparer() { 
     @Override 
     public boolean better(double newVal, double optimumSoFar) { 
      return newVal > optimumSoFar; 
     } 
    }; 

} 

private static interface Comparer { 
    boolean better(double newVal, double optimumSoFar); 
} 

注:

は私が機能を最適化するために、実際に原油と遅いアルゴリズムを書きました。

このような最適化アルゴリズムはありますか?このデザインを改善する方法はありますか?

答えて

2

シンプレックスベースの最適化を使用できます。それはあなたのような問題に適しています。

MATLABを使用することができた場合は、少なくともプロトタイピングのために、関数fminsearch
http://www.mathworks.com/help/techdoc/ref/fminsearch.html

[1] Lagarias、JC、JA葦、MHライト、およびPEライト、「収束特性を使用してみてください低次元におけるNelder-Mead Simplex法の "SIAM Journal of Optimization、Vol。 9番号1、頁112から147まで、1998年

+1

このApache Commons javaの実装が見つかりました:http://commons.apache.org/math/apidocs/org/apache/commons/math/optimization/direct/NelderMead.html – Grzenio

+0

@Grzenio、その場合は考慮することができます答えを受け入れる? :) –

0

あなたの問題が聞こえます。 Evolution Strategies (ES)のようなメタヒューリスティックを試すことができます。 ESは、厳しいマルチモーダル実ベクトル関数用に設計されています。私たちのソフトウェアHeuristicLabにはESといくつかの実際の機能が実装されています(Rosenbrock、Rastrigin、Ackleyなど)。独自の関数を実装して最適化することができます。たくさんのコードを追加する必要はなく、例として機能する他の関数から直接コピーすることもできます。しかし、コードをC#に移植する必要がありますが、評価だけで、他の部分は必要ありません。 HeuristicLabに関数を実装している場合は、既に実装されているParticle Swarm Optimization(PSO)メソッド、Genetic Algorithm、またはSimulated Annealingを使用して最適化を試み、どちらが最適かを確認することもできます。一度評価関数を実装するだけで済みます。

または、Evolution Strategiesに関する論文をスキャンして、自分で再実装してください。 IIRC Beyerにはhis websiteの実装があります。MatLab向けに書かれています。

関連する問題