【问题标题】:how to use operators in an array for operations如何使用数组中的运算符进行操作
【发布时间】:2013-07-31 05:05:43
【问题描述】:

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

如果需要,我会发布整个代码,它没有什么敏感的,只是想简化我进入神经网络的方式,并认为我会从实现遗传算法开始。谁有解决办法?

【问题讨论】:

    标签: php arrays operators genetic-algorithm


    【解决方案1】:
    $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()。我们确定中间元素是 operator 吗?
    • +1 中间元素必须是算子,否则染色体应该得到小的适应度
    • 如果染色体具有OP所指示的结构,并且可以保证在染色体中始终有一个算子作为中间基因:还有一个潜在的除以零的可能性
    • 是的,中间元素必须是运算符,否则染色体将不起作用,感谢您指出除以零的问题,我也必须考虑到这一点,不敢相信我没想过使用switch!天才。虽然我可能不得不走 eval 路线以避免硬代码,并且如果用户输入在混合中,eval 似乎只是邪恶的
    • 我假设(可能是错误的)hard code the gene to the operator 意味着实际上将 PHP function 作为数组值:也许@nope 可以澄清
    【解决方案2】:

    你的想法和我一样。

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

    如果这是 Perl,可能会将数字函数结果加起来。

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

    【讨论】:

      【解决方案3】:

      看看eval。但要小心。

      例子:

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

      【讨论】:

      • 为什么投反对票?这肯定会起作用(尽管@tobiaskun 你的链接是德国网站)
      • @sgroves:我自己也问过这个问题。感谢您提供带有德语链接的提示。
      • 选择这个,因为它是最简单的语法 (imo),并且可以顺利融入。
      • 以及您正在处理所有解析错误,例如 eval('return (+7-);')
      • 我没有投反对票..只是想说明这可能很危险,因为染色体被广泛洗牌。所以在使用eval或错误处理等之前必须进行一些检查。
      猜你喜欢
      • 2021-08-19
      • 1970-01-01
      • 2012-03-25
      • 2015-10-30
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-10
      相关资源
      最近更新 更多