記事"遺伝的アルゴリズム - とても簡単です!"についてのディスカッション - ページ 8

 
joo:

1)ストーリーテラー?うーん、残念ながらユーモアは理解できませんでした。データベースのチェックは、GetFitness(historyHromosomes) から呼び出される CheckHistoryChromosomes(chromos,historyHromosomes )という 関数で行われます。FFの繰り返し実行はありません。

2)データベースとの照合は遺伝子ごとに行われる。また、各遺伝子は新しい染色体が現れるとSelectInDiscreteSpace(temp,RangeMinimum,RangeMaximum,Precision,3) によって正規化される。ですから、ここでも「おとぎ話」はありません。

3) 2)を参照

1,2,3) わかった。ほぼ。正規化は本当にある。 しかし、「ギャップなしで」実数を等しく比較する理由にはまだならない。:)

SelectInDiscreteSpace()は少し手直ししました。内部的にStepを修正しているのが気に食わなかった。ユーザーを修正するのは王道ではない。少なくとも今回は違う。

遺伝子の変化範囲に関してStepを「不合理」にするために、ユーザーは合理的な考慮をしているかもしれない。

それはこうだ:

double SelectInDiscreteSpace
(
double In, 
double InMin, 
double InMax, 
double step, 
int    RoundMode
)
{
  if (step==0.0)
    return(In);
  // 境界線が正しいことを確認する
  if ( InMax < InMin )
  {
    double temp = InMax; InMax = InMin; InMin = temp;
  }
  // 違反した場合、違反した境界を返す。
  if ( In < InMin ) return( InMin );
// if ( In > InMax ) return( InMax );// そして最後にこうする。, всё равно придётся
  if ( InMax == InMin || step <= 0.0 ) return( InMin );
  // 与えられた尺度に合わせる
// step = (InMax - InMin) / MathCeil ( (InMax - InMin) / step ); // いや、"所定のスケール "には持っていかない。
  switch ( RoundMode )
  {
  case 1:  In = ( InMin + step * MathFloor ( ( In - InMin ) / step ) );
  case 2:  In = ( InMin + step * MathCeil  ( ( In - InMin ) / step ) );
  default: In = ( InMin + step * MathRound ( ( In - InMin ) / step ) );
  }
  return fmin(In,InMax);
}
 
MetaDriver:

SelectInDiscreteSpace()を少し修正しました。内部でステップを修正するのが気に入らない。ユーザーを修正するのは王様の仕事ではない。少なくとも今回は違う。

遺伝子の変化範囲に関してStepを "不合理 "にする合理的な考慮がユーザーにはあるかもしれない。

これを理解せよ:

というのも、入力された数値のどちら側から数値行の値を "つかむ "かという問題がすぐに生じるからである(何が "右 "なのか、右なのか、左なのかはわからない)。だからこのようにする必要があるのだ:

step = (InMax - InMin) / MathCeil ( (InMax - InMin) / step );

以下は、あなたのコードと私のコードの結果の比較例です:



結果


あなたの
2,2 2 2
インミン 2
InMAX 3
ステップ 0,8






結果


私の あなたの
2,8 3 2,8
インミン 2
InMAX 3
ステップ 0,8






結果


私の あなたの
2,2 2,25 2,3
インミン 2
InMAX 3
ステップ 0,3
 
このような正規化の意味は NormalizeDouble()とは異なるが、それを好まないオーナーは、SelectInDiscreteSpace()のように指定されたステップではなく、必要な符号に正規化を使用することができます次第です。
 
joo:
このような正規化の意味は NormalizeDouble()とは異なりますが、それを好まない所有者は、SelectInDiscreteSpace()のように指定されたステップではなく、必要な符号に正規化を使用することができます次第です。

前の投稿と同じように、すべてクリアです。

Andrei、リストされたすべての変形はここに存在する権利がある。もちろんあなたのものも。最適化中に離散性を変更するフローティングは、細心の注意を払う必要があります。

--

一般的にすべてについて:

設定や遺伝的演算子のライブラリなどを追加すべきだし、便利な拡張や使い方をあらかじめ考えておくべきだ。

私は、すべてをオブジェクトに書き換えて、プログラムとユーザーの両方により強力なインターフェイス(グラフィカルで、タブで多くの設定ができる)を作ろうと考えている。追加するものもあれば、共同最適化するものもある。

より正確には、あなたのコードをベースにするか(フラグメントを使うか)、全部書き直すか、まだ考え中です。

もし参加したいのであれば、個人的に書いて ほしい。

公開するかどうかはわからない。いずれわかる。今のところ、僕は自分のためにやりたいんだ。

 
MetaDriver:

全般的に

1)良い意味で、カスタマイズや遺伝演算子のライブラリなどを追加し、便利な拡張性や使い方を事前に考えておく必要がある。

2) より正確には、あなたのコードをベースにするか(フラグメントを使うか)、もう一度書き直すか、まだ考え中です。

3) もし参加したいのであれば、プライベートで書いて ください。

1) 逆に、コントロールの柔軟性を下げることなく、UGAパラメータの数を減らそうとしています。

2) 記事のコードをそのままプロジェクトで使っている人、0から書き直した人を何人か知っている。

3) プライベート・メッセージであなたに書きました。

 
MetaDriver:

これは前の記事と同じで、すべて理解できる。

アンドレイ、ここに挙げた選択肢はすべて存在する権利がある。もちろん、あなたのものも。最適化の過程で変化する浮動離散性には細心の注意が必要だ。

--

一般的なすべてについて:

設定や遺伝的演算子のライブラリなどを追加すべきだし、便利な拡張や使い方をあらかじめ考えておくべきだ。

私は、すべてをオブジェクトに書き換えて、プログラムとユーザーの両方により強力なインターフェイスを作ろうと考えている(グラフィカルで、タブで多くの設定ができる)。追加するものもあれば、共同最適化するものもある。

より正確には、あなたのコードをベースにするか(フラグメントを使うか)、もう一度全部書き直すか、まだ考えているところです。

...

ウラジミール、君は乗りたいのか走りたいのか?

美しいコードが欲しいのか、それともテスターのものよりもクールなGAを作りたいのか?

個人的にはテスターのものはとてもクールだと思うが、パラメータが少ない。

 
Urain:

ウラジミール、乗りたいのか、運転したいのか?

美しいコードが欲しいのか、それともテスターのものよりクールなGAを作りたいのか?

個人的には、テスターのものはかなりクールだと思う。たった一つのニュアンスだけではパラメータが足りない。

私は便利なコードが欲しい。使いやすく、拡張しやすく、修正しやすく、埋め込みやすい。

 
MetaDriver:

便利なコードが欲しい。使いやすく、拡張しやすく、変更しやすく、埋め込みやすい。

次に、GAのオブジェクトモデルを記述する。記述されたモデルに従って空のクラスを作り、そこにコードを詰め、相互作用を規定する。
 

175行目を

        NormalizeDouble((double)SumOfCurrentEpoch/MathMax(1,(double)resetCounterFF),2),

これがないと、ジョブ・レポートはエラーで失敗します。

 
Rich:

175行目を

これがないと、操作報告はエラーで失敗します。

そうです、gen.演算子ループの最初の実行から所定のエポック数の間、改善がなかった場合、0による除算エラーが発生します。

初期化時にすぐにresetCounterFF 変数に 1 を代入するのが最も単純で、論理的に正しいです:

int    resetCounterFF   =1;// 「改善されないエポック」リセット・カウンター