0

我意识到数组不是在 PHP 中以这种方式构建的。但是我是第一次尝试遗传算法,因为 PHP 是我最熟悉的语言,所以我用 PHP 编写它,稍后我将其更改为 Python。无论如何,我有两个输入数组,其中一个是:

$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

3
$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' => '/');

$chromosome = '011010100111';
list($operand1, $operator, $operand2) = str_split($chromosome, 4);

switch($geneValues[$operator]) {
    case '+' : $result = $geneValues[$operand1] + $geneValues[$operand2]; break;
    case '-' : $result = $geneValues[$operand1] - $geneValues[$operand2]; break;
    case '*' : $result = $geneValues[$operand1] * $geneValues[$operand2]; break;
    case '/' : $result = $geneValues[$operand1] / $geneValues[$operand2]; break;
}
echo $result;
于 2013-07-30T21:11:55.317 回答
1

你和我一样想。

在 PHP 中,不,您不能将运算符视为数据(没有 eval)。如果你在 LISP 中再试一次,你会有不同的故事。
由于您的所有运算符都> 0x09,因此很容易检测到它们。如果你把它们写成函数指针;而不是一段文本,您可以通过 is_callable() 检测然后执行它们,将其他项目作为数据传递。这不是硬编码,因为您在函数中放入的任何内容都可以运行。如果您不关心性能,您可以通过 create_function() 动态创建函数。
作为最后一个选项,您可以使用 eval() 例如 eval() 一个包含所有三个基因的文本缓冲区。您正在做的事情没有用户输入,因此正常的安全建议不适用。

如果这是 Perl,可能会使 numbers 函数结果相加。

你有没有想过用十进制或十六进制写出你的初始基因?它会更容易阅读。执行此操作时,您需要使用位掩码来拉出正确的半字节。

于 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 回答