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
函数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。