28. januar 2008 - 01:31Der er
2 kommentarer og 1 løsning
Søger en knapsack-bin packing algoritme implementeret PHP
Jeg sidder og arbejder på et script hvor jeg har brug for flg.
En række elementer med forskellig størrelse skal grupperes, således at hver gruppes størrelse er under en given grænse. elementerne skal arrangeres, så pladsen udnyttes bedst muligt.
Jeg har læst mig til at det er et knapsack problem af typen 1-dimensionel bin packing som jeg sidder med, og leder derfor efter en PHP-implemententation af denne algoritme. Jeg har indtil videre kun kunnet finde kode i Visual Basic format, hvilket ikke er helt let at "oversætte" til PHP...
Så hvis nogen kan linke til et kode-eksempel på en bin packer skrevet i PHP så vil det være rart:)
if($element["size"]>$binsize) die("Element too big\n");
//insufficient space in current bin if($element["size"]>$free_space) { echo "not enough space element_pointer: $element_pointer\n"; //find biggest element that fits $found_elements=0; for($i=0;$i<$element_count;$i++) { $temp_element=&$elements[$i]; //element found if($temp_element["bin"]<0 && !($temp_element["size"]>$free_space) ) { echo "fitting element found i: $i\n"; $found_elements++;
//put element into bin $used_elements++; $temp_element["bin"]=$bin_pointer; $bin["size"]+=$temp_element["size"]; $free_space=$binsize-$bin["size"]; array_push($bin_elements,$temp_element); }
} //else make a new bin and put element into if($found_elements==0) { echo "making new bin element_pointer: $element_pointer\n"; //make new bin $bin_pointer++; $new_bin=array("id"=>$bin_pointer,"size"=>0,"elements"=>array()); array_push($bins,$new_bin); $bin=&$bins[$bin_pointer]; $bin_elements=&$bin["elements"];
//put element into bin $used_elements++; $element["bin"]=$bin_pointer; $bin["size"]+=$element["size"]; $free_space=$binsize-$bin["size"]; array_push($bin_elements,$element); } } //enough space else { //put element into bin echo "enough space element_pointer: $element_pointer\n"; $used_elements++; $element["bin"]=$bin_pointer; $bin["size"]+=$element["size"]; $free_space=$binsize-$bin["size"]; array_push($bin_elements,$element); }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.