アルゴリズムの最適化 - ページ 5 12345678910 新しいコメント TheXpert 2012.05.21 12:10 #41 Mathemat: 原則的には、そうです。しかし、それでもO(n)以上にはならない。 想像力を働かせれば、指数関数的に 変化させることができます。) Vasiliy Sokolov 2012.05.21 12:11 #42 Mathemat:まあ、これは最適化問題ではないんですけどね。極限値を求めるのは常にO(n)のオーダーを持つ問題であり、nはデータ数である。この漸近的な悪化は、どうすればいいのか......私にはわからない。最も単純なアルゴリズムはArraySort()で、これは組み込みで十分高速ですが、この問題ではおそらく冗長です。より高速な再帰的なものを思いつくことができるだろう。最小値を求めるには、何本分の時間がかかりますか?最初の投稿で統計を出しました。1,000,000本の計算では、周期が長くなるにつれて算術的に増加します。つまり、期間3では0.54秒、期間51では0.94秒、期間99では1.59秒の計算時間がかかる。これは、ループの中のループを使うので、エラーになり、最悪です。つまり、期間3では、1 000 000 * (3-1/2) = 1 000 000、期間99では、1 000 000 * (99-1)/2 = 49 000 000となるのです!したがって、周期が長くなっても反復回数が質的に増加しないようにアルゴリズムを書き換える必要がある。これは純粋な最適化問題である。これが今、私がやっていることです。これまで私はこう書いてきました。static void Up(Bars MyQuotes) { BitArray bits = new BitArray(MyQuotes.Count); double max = double.MinValue; int pperiod = (23 - 1) / 2; int bar = pperiod; int count = MyQuotes.Count - pperiod; //последняя позиция второго перебора. int pos = bar; while (bar < count) { for (int i = 1; i <= pperiod; i++) { max = MyQuotes.High[bar - i] > MyQuotes.High[bar + i] ? MyQuotes.High[bar - i] : MyQuotes.High[bar + i]; pos = bar + i; if(max > MyQuotes.High[bar]) { //Начинаем с последнего бара bar = pos; break; } if(i == pperiod) { bits[bar + i] = true; bar = pos; } } } }最小値を探索するために、対応する関数Down()が並列スレッドで起動されます。両方の関数が終了すると、その結果が一般リストに書き込まれます。こんな感じです。 Sceptic Philozoff 2012.05.21 12:15 #43 C-4: 最初の投稿で統計を出しました。1,000,000本の計算では、周期が長くなるにつれて算術的に大きくなっていく。つまり、期間3では0.54秒、期間51では0.94秒、期間99ではすでに1.59秒の計算時間がかかっている。ほらね、勘違いしてる。リッチプログレッションの総和ではないんですよ、C-4は。和は二次関数的に増大する。OCLは曖昧さがない。 Vasiliy Sokolov 2012.05.21 12:18 #44 Mathemat:最も単純なアルゴリズムはArraySort()で、O(n * ln( n ) )程度の速度で組み込まれています。 しかし、この問題ではおそらく冗長でしょう。想い。ソートすると、forで配列全体を処理するよりも本質的に遅くなります。1回の繰り返しで、arraysortはせいぜいn個のサブウィンドウの値を並べ替える程度で、それだけで数十回の動作を意味する。いいえ、それでも繰り返し回数の合計が、バーの数と 質的に同じになることを目指すべきでしょう。 Документация по MQL5: Доступ к таймсериям и индикаторам / Bars www.mql5.com Доступ к таймсериям и индикаторам / Bars - Документация по MQL5 Vasiliy Sokolov 2012.05.21 12:21 #45 Mathemat:ほらね、勘違いしてる。リッチプログレッションの総和ではないんですよ、C-4は。和は二次関数的に増大する。OCLは曖昧さがない。 2次関数なら、なおさらだ。マルチスレッドがなければ、私の理解では、どうしようもない。 hrenfx 2012.05.21 12:40 #46 そんな極限探索の 条件は、はっきり言っておかしい...。しかし、それでもブルートフォースサーチの手法を使うのは極めて不合理です。ExtDepth = nのワンパス・クラシックZigZagがすぐに思い浮かびますが、現状では少し調整する必要があります。ここでは、OCLは100%不要です。 TheXpert 2012.05.21 12:45 #47 あなたたちは燃えています。3人ともね Vasiliy Sokolov 2012.05.21 13:00 #48 hrenfx:そんな極限探索の条件は、はっきり言っておかしい...。しかし、それでもブルートフォースサーチの手法を使うのは極めて不合理です。ExtDepth=nのワンパス・クラシック・ジグザグは、現状を少し調整することですぐに思いつきます。ここでは、OCLは100%不要です。 まあ、原理的には、ラ・ジグザグにはこの極値が必要なんですけどね。では、どのアルゴリズムを使うのが良いのでしょうか?第2回で引用したコードより効率的なコードはありますか? hrenfx 2012.05.21 13:06 #49 CodeBase MT4 - O(N)のシングルパスジグザグを確認してください。 Sceptic Philozoff 2012.05.21 23:41 #50 TheXpert: あなたたちは燃えています。3人ともねなぜ?O(n)はどう考えても残っているでしょう。どうしてもダメなら、OCLを試してみてください。5のDL型変態がなければ、他の方法はない。 12345678910 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
原則的には、そうです。しかし、それでもO(n)以上にはならない。
まあ、これは最適化問題ではないんですけどね。
極限値を求めるのは常にO(n)のオーダーを持つ問題であり、nはデータ数である。この漸近的な悪化は、どうすればいいのか......私にはわからない。
最も単純なアルゴリズムはArraySort()で、これは組み込みで十分高速ですが、この問題ではおそらく冗長です。
より高速な再帰的なものを思いつくことができるだろう。
最小値を求めるには、何本分の時間がかかりますか?
最初の投稿で統計を出しました。1,000,000本の計算では、周期が長くなるにつれて算術的に増加します。つまり、期間3では0.54秒、期間51では0.94秒、期間99では1.59秒の計算時間がかかる。
これは、ループの中のループを使うので、エラーになり、最悪です。つまり、期間3では、1 000 000 * (3-1/2) = 1 000 000、期間99では、1 000 000 * (99-1)/2 = 49 000 000となるのです!したがって、周期が長くなっても反復回数が質的に増加しないようにアルゴリズムを書き換える必要がある。これは純粋な最適化問題である。これが今、私がやっていることです。これまで私はこう書いてきました。
最小値を探索するために、対応する関数Down()が並列スレッドで起動されます。両方の関数が終了すると、その結果が一般リストに書き込まれます。こんな感じです。
ほらね、勘違いしてる。リッチプログレッションの総和ではないんですよ、C-4は。和は二次関数的に増大する。
OCLは曖昧さがない。
最も単純なアルゴリズムはArraySort()で、O(n * ln( n ) )程度の速度で組み込まれています。 しかし、この問題ではおそらく冗長でしょう。
想い。ソートすると、forで配列全体を処理するよりも本質的に遅くなります。1回の繰り返しで、arraysortはせいぜいn個のサブウィンドウの値を並べ替える程度で、それだけで数十回の動作を意味する。
いいえ、それでも繰り返し回数の合計が、バーの数と 質的に同じになることを目指すべきでしょう。
ほらね、勘違いしてる。リッチプログレッションの総和ではないんですよ、C-4は。和は二次関数的に増大する。
OCLは曖昧さがない。
そんな極限探索の 条件は、はっきり言っておかしい...。しかし、それでもブルートフォースサーチの手法を使うのは極めて不合理です。
ExtDepth = nのワンパス・クラシックZigZagがすぐに思い浮かびますが、現状では少し調整する必要があります。ここでは、OCLは100%不要です。
そんな極限探索の条件は、はっきり言っておかしい...。しかし、それでもブルートフォースサーチの手法を使うのは極めて不合理です。
ExtDepth=nのワンパス・クラシック・ジグザグは、現状を少し調整することですぐに思いつきます。ここでは、OCLは100%不要です。
なぜ?O(n)はどう考えても残っているでしょう。
どうしてもダメなら、OCLを試してみてください。5のDL型変態がなければ、他の方法はない。