PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   Beste Kombination ermitteln (https://www.php-resource.de/forum/php-developer-forum/105884-beste-kombination-ermitteln.html)

sanktusm 06-02-2017 13:47

Beste Kombination ermitteln
 
Hallo,
ich habe hier ein Script mit dem ich die nächstliegende Kombination von Bauplatten der Länge 2.5 und 4 ermitteln möchte:
Mir erscheint die Lösung nah, indem ich in 0.5er Schritten die Länge ermittle, die passt:

PHP-Code:

<?php
   
$totals 
= array();
$x=0;

function 
getAllCombinations($ind$denom$n$vals=array()){
    global 
$totals$x;
    if (
$n == 0){
        foreach (
$vals as $key => $qty){
            for(; 
$qty>0$qty--){
                
$totals[$x][] = $denom[$key];
             }
        }
        
$x++;
        return;
    }
    if (
$ind == count($denom)) return;
    
$currdenom $denom[$ind];
    for (
$i=0;$i<=($n/$currdenom);$i++){
        
$vals[$ind] = $i;
        
getAllCombinations($ind+1,$denom,$n-($i*$currdenom),$vals);
    }
}


function 
ceiling($number$significance 1)
    {
        return ( 
is_numeric($number) && is_numeric($significance) ) ? (ceil($number/$significance)*$significance) : false;
    }

$array = array(2.54);
$sum 0.5;
$length ceiling(11.40.5);

while(empty(
getAllCombinations(0$array$length))) {

$length $length 0.5;
 
}





getAllCombinations(0$array$sum);
echo 
"<pre>";
print_r($totals);
echo 
"</pre>";

Leider gibt die function den Wert total nicht zurück. Weiß jemand wie ich das hinkriege?

sanktusm 06-02-2017 15:18

günstigste Kombination von Längen finden:
 
Wenn man eine gegebene Länge (mit kleinen Überlappungen) mit 2 Platten der Länge 4 und 2.5 auskleiden will, bekommt man mit dieser Funktion eine Lösung:
PHP-Code:

<?php
   
$totals 
= array();
$x=0;

function 
getAllCombinations($ind$denom$n$vals=array()){
    global 
$totals$x;    
    if (
$n == 0){
        foreach (
$vals as $key => $qty){
            for(; 
$qty>0$qty--){
                
$totals[$x][] = $denom[$key];
             }
        }
        
$x++;
        return;
    }
    if (
$ind == count($denom)) return;
    
$currdenom $denom[$ind];
    for (
$i=0;$i<=($n/$currdenom);$i++){
        
$vals[$ind] = $i;
        
getAllCombinations($ind+1,$denom,$n-($i*$currdenom),$vals);
    }
    
    return 
$totals;
}


function 
ceiling($number$significance 1)
    {
        return ( 
is_numeric($number) && is_numeric($significance) ) ? (ceil($number/$significance)*$significance) : false;
    }

$array = array(2.534);
$length ceiling(16.40.5);


$totals = array();
$x=0;


while(empty(
getAllCombinations(0$array$length))) {

$length $length 0.5;
 
}

$smallest = Array();


$totals = array();
$x=0;


$total_arr getAllCombinations(0$array$length);

foreach(
$total_arr as $combinations) {

$smallest[] = count($combinations);

}


$min_val 0;
$min_key 0;
foreach(
$smallest as $key => $val) {
  if (
$val $min_val) {
    
$min_val $min;
    
$min_key $key;
  }
}



$numberofoverlays count($total_arr[$min_key]) - 1;

$length $length + ($numberofoverlays 0.3);


$length ceiling($length0.5);

$totals = array();
$x=0;

while(empty(
getAllCombinations(0$array$length))) {

$length $length 0.5;
 
}
  
$totals = array();
$x=0;

$total_arr getAllCombinations(0$array$length);

echo 
"<pre>";
  
print_r($total_arr[$min_key]);
echo 
"</pre>";



Alle Zeitangaben in WEZ +2. Es ist jetzt 21:17 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG