この記事では主に0-1ナップサック問題を解くためのPHPバックトラッキング手法を紹介します ナップザックを解くためのPHPバックトラッキング手法の手法の分析例。問題には特定の参考値がありますので、困っている友達はそれを参照してください
この記事の例では、PHP のバックトラッキング手法を使用して 0-1 ナップザック問題を解決する方法を説明します。皆さんの参考に共有してください。具体的な分析は次のとおりです:
このコードは、「ソフトウェア デザイナー」チュートリアルの疑似コードに基づいて作成されています。
最も厄介なのは、疑似コードが PHP に変更されたことではなく、配列の添字が 0 から始まることと、それに対応する添字の判定の問題です。
デバッグ出力と一緒に書きます
?
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
$v_arr = 配列(11,21,31,33,43,53,55,65); $w_arr = 配列(1,11,21,23,33,43,45,55); $n = count($w_arr ); //テスト出力 var_dump(bknap1(110)); //var_dump(bound(139,89,7,110)); 関数バウンド($v,$w,$k,$W_total){ グローバル $v_arr,$w_arr,$n; $b = $v; $c = $w; //var_dump($W_total);var_dump($n);var_dump($k);var_dump($v);var_dump($w); //死ぬ; for($i=$k+1;$i $c = $c + $w_arr[$i]; //var_dump($W_total);var_dump($c); if($c $b += $v_arr[$i]; その他{ //var_dump((1-($c-$W_total)/$w_arr[$i])*$v_arr[$i]); $b = $b+(1-($c-$W_total)/$w_arr[$i])*$v_arr[$i]; $b を返す; } } /*var_dump('------バインドされたヘッド'); var_dump($k); var_dump($b); var_dump('------バインドエンド');*/ $b を返す; } 関数 bknap1($W_total){ グローバル $v_arr,$w_arr,$n; $cw = $cp = 0; $k = 0; $fp = -1; ながら(真){ while($k $cw += $w_arr[$k]; $cp += $v_arr[$k]; $Y_arr[$k] = 1; $k +=1; } //var_dump($cw);var_dump($cp);var_dump($Y_arr);var_dump($k);var_dump($n); if($k==$n){ $fp = $cp; $fw = $cw; $k = $n-1; $X_arr = $Y_arr; //bound($cp,$cw,$k,$W_total); //var_dump(bound($cp,$cw,$k,$W_total),$fp,$k);die; //var_dump($fp);var_dump($fw);var_dump($Y_arr);var_dump($k);var_dump($n); }その他{ $Y_arr[$k] = 0; } //var_dump($Y_arr);var_dump($k);var_dump($n);//死ぬ; //var_dump(bound($cp,$cw,$k,$W_total),$fp);die; while(bound($cp,$cw,$k,$W_total)<=$fp) { while($k>=0 && $Y_arr[$k]!=1){ $k -= 1; } if($k { $X_arr を返す; } var_dump($k); $Y_arr[$k] = 0; $cw -= $w_arr[$k]; $cp -= $v_arr[$k]; } $k += 1; } } ?> |
この記事で説明した内容が皆様の PHP プログラミング設計に役立つことを願っています。