PHP - Knapsack problem

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.


Kestävyys:








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
Ilmianna
Jaa

4 Vastausta



En osaa äkkiseltään sanoa, mutta mikset laita koodiin vähän välitulostusta, niin näet mitä kohtia se suorittaa ja mitä ei.
Ilmianna
Jaa
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
Kommentoi
Ilmianna
Jaa
1 VASTAUS:
Se on hyvin mahdollista. :/

Tarkoitinkin juuri sitä, että tutkisit sitä alkuperäistä koodia samalla tavalla. Josko löytäisit, mikä siinä on vikana.
Kommentoi
Ilmianna
Jaa
+Lisää kommentti
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);
}
Ilmianna
Jaa

Vastaa alkuperäiseen viestiin

PHP - Knapsack problem

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.


Kestävyys:








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

5000 merkkiä jäljellä

Peruuta