如何在数组中使用运算符进行操作


how to use operators in an array for operations

我意识到在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,这一切都很好。然而,我现在需要实际"计算"染色体,然而,由于加法运算符必须在数组中的引号中,因此它会生成一个文字+,而不是运算符。我的问题是,有没有任何方法可以让数组中的运算符成为实际的运算符,我知道函数会这样做,我唯一能想到的其他选择是在我进行计算时将基因硬编码到运算符,这是我试图避免的。

如果需要的话,我会发布整个代码,它并不敏感,只是试图简化我进入神经网络的方式,并认为我会从实现遗传算法开始。有人有解决方案吗?

$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;

你和我一样思考。

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

如果这是Perl,那么可能会使数字函数产生附加结果。

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

看看eval。但要小心。

示例:

$value1 = 6;
$value2 = 3;
$operand = "-";
//$result will be 3
$result = eval("return (" . $value1 . $operand . $value2 . ");");