如何在阵列中使用操作符进行操作

问题描述:

我意识到数组不是以这种方式在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这一切都很好。然而,我处于需要实际“计算”染色体的位置,但由于加法运算符必须在数组中引号,因此它会生成一个文字+而不是运算符。我的问题是,是否有任何方法可以让我的阵列中的操作员成为实际的操作员,我知道将执行此操作的已知函数,而我能想出的唯一其他选项是将基因硬编码为操作员当我做计算时,这就是我试图避免的。

如果需要的话我会后整个代码,这没有什么敏感的,只是想给我的方式轻松进入神经网络和想我会与执行遗传算法开始。任何人都有解决方案?

看看eval。但要小心。

例子:

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

为什么downvote?这肯定会起作用(尽管@tobiaskun您的链接是德国网站) – sgroves

+0

@sgroves:我也问过我自己。 Thx与德国的链接虽然。 –

+0

因为它是最简单的语法(imo),所以适合顺利使用。 – Halter

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

+用于使用'str_split()'。我们确定中间元素是*运算符*吗? –

+0

+1中间元素必须是操作者否则染色体应该变小适应度 – bitWorking

+0

如果染色体具有OP所指示的结构,并且可以保证在染色体中总会有一个操作员作为中间基因:还有一个潜力除以零的可能性以及 –

你觉得像我这样做。

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

如果这是Perl,可能会使数字函数的结果增加。

你有没有想过用十进制或十六进制编写你的初始基因?这会更容易阅读。当你这样做时,你需要使用位掩码来将正确的半字节拉出来。