你们好。
我最近写一个钢筋公司的系统
客户的订单要求做各种长度的钢筋,如 3.5 , 4, 6, 5.5, 4.2等等
还没有切割的钢筋都是12米长。
用系统计算怎样切割才能节省一点呢?

解决方案 »

  1.   

    我现在写出了一个函数,可是出来的结果并不是最优的结果,要优化一下
    大虾能帮我看一下么? function ironcutter($iron,$ironcheck = NULL,$ironset = NULL){
    /*$iron 指客户订单,各种长度封装在数组里
    $ironcheck 指需要检查是否最优化的组合,都会丢在这里,由程序检查,称为“待判断组合”
    $ironset 指确认是最优化的组合,都会丢在这里,称为“已确认组合”
    */
    define("LIMITER",12);
    $c = 12;
    if(count($iron) == 0){
    /*当客户订单都被判断完之后,检查“待判断组合”里还有没有值,如果有的话,丢进“已确认组合里”*/
    if($ironcheck != NULL){
    array_push($ironset,$ironcheck);
    }
    return $ironset;

    }elseif($ironcheck == NULL){
    /*如检测到“待判断组合”为空时,则丢一个数字进函数挑选最优组合*/
    foreach($iron as $key => $val){
    ;
    unset($iron[$key]);
    return ironcutter($iron,array($key=>$val),$ironset);
    }
    }else{
    $check = false;
    $sum = array_sum($ironcheck);
    foreach($iron as $key => $val){
    if($sum + $val < LIMITER){
    $check = true;
    break;
    }
    }
    /*判断组合是否已无法再增加任何数字,如增加会超过限制值*/

    if($check){
    /*用遍历数组挑选最优值,挑选损耗最小的组合*/
    foreach($iron as $key => $val){
    $total = $sum + $val;
    if( LIMITER - $total <= $c && LIMITER -$total >=0){
    $c = LIMITER - $total;
    $k = $key;
    $v = $val;
    }
    }

    /*挑选出最优值,删除客户订单中的这个值,放进待检查组合里,再丢进函数检查能否增加其他数字*/
    unset($iron[$k]);
    $ironcheck[$k] =$v;
    return ironcutter($iron,$ironcheck,$ironset);

    }else{
    /*如果组合无法再增加数字,则把它放进已确认组合里。*/

    $ironset[count($ironset)] = $ironcheck;
    $ironcheck = NULL;
    return ironcutter($iron,$ironcheck,$ironset);
    }

    }
    }
      

  2.   

    算法不难,难在于效率。当订单里,有上万个钢筋长度的时候,效率怎么解决大概思路
    函数:
    订单为空的时候,判断是否最优解
    否则循环订单
    {
         A当前的钢筋剩余长度<订单值   选择新的一跟钢筋【递归】     B当前钢筋剩余长度>=订单值
         {
             该订单,就截在这里  ……【递归】
             
             但是,也可以回滚一下,能截,但选择下一个订单截【递归】
         }
    }
      

  3.   

    我上面的函数运行了一下
    客户订单如下array(37) {
      [1]=>
      string(1) "7"
      [2]=>
      string(1) "7"
      [3]=>
      string(1) "6"
      [4]=>
      string(1) "6"
      [5]=>
      string(1) "6"
      [6]=>
      string(1) "6"
      [7]=>
      string(1) "6"
      [8]=>
      string(1) "6"
      [9]=>
      string(1) "6"
      [10]=>
      string(1) "6"
      [11]=>
      string(1) "6"
      [12]=>
      string(1) "6"
      [13]=>
      string(3) "5.9"
      [14]=>
      string(3) "5.9"
      [15]=>
      string(3) "5.9"
      [16]=>
      string(3) "5.9"
      [17]=>
      string(3) "5.9"
      [18]=>
      string(1) "5"
      [19]=>
      string(1) "5"
      [20]=>
      string(1) "5"
      [21]=>
      string(1) "5"
      [22]=>
      string(3) "4.9"
      [23]=>
      string(3) "4.9"
      [24]=>
      string(1) "4"
      [25]=>
      string(1) "4"
      [26]=>
      string(1) "4"
      [27]=>
      string(1) "4"
      [28]=>
      string(1) "4"
      [29]=>
      string(1) "4"
      [30]=>
      string(3) "3.9"
      [31]=>
      string(3) "3.9"
      [32]=>
      string(3) "3.4"
      [33]=>
      string(3) "3.4"
      [34]=>
      string(3) "3.4"
      [35]=>
      string(3) "3.4"
      [36]=>
      string(1) "3"
      [37]=>
      string(1) "3"
    }
    用程序得出的结果array(16) {
      [0]=>
      array(2) {
        [1]=>
        string(1) "7"
        [21]=>
        string(1) "5"
      }
      [1]=>
      array(2) {
        [2]=>
        string(1) "7"
        [20]=>
        string(1) "5"
      }
      [2]=>
      array(2) {
        [3]=>
        string(1) "6"
        [12]=>
        string(1) "6"
      }
      [3]=>
      array(2) {
        [4]=>
        string(1) "6"
        [11]=>
        string(1) "6"
      }
      [4]=>
      array(2) {
        [5]=>
        string(1) "6"
        [10]=>
        string(1) "6"
      }
      [5]=>
      array(2) {
        [6]=>
        string(1) "6"
        [9]=>
        string(1) "6"
      }
      [6]=>
      array(2) {
        [7]=>
        string(1) "6"
        [8]=>
        string(1) "6"
      }
      [7]=>
      array(2) {
        [13]=>
        string(3) "5.9"
        [17]=>
        string(3) "5.9"
      }
      [8]=>
      array(2) {
        [14]=>
        string(3) "5.9"
        [16]=>
        string(3) "5.9"
      }
      [9]=>
      array(2) {
        [15]=>
        string(3) "5.9"
        [19]=>
        string(1) "5"
      }
      [10]=>
      array(2) {
        [18]=>
        string(1) "5"
        [23]=>
        string(3) "4.9"
      }
      [11]=>
      array(3) {
        [22]=>
        string(3) "4.9"
        [29]=>
        string(1) "4"
        [37]=>
        string(1) "3"
      }
      [12]=>
      array(3) {
        [24]=>
        string(1) "4"
        [28]=>
        string(1) "4"
        [27]=>
        string(1) "4"
      }
      [13]=>
      array(3) {
        [25]=>
        string(1) "4"
        [26]=>
        string(1) "4"
        [31]=>
        string(3) "3.9"
      }
      [14]=>
      array(3) {
        [30]=>
        string(3) "3.9"
        [35]=>
        string(3) "3.4"
        [34]=>
        string(3) "3.4"
      }
      [15]=>
      array(3) {
        [32]=>
        string(3) "3.4"
        [33]=>
        string(3) "3.4"
        [36]=>
        string(1) "3"
      }
    }
    貌似我写出的程序如果组合只有两个数的,就能能出最优结果,但是组合有三个数的,就不能得出最优的结果了。不知道程序哪里写错了