私は単純なレジスタ マシンのバイトコードを進化させる線形遺伝的プログラミング システムに取り組んできました。ターゲット出力が同じキャラクター出力以外のものである場合、解決策を収束させるのに苦労してきました。私が試してきたフィットネス関数が主な問題だと思います。
レジスタ マシンは、最大数の操作にバインドされていることを除けば、ほぼチューリング完全です。その入出力関数は、一度に 1 文字ずつ入力または出力します。私が使用している選択アルゴリズムは、複数のフィットネス関数を処理できるため、バランスを微調整する必要なく、それぞれが同じ選択圧力を発揮します。すべてのフィットネス関数は整数を返しますが、数値が小さいほど優れています。
現在、次の 2 つのフィットネス関数を使用しています。
最初のものは、出力とターゲットを最初からビットごとに比較し、同じではないビットに達すると停止し、残りのビット数のうち長い方を返します。
2 番目のものもビットごとに比較し、異なるビットの総数を返します。
- 編集
いくつかのことを試した後、何が収束を妨げているのかを突き止めました。2 つのフィットネス関数と同様に、プログラムの長さと実行時間もフィットネス関数として使用しています。私が使用している選択アルゴリズムは、それらすべてに同じ選択圧力を与えますが、突然変異は、出力の品質を測定する関数よりも、これらの関数に関して有益である可能性がはるかに高くなります. 解決策は、世代ごとに選択アルゴリズムを 2 回実行することでした。1 回目はプログラムのサイズと実行時間を無視し、余剰プログラムの 90% を削除してから、すべての基準を使用して再度実行し、残りの 10% の余剰を削除します。
現在は非常にゆっくりと収束しているため、フィットネス関数としてより適切に機能する可能性のある文字列比較メトリックがあるかどうかを知りたい.