Oon tällä hetkellä ohjelmoimassa ja testaamassa perinteistä "Knapsack problem" ongelmaa PHP:llä.
Olen käyttänyt Rosettacodesta löytyvää PHP esimerkkiä (sitä pidempää).
http://rosettacode.org/wiki/Knapsack_problem/0-1#PHP
Olen lisännyt koodiin input-käyttöliittymän, jolloin käyttäjä voi itse vaihtaa säkin kestävyyden.
Tämän jälkeen koodi PHP ottaa kopin..
## Solve
$workload = $_GET['workload'];
list ($m4,$pickedItems) = knapSolveFast2($w4, $v4, sizeof($v4) -1, $workload,$m,$pickedItems);
Ja tämä on kaikki muutos, jonka olen koodiin tehnyt.
KYSYMY:
Miksi koodi ei osaa tulostaa vastausta esiasetettuun taulukkoon, mikäli säkin kantavuudeksi on käyttöliittymässä syötetty pienempi luku kuin 30?
Täällä voi testata ohjelmaa käytännössä:
http://users.metropolia.fi/~velipekr/index.php
Olen käyttänyt Rosettacodesta löytyvää PHP esimerkkiä (sitä pidempää).
http://rosettacode.org/wiki/Knapsack_problem/0-1#PHP
Olen lisännyt koodiin input-käyttöliittymän, jolloin käyttäjä voi itse vaihtaa säkin kestävyyden.
Tämän jälkeen koodi PHP ottaa kopin..
## Solve
$workload = $_GET['workload'];
list ($m4,$pickedItems) = knapSolveFast2($w4, $v4, sizeof($v4) -1, $workload,$m,$pickedItems);
Ja tämä on kaikki muutos, jonka olen koodiin tehnyt.
KYSYMY:
Miksi koodi ei osaa tulostaa vastausta esiasetettuun taulukkoon, mikäli säkin kantavuudeksi on käyttöliittymässä syötetty pienempi luku kuin 30?
Täällä voi testata ohjelmaa käytännössä:
http://users.metropolia.fi/~velipekr/index.php
Vastaukset 4
Vanhimmat
En osaa äkkiseltään sanoa, mutta mikset laita koodiin vähän välitulostusta, niin näet mitä kohtia se suorittaa ja mitä ei.
Lähinnä siis ihmetyttää, ettei tuo alkuperäinenkään koodi toimi. Siis tuo, jota tuolla Rosettacodessa on tarjottu. Samaa koodia toistetaan myös muissa ohjeissa.
Eli ts. eikö tuon alkuperäisen koodin pitäisi toimia, sillä en ole oikeastaan muokannut sitä ollenkaan? :/
Tässä kuitenkin phps http://users.metropolia.fi/~velipekr/index.phps
Se on hyvin mahdollista. :/
Tarkoitinkin juuri sitä, että tutkisit sitä alkuperäistä koodia samalla tavalla. Josko löytäisit, mikä siinä on vikana.
Melkoinen himmeli tuo functio joka ei siis toimi. Korvaa alkuperäinen allaolevalla hieman pelkistetymmällä niin pitäisi toimia.
function knapSolveFast2($w, $v, $i, $aW, $m, $pi) {
global $numcalls;
$numcalls ;
$vs = $v; // luodaan uusi joukko arvoille
arsort($vs); //järjestetään joukko suurimmasta pienimpään
$we = 0; // muuttuja valittujen painolle
$va = 0; // muuttuja valittujen arvoille
foreach($vs as $a){
$x = 0;
foreach($v as $b){
if(!in_array($x,$pi) && $a == $b){
if($we $w[$x] <= $aW){
$we = $w[$x];
$pi[]= $x;
$va = $v[$x];
}
}
$x ;
}
}
return array($va,$pi);
}