Stahli: Mathe: geringsten Rest ermitteln

Beitrag lesen

Ah, ich bin nicht davon ausgegangen dass du quasi eine unbegrenzte Anzahl von 3000er, 4000er und 8000er Stangen zur Verfügung hast. Ich fand das Problem intressant und hab mal ein kleines Script geschrieben.

Link zum Script

Hier der relevante Teil des Scripts.

  
 echo "<p>Es sollen $count Stücke der Länge $laenge aus den Rohstücken ".implode(', ',$roh).' geschnitten werden.</p>';  
 $min_rest=-1;  
 while($kombi[$roh_count-1]<=$count){  
  //Neue Kombination berechnen  
  $kombi[0]++;  
  for($j=0;$j<$roh_count-1;$j++)  
   if($kombi[$j]>$count){  
    $kombi[$j+1]++;  
    $kombi[$j]=0;  
   }  
  //Überprüfen, ob diese Kombination die gewünschte Anzahl an fertigen Stangen ergibt  
  $anzahl=0;  
  foreach($kombi as $par_anzahl)  
   $anzahl+=$par_anzahl;  
  if($anzahl!=$count)  
   continue;  
  //Rest dieser Kombination berechnen  
  $rest=0;  
  for($i=0;$i<$roh_count;$i++){  
   $a=ceil($kombi[$i]/floor($roh[$i]/$laenge));//Soviele Rohstücke dieser Länge brauche ich  
   $rest+=$a*$roh[$i] - $kombi[$i]*$laenge;  
  }  
  //Wenn neuer Minimalwert erreicht -> merken  
  if(($rest<$min_rest)||($min_rest<0)){  
   $min_kombi=$kombi;  
   $min_rest=$rest;  
  }  
 }  

Das Script ist sicher noch verbesserungswürdig (vor allem die Ermittlung der verschiedenen Kombinationen ist ziemlich unperformant), aber es erfüllt ersteinmal seinen Zweck.

Ich gehe hierbei davon aus, dass eine unbegrenzte Anzahl von Rohstücken vorhanden ist. "Abfall" ist das, was nach dem Sägen von den benutzten Rohstücken übrigbleibt. Der Abfall am Ende aneinander gelegt soll minimal sein.

Die Länge der verfügbaren Rohstücke trägst du einfach zeilenweise in das Textfeld ein.

Gruß,
Felix

--
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jedermann ist überzeugt, dass er genug davon habe.
René Descartes