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

 
Andrey Dik:

*.exライブラリは、基本的にアルゴリズムにアクセスするための統一された方法である必要があります。この標準ライブラリにアルゴリズムを埋め込むこともできるし、このライブラリから独自の関数でアルゴリズムを呼び出すこともできる。

そして、どの機能を参加者に与えるか?参加者が渡したり、何かを渡したりするのでしょうか?言葉遊び、意味不明です。

参加者には、調査する機能(ff)を教えてください。最大値や最小値を求めることになるもの。彼の検索アルゴリズムは、もちろん彼のライブラリーにあることでしょう。

つまり、関数そのものを与える(コードを送る)のではなく、選手権中に何とかして出場者のコードに渡すのです。

 

であり、FFアルゴリズムは与える必要がない。

スクリプトは、インポートによって ライブラリから最適化可能なパラメータの配列を要求します。

スクリプトはこの配列をFFライブラリに送り、FFライブラリはその結果を返します。

スクリプトは結果をメンバーライブラリに送信する

は、スクリプトがメンバーライブラリのサービス関数を呼び出すと、必要に応じて、アルゴリズムが何かを行うか、その内部が空の関数になっています。

携帯から書き込んでいます、すみません

 
Andrey Dik:

であり、FFアルゴリズムは与える必要がない。

スクリプトは、インポートによってライブラリから最適化可能なパラメータの配列を要求します。

スクリプトはこの配列をFFライブラリに送り、FFライブラリはその結果を返します。

スクリプトは結果をメンバーライブラリに送信する

は、スクリプトがメンバーライブラリのサービス関数を呼び出すと、必要に応じて、アルゴリズムが何かを行うか、その内部が空の関数になっています。

携帯から書き込んでいます、すみません

はっきりしないんです。コードでの例を待つことにします。
 

部分的に明らかであるが、jo)を介してであることは具体的に明らかである。)

メンバ関数が呼ば れたとき、その関数は1ステップの仕事をしなければならないことがわかった。すべてをひっくり返すことが必要なのです。考える気が起きない。ただでさえ複雑な作業に、さらに人為的な複雑さを加えなければならないわけです。

その方法としては2つ考えられます。

1.上に書いたような、fsを使ったクラス。

2.参加者が自分のライブラリにffでライブラリをインポートする。チェッカーはそれを自分のものに置き換える。

それ以外の選択肢はない。もし可能であれば、関数へのポインタを渡すことができれば別ですが(しかし、今のところ誰もヘルプのどこを見ればいいのか提案してくれません)。参加者は、ff関数を呼び出す能力が完全にあること。

 

という感じで、もちろん計時カウンターもあります。

#import "oa.ex5" // алгоритм оптимизации участника
void   ServiceFunc1 (); 
int    GetReplaysCount (); // запрос количества запусков ФФ (у участника может быть свой размер колонии или нечто подобное если это не ГА 
void   GetOptParam (double &param []); 
void   ServiceFunc2 (); 
bool   StopAlgo ();        // этой функцией участник по желанию может остановить оптимизацию
int    GetEpochCount ();   // если участник желает использовать своё фиксированное значение "эпох"
void   SendFFvolue (double &volue); 
double GetMaxFF (); 
#import

#import "ff.ex5" // тестовая фитнес функция чемпионата, не известна участникам 
double GetFFvolue (double &param []); // передаём в ФФ оптимизируемые параметры, получаем результат ФФ 
#import

void OnStart () 
{ 
  bool   stopAlgo = false; 
  int    epoch = GetEpochCount (); 
  int    maxEpochPossible = 1000; 
  double param []; 
  double volue; 
  int    epochCNT = 0; 
  int    ffCNT = 0; 
  
  double FFvolue = -DBL_MAX; 
  
  ServiceFunc1 (); 
  while(!stopAlgo) 
  {
    for(int i = 0; i < GetReplaysCount (); i++) 
    {
      GetOptParam (param); 
      volue = GetFFvolue (param); 
      ffCNT++; 
      SendFFvolue (volue);
    }
    ServiceFunc2 (); 
    
    epochCNT++; 
    
    if(epochCNT >= epoch) 
      stopAlgo = true; 
    
    if(epochCNT >= maxEpochPossible) 
      stopAlgo = true;
  }
  
  Print ("Epoch: " + (string)epochCNT + " ; FF starts: " + (string)ffCNT + " ; MaxFF: " + (string)GetMaxFF ());
} 
 
Dmitry Fedoseev:

参加者は、ff関数を呼び出す完全な能力を持っている必要があります。

いや、そうではないはずだ。そして、そうすべきではないとすれば、内蔵テスターでEAの内部最適化を使うかもしれませんし、そうであれば、トレーダーにとって実用性はほとんどないことになりますから。

私の記事では、アルゴリズムからFFが呼び出される例を示しています。そのため、応用範囲が狭くなってしまいます。記事からアルゴリズムを取ると(ルール上禁止されているわけではありませんが)、このようなFFの内部通話を解消するためには知恵を絞る必要があります。

 
Andrey Dik:

という感じで、もちろん計時カウンターもあります。

いや、よくないな))そんなアプローチ。参加者はサイクルを回すことができるはずです。つまり、参加者の1つの行動が、複数のFIFSへの呼び出しを意味するのです。
 
Andrey Dik:
いや、そうではないはずだ。また、そうでなければ、内蔵テスターでEAの内部最適化を利用することができますし、そうでなければ、トレーダーにとって実用性はほとんどないでしょうから。
上に並べたユニバーサルメソッドを見てください。また、仲介業者を通じてのワンタイム・コールであれば、それこそEAを通じて脳みそを引っ張り出してきて、検索機能を設置しなければならないので、非常にシビアな適応が必要になり、誰もやらないでしょう。
 
Dmitry Fedoseev:
いや、うまくいかない))そんなアプローチ。参加者はサイクルを回すことができるはずです。つまり、参加者の1つのアクションは、ffsへの複数の呼び出しを意味します。
申し訳ございませんが、サイクルは外部で制御することになります。すべては公平に:)
 
Andrey Dik:
申し訳ございませんが、サイクルは外部で制御することになります。正々堂々としている。:)
いいえ、ff関数が呼び出しをカウントする必要があります。