差分進化を使用して、関数関数f(x)= -x(x + 1)の最大値を-500から500まで見つける方法を教えてください。私はチェスプログラムのためにこれを必要としています。私はDifferential Evolutionの研究を始めましたが、プログラムの使用だけでなく、理解するのが非常に難しいと感じています。誰も私をアルゴリズムに簡単な方法で紹介し、おそらくそのようなプログラムの疑似コードの例を与えて助けてくれますか?差分進化を使用した関数値
答えて
まず、遅れて申し訳ありません。
私はあなたが最大にしようとしている関数の導関数を知りませんので、Differential Evolutionアルゴリズムを使用し、Newton-Raphsonメソッドのようなものではないと思っています。
私は、Differential Evolutionを簡単な方法で説明する大きなリンクを見つけました:http://web.as.uky.edu/statistics/users/viele/sta705s06/diffev.pdf。最初のページ
、アルゴリズムの説明のセクションがある:
点の各世代はそれぞれにおけるJ用語と、n個の点から成るう。
サイズj
の配列を初期化します。別のランダムx値のj
を-500 to 500
から追加してください。これは現在検討中です。理想的には、最大値がどこにあるのか知っていれば、x
値がそこにある可能性が高くなります。各jについて
、ランダムX (M)点の集合から一様に2点YJ、1及びYJ、2を選択し 。 候補点cj = x (m) j +α(yj、1 - yj、2)を作成します。基本的に2つのyの値は、 ランダムな方向と距離を選択することを含み、そのランダムな値を の方向と距離(αでスケール)を現在の値に加算することによって候補が見つかります。
hmmm ...これはもう少し複雑です。最後のステップで行った配列を繰り返します。 x
値ごとに、2つのランダムインデックス(yj1
およびyj2
)を選択します。候補のx
の値をcx = α(yj1 − yj2)
とし、α
を選択します。さまざまなアルファ値を試してみることができます。
どちらが大きいかを確認するには、候補値またはx値をj
に設定します。候補値が大きい場合は、x
の値をj
に置き換えます。
アレイのすべての値が多かれ少なかれ類似するまで、これを実行します。 Tahdahの場合、配列の値のいずれかが最大値になります。ランダム性を減らすために(またはこれは重要ではないかもしれません....)、それらをすべて一緒に平均化します。
about
メソッドを厳密に作成するほど、近似は良くなりますが、時間がかかることになります。
例えば、Math.abs(a - b) <= alpha /10
の代わりに、私はMath.abs(a - b) <= alpha /10000
を使って、より良い近似を得るでしょう。
適切な値の近似値が得られます。
コーディングハッピー!私はこの応答のために書いた
コード:
public class DifferentialEvolution {
public static final double alpha = 0.001;
public static double evaluate(double x) {
return -x*(x+1);
}
public static double max(int N) { // N is initial array size.
double[] xs = new double[N];
for(int j = 0; j < N; j++) {
xs[j] = Math.random()*1000.0 - 500.0; // Number from -500 to 500.
}
boolean done = false;
while(!done) {
for(int j = 0; j < N; j++) {
double yj1 = xs[(int)(Math.random()*N)]; // This might include xs[j], but that shouldn't be a problem.
double yj2 = xs[(int)(Math.random()*N)]; // It will only slow things down a bit.
double cj = xs[j] + alpha*(yj1-yj2);
if(evaluate(cj) > evaluate(xs[j])) {
xs[j] = cj;
}
}
double average = average(xs); // Edited
done = true;
for(int j = 0; j < N; j++) { // Edited
if(!about(xs[j], average)) { // Edited
done = false;
break;
}
}
}
return average(xs);
}
public static double average(double[] values) {
double sum = 0;
for(int i = 0; i < values.length; i++) {
sum += values[i];
}
return sum/values.length;
}
public static boolean about(double a, double b) {
if(Math.abs(a - b) <= alpha /10000) { // This should work.
return true;
}
return false;
}
public static void main(String[] args) {
long t = System.currentTimeMillis();
System.out.println(max(3));
System.out.println("Time (Milliseconds): " + (System.currentTimeMillis() - t));
}
}
あなたがこれを読んだ後ご不明な点がございましたら、コメントでそれらをお気軽に。私は助けるために全力を尽くします。
ありがとう!この返答は概念を非常にうまく説明し、私の理解をさらに深めるためのコードを見ることができました。私はニュートン・ラフソン法の研究にも留意します。詳細なウォークスルーにより、問題の解決方法を簡単に理解することができました。 – n0shadow
@ProgramFunこのプログラムにはバグがある可能性があります。配列の値がすべて似ているかどうかを調べるときは、 "類似性の推移的プロパティ"を使用します。そのようなものは存在しません。私はプログラムを編集して、それが生成する価値の精度に追加します。 – eboix
これに気づき、より良い作業プログラムを理解するのを手伝ってくれてありがとう。 – n0shadow
- 1. REST APIを使用したDropbox差分/差分アップロード
- 2. Javascriptを使用した分数の差を計算する
- 3. 数値積分誤差
- 4. AESCryptoを使用して差分整数値1と2を復号化します
- 5. Pythonを使用した関数の差異の発見
- 6. R関数を使用したときの長さの差異
- 7. ステップ関数を使用した目的関数の最適化
- 8. lsqnonlinを使用してすべての反復中に関数値の進化をプロットする
- 9. Pythonを使用した正規化相互相関を使用した視差マップ
- 10. 線分の交差、数値的に安定したテスト
- 11. カント使用サクセス誤差関数で$ .when()
- 12. Pythonの微分進化を使用するパラメータの制約
- 13. 対称差分の再帰関数
- 14. 10進数を2進数に変換するC#関数を使用する
- 15. 最高値/最大値でグループ化して差分を計算します
- 16. SQLで差異またはSoundex関数を使用する
- 17. SQLコードをカプセル化するインラインテーブル値関数を使用したパフォーマンス
- 18. XML差分:XSLTを使用してXML差分を生成する方法は?
- 19. 配列引数を使用した関数の特殊化
- 20. 月数PowerBIの数値データを使用した増分
- 21. キャストを使用したときの正値と左値の差
- 22. javascriptを使った値の(半)指数関数的変化
- 23. MATLABモールスコード差分関数と検索関数
- 24. ダイナミックアレイを使用したC++のフォワード差分テーブル
- 25. Sign自分自身のRSAパラメータを16進数で符号化した文書
- 26. 0x00から0x11への変数値の増分値(16進数)
- 27. "返り値付き関数"と "返り値なし関数"の差
- 28. 2進数の変更> Forループを使用した10進数
- 29. 関数の戻り値の差
- 30. Sympy:数値の被積分関数として記号式を使用する
なぜ私は差分進化を使いたいのか分かりません。一次導関数が '-2x - 1'であることを知っているので、そのような重要な点を見つけることができます。次に、2次導関数 '-2'を評価することができます。これは' -2'になります。これは、グラフが凹型になっていることを意味します。これは、重要なポイントが最大値であることを意味します。あなたの最大値は '0 = -2x - 1'、または' x = -1/2'です。 – eboix
私はあなたのアバターアイコンが好きです。 – eboix
私はどちらも理解できませんが、私のグループリーダー(これはたくさんの友人が楽しいことをしているプロジェクトです)は、Differential Evolutionを使用して答えに到達したいと考えています。この方法を使ってこれをどうやって行うことができますか教えてください。ありがとう。編集:アバターについてのおかげで:D – n0shadow