アルゴリズム最適化選手権。 - ページ 52

 

なぜ2番目の例でインポート するのか?

//+------------------------------------------------------------------+
// тестовая фитнес функция чемпионата, не известна участникам
#import "\\Projects\\OAC\\lib\\ff.ex5"
// запросить количество параметров ФФ 
int    GetParamCountFF (); 
// запуск ФФ, получеие значения соответствующее параметроам ФФ
double FF (double &array []); 
// произведённое количество запусков ФФ
int    GetCountRunsFF (); 
#import
 
Dmitry Fedoseev:

まあ、それも書けるのですが......私の質問のどこが不明瞭なのでしょう?

どちらかというと、わかっていらっしゃるからこその暴論でしたね。

ドミトリー・フェドセーエフ
なぜ1つの質問を10回もしなければならないのですか?

難しい問題ですね、私もよく同じことを考えます(笑)。

ドミトリー・フェドセーエフ

なぜ2つ目の例ではimportが必要なのでしょうか?

スクリプトからアルゴリズムを制御するために、アルゴリズムが実際に何回FFを呼び出したか。

しかし、2つ目の方法では、スクリプトからFFライブラリにアクセスする機能が必要な理由は、それが見えないからです。

 

さて、このテーマで「新参者」であり、本気で勝てるとは思っていない参加者の 皆さんに申し上げたいことがあります。

問題を混乱させる多次元空間に関する非常識な「理論」をすべて捨てて、純粋な数学に立ち返ると、FFは方程式 であることがわかる。

この式は、グラフに適用して初めて 解析的な関数となる。

グラフは、方程式のパラメータ間の関係を視覚化するのに役立つだけです。

158ページにも及ぶ議論を経て、すでに問題の本質が形作られているのです。

方程式の 左辺にある変数の値が 最大となる 右辺の変数の 値を求める必要が ある。

完全なブルートフォースよりも効率的に行おうとするのが目的です。

それだけです。

次のページ

この問題を解決するために、値を見つける「進化型」の技術が考案された。ダーウィニズムに由来するアナロジーとメソッドを構築した。

この方法の効率性については議論の余地がある。おそらく、もっとシンプルで効果的な解決方法があるのでしょう。

私の実践は、一般的に受け入れられているアプローチが必ずしも最も効果的でないことを証明しています。

進化論者」はかなり回避できると思うのですが...。

ぜひ挑戦してみましょう。

 

FFを呼び出す第2バリエーションの参加者のアルゴリズムの一例。

#property library
#property strict

//+------------------------------------------------------------------+
// тестовая фитнес функция чемпионата, не известна участникам
#import "\\Projects\\OAC\\lib\\ff.ex5"
// запросить количество параметров ФФ 
int    GetParamCountFF (); 
// запуск ФФ, получеие значения соответствующее параметроам ФФ
double FF (double &array []); 
// произведённое количество запусков ФФ
int    GetCountRunsFF (); 
#import
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
void InitAO (int paramCount, int maxFFruns) export
{
  params = paramCount;
  maxFFrunsPossible = maxFFruns;
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
void StartAlgo () export
{
  double param []; 
  ArrayResize (param, params);
  double ffVolue = 0.0; 
  
  //------------------------------------------------------------------
  for(int i=0; i< maxFFrunsPossible; i++) 
  {
    GenerateParam (param);
    ffVolue = FF(param);
    if(ffVolue > maxFFvolue) 
      maxFFvolue = ffVolue;
  }
  //------------------------------------------------------------------
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
double GetMaxFF () export
{
  return(maxFFvolue);
}
//+------------------------------------------------------------------+

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Все функции выше этой строки - обязательны! Именно они будут импортированы 
// и использованы тестовым скриптом. Они нужны для доступа к алгоритму оптимизации.
// Содержимое - произвольное, на усмотрение участника
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!



//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Ниже этой строки пример алгоритма оптимизации участника
//————————————————————————————————————————————————————————————————————
int    params     = 0;
int    maxFFrunsPossible = 0;
double maxFFvolue = - DBL_MAX;
double minParam   = -10.0;
double maxParam   = 10.0;
double stepParam  = 0.1;
//————————————————————————————————————————————————————————————————————

//————————————————————————————————————————————————————————————————————
// Генерация значений оптимизируемых параметров
void GenerateParam (double &param[])
{
  int size = ArraySize (param);
  double paramVolue = 0.0;
  for(int i = 0; i < size; i++) 
  {
    paramVolue = RNDfromCI (minParam, maxParam);
    param [i] = SeInDiSp (paramVolue, minParam, maxParam, stepParam); 
  }
}
//————————————————————————————————————————————————————————————————————

//————————————————————————————————————————————————————————————————————
// Выбор в дискретном пространстве
double SeInDiSp (double in, double inMin, double inMax, double step) 
{ 
  if(in <= inMin) 
    return (inMin); 
  if(in >= inMax) 
    return (inMax); 
  if(step == 0.0) 
    return (in); 
  else 
    return (inMin + step * (double)MathRound ((in - inMin) / step));
}
//————————————————————————————————————————————————————————————————————

//————————————————————————————————————————————————————————————————————
// ГСЧ в заданном интервале
double RNDfromCI (double min, double max) 
{ 
  if(min == max) 
    return (min); 
  double Min, Max; 
  if(min > max) 
  {
    Min = max; 
    Max = min;
  }
  else 
  {
    Min = min; 
    Max = max;
  }
  return (double(Min + ((Max - Min) * (double)MathRand () / 32767.0)));
}
//————————————————————————————————————————————————————————————————————

アルゴリズムの基本的なコードは最初の変形と同じだが、FFをスクリプトからではなくアルゴリズムから呼び出すようにした。

結果は当然ながら、最初のバリエーションと同様である。

2016.06.22 11:47:45.321 OAC variant 2 (GBPUSD,M30) ---------------------------------.

2016.06.22 11:47:45.321 OAC variant 2 (GBPUSD,M30) Time: 135 µs; 0.00013500 c

2016.06.22 11:47:45.321 OAC variant 2 (GBPUSD,M30) FF Runs: 1000

2016.06.22 11:47:45.321 OAC variant 2 (GBPUSD,M30) 最大:2.94159260

2016.06.22 11:47:41.404 OAC variant 2 (GBPUSD,M30) --------------------------------------.

2016.06.22 11:47:41.404 OAC variant 2 (GBPUSD,M30) Time: 136 µs; 0.00013600 c

2016.06.22 11:47:41.404 OAC variant 2 (GBPUSD,M30) FF Runs: 1000

2016.06.22 11:47:41.404 OAC variant 2 (GBPUSD,M30) Max: 3.10159260

2016.06.22 11:47:37.309 OAC variant 2 (GBPUSD,M30) ---------------------------------.

2016.06.22 11:47:37.309 OAC variant 2 (GBPUSD,M30) Time: 133 µs; 0.00013300 c

2016.06.22 11:47:37.309 OAC variant 2 (GBPUSD,M30) FF Runs: 1000

2016.06.22 11:47:37.309 OAC variant 2 (GBPUSD,M30) 最大:3.06159260

2016.06.22 11:47:32.933 OAC variant 2 (GBPUSD,M30) ---------------------------------.

2016.06.22 11:47:32.933 OAC variant 2 (GBPUSD,M30) Time: 133 µs; 0.00013300 c

2016.06.22 11:47:32.933 OAC variant 2 (GBPUSD,M30) FF Runs: 1000

2016.06.22 11:47:32.933 OAC variant 2 (GBPUSD,M30) 最大:3.10159260

2016.06.22 11:47:07.584 OAC variant 2 (GBPUSD,M30) --------------------------------------.

2016.06.22 11:47:07.584 OAC variant 2 (GBPUSD,M30) Time: 180 µs; 0.00018000 c

2016.06.22 11:47:07.584 OAC variant 2 (GBPUSD,M30) FF runs: 1000

2016.06.22 11:47:07.584 OAC variant 2 (GBPUSD,M30) 最大:3.04159260

それはつまり、「全然悪くない」ということです。

 

そこで、上記の例では、参加者のアルゴリズムがインポート機能 によってテストスクリプトに接続される様子を示しています。

なぜこのように参加者のアルゴリズムを扱うのか、それは知的財産を守るために参加者のアルゴリズムを隠す必要がある一方で、審査員と観客の両方によるコントロールと検証を可能にするためであることを思い出してください。

 

今日、テストしてみます。

しかし、(Andrei、あなたが急いでいたことは理解しています)1つの投稿で、ファイルに関する規則をまとめ、まさにこれらのファイルを添付して公開することが望ましいでしょう。今すぐでなくても、スタート地点に立てるように。

 
Реter Konow:

今、私は、このテーマについて「新参者」であり、本気で勝つことを期待していない参加者の皆さんに訴えたいと 思います。

ただでさえ混乱している問題をさらに混乱させる、空間の多次元性に関する非常識な「理論」をすべて捨てて、純粋な数学に立ち返れば、FFは方程式 であることがわかるだろう。

この式は、グラフに適用して初めて 解析的な関数となる。

グラフは、方程式のパラメーターの関係パターンを視覚化するのに役立つだけなのです。

158ページにも及ぶ議論を経て、すでに問題の本質が形作られているのです。

方程式の 左辺にある変数の値が 最大となる 右辺の変数の 値を求める必要が あります。

完全なブルートフォースよりも効率的に行おうとするのが目的です。

それだけです。

次のページ

この問題を解決するために、値を見つける「進化型」の技術が考案された。ダーウィニズムに由来するアナロジーとメソッドを構築した。

この方法の効率性については議論の余地がある。おそらく、もっとシンプルで効果的な解決方法があるのでしょう。

私の実践は、一般的に受け入れられているアプローチが必ずしも最も効果的でないことを証明しています。

進化論者」はかなり回避できると思うのですが...。

ぜひ挑戦してみましょう。

投稿の感情的な色付けを除けば、おっしゃることは基本的に正しいです。ただ一つおろそかにされているのは、与えられた選手権の中ではFF式そのものが未知であることです(人生においては既知であることもあれば、そうでないこともある)。

ノンフィクションの理論」について - 私はこのスレッドで、最適化アルゴリズムの原理について、他のどこにも使われておらず、これまでにも使われていない(少なくとも入手可能な情報源では)明確なヒントを示しました。そして、アルゴリズムに何をどう使うかは、常に研究者次第なのです。上の例では、間接的にでもダーウィンとは何の関係もないアルゴリズムが使われている。最適化手法はいくらでもあるし、誰も、少なくとも私は「ダーウィンに由来する」方が良いとは言っていない。

というわけで、ビギナーズの皆さん、頑張ってください。頑張れ、勝利へ

 
5でコーディングしたことがなく、また、エクスポート/インポート操作の経験もないのです。私があなたの例を正しく理解しているかどうか教えてください。コードにコメントを入れました。もう一つの質問.FFが数式で与えられる場合、除算やルート抽出の操作が行われるのでしょうか。 0や負の値は重大なエラーを引き起こし、プログラムを停止 させます。
// -- данный код находится на стороне жюри (организатора)---------------------
#property library    //EX5-файл будет являться библиотекой
#property strict
int  countRuns    = 0;  // число обращений к ФФ. Фитнес функции это, как я понимаю неизвестная никому функция у которой 500 параметров
 // и нужно найти такие значения параметров при которой значение фф= максимальному 
//+------------------------------------------------------------------+
int GetParamCountFF () export //функция задачи участникам количества параметров фф  модификатор export указывает что функция доступна
// алгоритму участника  
{ 
  return (2);// возвращает количество параметров участнику 2 для данного примера 
  // участник в своём коде прописывает  int NumberParam=GetParamCountFF();
}

double FF (double &array []) export // сама фф 
{ 
  countRuns++;
  int sizeArray = ArraySize (array);//количество элементов массива
  //-------дальше не пойму логику----------------- 
  if(sizeArray != 2) 
    return (-DBL_MAX); 
  return (-(pow (2.4 + array [0], 2.0) + pow (array [1] - 2.3, 2.0))+3.1415926);
 //--------------вероятно нужно так --------------
    if(sizeArray != 2){ // возвращает минимальное double ( или может лучше ошибку)
    // если количество элементов в массиве пользователя не равно заданному)
    return (-DBL_MAX);
    } 
    else{ // возвращает значение функции
  return (-(pow (2.4 + array [0], 2.0) + pow (array [1] - 2.3, 2.0))+3.1415926);
  }
  //------------------------------------------------------------------
}

int GetCountRunsFF () export
{ 
  return (countRuns);// возвращает кол. обращений к фф
}
 
Yuri Evseenkov:
私はAでコーディングしていませんし、エクスポート・インポートの操作の経験もありません。私があなたの例を正しく理解しているかどうか教えてください。コードにコメントを入れました。もう一つの質問.FFが数式で与えられる場合、除算やルート抽出の操作はあるのでしょうか? 0や負の値は重大なエラーを引き起こし、プログラムを停止 させます。

はい、FFチャンピオンシップの仕組みについては、あなたの理解が正しいです。

パラメータ配列のサイズが正しくない場合に結果を返すことについてのみ修正 - 参加者のアルゴリズムはFFパラメータの数について知っており、間違ったサイズの配列をFFに送信した場合、それはFFではなく参加者のアルゴリズムの問題である。この点について、マーケットを例にとって考えてみましょう。マーケットが、あなたがストラテジー・パラメーターの数を「間違って」使っていることを知らせてくれることはなく、あなたはただマイナスの取引結果を得て終わり、あなたの間違いについてマーケットから何の説明も受けることはありません。

Yourという言葉をOurに置き換えても、Youという言葉をWeに置き換えても、何も変わらないし、何も真実に変わりはないのです。

 
Igor Volodin:

今日、テストしてみます。

しかし、(Andrei、あなたが急いでいたことは理解しています)1つの投稿で、ファイルに関する規則をまとめ、まさにこれらのファイルを添付して公開することが望ましいでしょう。今すぐでなくても、スタート地点に立てるように。

おそらく、例題のファイルをアクセス可能なファイルストレージに置いておけば、検索でジャンプすることもなく、ブランチの最初にストレージへのリンクが貼られるので便利なのでしょう。

はい、そうします。