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

时间:2013-07-30 21:06:23

标签: php arrays operators genetic-algorithm

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

如果需要,我会发布整个代码,它没有什么敏感,只是试图缓解我的方式进入神经网络,并认为我将开始实施遗传算法。有人有解决方案吗?

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

你像我一样思考。

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

如果这是Perl,则可能会使数字函数结果另外成为。

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

答案 2 :(得分:0)

看看eval。但要小心。

示例:

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