0

PHP では配列がこのように構築されていないことに気付きました。しかし、私は遺伝的アルゴリズムを初めて試しています。PHP は私にとって最も馴染みのある言語なので、PHP で書いています。後で Python に変更します。とにかく、私は2つの入力配列を持っています。そのうちの1つは次のとおりです。

$geneValues = array(
    '0000' => 0,
    '0001' => 1,
    '0010' => 2,
    '0011' => 3,
    '0100' => 4,
    '0101' => 5,
    '0110' => 6,
    '0111' => 7,
    '1000' => 8,
    '1001' => 9,
    '1010' => '+',
    '1011' => '-',
    '1100' => '*',
    '1101' => '/');

各キーは、値を格納する「遺伝子」です。私はこれを最初の配列設定以外に完全に手放そうとしています。上記の配列遺伝子をランダムに組み合わせて遺伝子をグループ化する多次元配列に初期集団を作成する機能があります。だから私は次のような染色体を持つことができます:011010100111意味=>6 + 7これはすべてうまくいきます。しかし、私は実際に染色体を「計算」する必要があるところにいますが、加算演算子は配列内で引用符で囲む必要があるため、リテラルになります+オペレーターではありません。私の質問は、配列内の演算子を実際の演算子にする方法はありますか、これを行う関数を知っていることを知っています。私が思いつくことができる唯一の他のオプションは、遺伝子をハードコーディングすることです私が計算を行うときの演算子、これは私が避けようとしているものです。

必要に応じてコード全体を投稿します。機密性は高くありません。ニューラル ネットワークへの道を簡単にしようとしているだけで、遺伝的アルゴリズムの実装から始めようと考えました。誰にも解決策がありますか?

4

3 に答える 3

1

あなたは私と同じように考えます。

PHP では、演算子をデータとして (eval なしで) 扱うことはできません。LISP でもう一度試すと、別の話になります。
すべてのオペレーターが > 0x09 であるため、簡単に検出できます。それらを関数ポインターとして記述した場合。テキストの一部ではなく、 is_callable() を介して検出し、それらを実行して、他のアイテムをデータとして渡すことができます。関数に入力したものは何でも実行できるという点で、これはハードコーディングではありません。パフォーマンスを気にしない場合は、create_function() を介して関数を動的に作成できます。最後のオプション
として、eval() を使用できます。たとえば、eval() は 3 つの遺伝子すべてを含むテキスト バッファです。あなたがしていることにはユーザー入力がないため、通常のセキュリティ勧告は適用されません。

これが Perl の場合、数値関数の結果をさらに追加することになるでしょう。

最初の遺伝子を 10 進数または 16 進数で書き出すことを考えたことはありますか? 読みやすくなります。これを行う場合、ビット マスクを使用して正しいニブルを抽出する必要があります。

于 2013-07-30T21:37:03.353 に答える
0

evalを見てください。しかし、それには注意してください。

例:

$value1 = 6;
$value2 = 3;
$operand = "-";
//$result will be 3
$result = eval("return (" . $value1 . $operand . $value2 . ");");
于 2013-07-30T21:10:25.780 に答える