Php 寻找最佳解决方案所需的算法逻辑

Php 寻找最佳解决方案所需的算法逻辑,php,algorithm,codeigniter,logic,solution,Php,Algorithm,Codeigniter,Logic,Solution,场景 具有以下特性的可用车辆列表: 车辆1{乘客4人,行李2人,行李箱8人} 车辆2{乘客:5人,行李:3人,手提箱:10人} 车辆3{乘客6人,行李3人,手提箱10人} 车辆4{乘客8人,行李4人,手提箱10人} 现在,如果用户要求旅行时携带(13名乘客、6件行李、15个行李箱),那么最佳的车辆效率结果将是: 车辆2+车辆4 问题定义: 我已经能够开发出一个流程/算法(但仅限于乘客数量),但当乘客/行李箱/行李数量超过3辆或更多车辆的需求时,我无法为其开发算法 代码: 函数ajax\u get

场景

  • 具有以下特性的可用车辆列表:

    车辆1{乘客4人,行李2人,行李箱8人}

    车辆2{乘客:5人,行李:3人,手提箱:10人}

    车辆3{乘客6人,行李3人,手提箱10人}

    车辆4{乘客8人,行李4人,手提箱10人}

  • 现在,如果用户要求旅行时携带(13名乘客、6件行李、15个行李箱),那么最佳的车辆效率结果将是:

    车辆2+车辆4

  • 问题定义: 我已经能够开发出一个流程/算法(但仅限于乘客数量),但当乘客/行李箱/行李数量超过3辆或更多车辆的需求时,我无法为其开发算法

    代码:

    函数ajax\u getVehicles(){
    $vehicleType=$\u POST['vehicleType'];
    $passengers=intval($_POST['passengers']);
    $LANGLE=intval($_POST['LANGLE']);
    $suitcases=intval($_POST['suitcases']);
    $requiredVehicles=array();
    //1.检查是否所有乘客都能坐在一节车厢内
    如果(!$requiredVehicles){
    $vehicle=$this->common_model->get_where('fleets',array('vehicle_type'=>$vehicleType,'passengers>='=>$passengers),'passengers ASC');
    若有($车辆)
    阵列推送($requiredVehicles,$Vehicler[0]);
    }
    //2.尝试发送重复的车辆
    $vehicles=$this->common_model->get_where('fleets',array('vehicle_type'=>$vehicleType),'passengers ASC');
    如果(!$requiredVehicles){
    foreach(车辆为$v){
    如果($v['passengers']*2==$passengers){
    阵列推送($requiredVehicles,$v,$v);
    }
    }
    }
    //3.找到可能的最佳解决方案
    如果(!$requiredVehicles){
    $totalPermutation=gmp_事实(计数($vehicles))/(gmp_事实(计数($vehicles)-2)*gmp_事实(2));
    $total_pax_array=array();
    对于($i=0;$i<$totalPermutation;$i++){
    对于($count=$i+1;$count=$){
    如果(计数($total\u pax\u array)<1){
    $requiredVehicles=数组($vehicles[$i],$vehicles[$count]);
    }否则如果($total\u pax乘客){
    阵列推送($requiredVehicles,$v,$v);
    } 
    }
    }
    如果(!$requiredVehicles)
    jsonOutput('错误','需要呼叫3辆车');
    其他的
    jsonOutput(‘成功’、‘标准匹配车辆’、$requiredVehicles);
    }
    
    这可以通过以下递归公式解决:

    D(p,l,s,0) =   infinity        if p>0 or l>0 or s>0
                   0               otherwise      
    D(p,l,s,i) = min { D(p,l,s,i-1), D(p-cars[i].passangers, l-cars[i].luggage, s-cars[i].suitcases) + 1}
    
    这个概念是D(p,l,s,i)表示1,2,3…,i-车厢之间的最小车厢数,可以搭载
    p
    乘客、
    l
    行李和
    s
    行李箱

    时间复杂度(如果应用DP技术):
    O(n*p*l*s)
    ,其中
    n
    是可用汽车的数量,
    p
    所需乘客数量,
    l
    所需行李数量,
    s
    所需行李箱数量


    另一种解决方案是生成CAR的所有子集,针对每个子集检查其是否为可行解,并从可行解中选择最小大小的子集。时间复杂度:
    O(2^n)

    这可以通过以下递归公式来解决:

    D(p,l,s,0) =   infinity        if p>0 or l>0 or s>0
                   0               otherwise      
    D(p,l,s,i) = min { D(p,l,s,i-1), D(p-cars[i].passangers, l-cars[i].luggage, s-cars[i].suitcases) + 1}
    
    这个概念是D(p,l,s,i)表示1,2,3…,i-车厢之间的最小车厢数,可以搭载
    p
    乘客、
    l
    行李和
    s
    行李箱

    时间复杂度(如果应用DP技术):
    O(n*p*l*s)
    ,其中
    n
    是可用汽车的数量,
    p
    所需乘客数量,
    l
    所需行李数量,
    s
    所需行李箱数量



    另一种解决方案是生成CAR的所有子集,针对每个子集检查其是否为可行解,并从可行解中选择最小大小的子集。时间复杂度:
    O(2^n)

    谢谢您回复@amit。我对动态规划一无所知。你能给我推荐一些符合这个标准的类似解决方案吗。如果可能的话?@manishrestha DP非常简单,最简单的形式是记忆,这基本上意味着-你不需要重新计算东西两次,因为你“记住”了值。查看我链接的维基百科页面,了解更多详细信息。我还提供了一个蛮力选项来优化解决它。我会试着算出DP,威尔·平回到这里。再次感谢@amit。感谢您回复@amit。我对动态规划一无所知。你能给我推荐一些符合这个标准的类似解决方案吗。如果可能的话?@manishrestha DP非常简单,最简单的形式是记忆,这基本上意味着-你不需要重新计算东西两次,因为你“记住”了值。查看我链接的维基百科页面,了解更多详细信息。我还提供了一个蛮力选项来优化解决它。我会试着算出DP,威尔·平回到这里。再次感谢你@amit。