如何在阵列中使用操作符进行操作
我意识到数组不是以这种方式在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 . ");");
$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;
+用于使用'str_split()'。我们确定中间元素是*运算符*吗? –
+1中间元素必须是操作者否则染色体应该变小适应度 – bitWorking
如果染色体具有OP所指示的结构,并且可以保证在染色体中总会有一个操作员作为中间基因:还有一个潜力除以零的可能性以及 –
你觉得像我这样做。
在PHP中,不,你不能把操作符当作数据(没有eval)。如果你在LISP中再次尝试,你会有不同的故事。
由于所有的操作符都大于0x09,因此很容易检测到它们。如果你把它们写成函数指针,而不是一段文字,你可以通过is_callable()检测,然后执行它们,将其他项目作为数据传递。这不是硬编码不管你放在函数中都可以运行。如果您不关心性能,则可以通过create_function()动态创建函数。
作为最后一个选项,您可以使用eval()例如eval()包含所有三个基因的文本缓冲区。你在做什么没有用户输入,所以正常的安全建议不适用。
如果这是Perl,可能会使数字函数的结果增加。
你有没有想过用十进制或十六进制编写你的初始基因?这会更容易阅读。当你这样做时,你需要使用位掩码来将正确的半字节拉出来。
为什么downvote?这肯定会起作用(尽管@tobiaskun您的链接是德国网站) – sgroves
@sgroves:我也问过我自己。 Thx与德国的链接虽然。 –
因为它是最简单的语法(imo),所以适合顺利使用。 – Halter