質問内容はタイトルの通りです。下記記載のコードに関する質問です。
一応、文法的なエラーはありません。
distance_tableを
$distance_table = array(array(0, 10, 100, 100, 100, 10), array(10, 0, 10, 100, 100, 100), array(100, 10, 0, 10, 100, 100), array100, 100, 10, 0, 10, 100), array(100, 100, 100, 10, 0, 10), array(10, 100, 100, 100, 10, 0));
つまり以下のように代入した場合は正常通り動くのです。
0, 10, 100, 100, 100, 10
10, 0, 10, 100, 100, 100
100, 10, 0, 10, 100, 100
100, 100, 10, 0, 10, 100
100, 100, 100, 10, 0, 10
10, 100, 100, 100, 10, 0
しかし、コードに記載してあるようなランダムな数値だとタイトルに書いてあるエラーが出てしまうのです。
エラーの内容は30秒以内で計算できない、みたいな内容だとわかるのですが、これを解決して正常通りどのような値でも動くようにするには、どのようにすればいいのでしょうか?
ちなみにこのコードはhttp://www.geocities.jp/m_hiroi/light/pyalgo64.htmlのページの2-opt 法を元にPHPに書き直したものです。
よろしくお願いします。
<?php function opt_2($size, $path){ global $distance_table; $total = 0; while(true){ $count = 0; for($i = 0; $i < $size - 2; $i++){ $i1 = $i + 1; for($j = $i + 2; $j < $size; $j++){ if($j == $size - 1){ $j1 = 0; } else{ $j1 = $j + 1; } if($i != 0 or $j1 != 0){ $l1 = $distance_table[$path[$i]][$path[$i1]]; $l2 = $distance_table[$path[$j]][$path[$j1]]; $l3 = $distance_table[$path[$i]][$path[$j]]; $l4 = $distance_table[$path[$i]][$path[$j1]]; if($l1 + $l2 > $l3 + $l4){ array_splice($path, $i1, $j + 1 - $i1, array_reverse(array_slice($path, $i1, $j + 1 - $i1))); $count += 1; } } } } $total += $count; if($count == 0){break;} } return $path; } $distance_table = array(array(0, 72, 38, 71, 78, 20), array(72, 0, 38, 21, 65, 67), array(38, 38, 0, 33, 50, 29), array(71, 21, 33, 0, 44, 61), array(78, 65, 50, 44, 0, 59), array(20, 67, 29, 61, 59, 0)); for($i = 0; $i < count($distance_table); $i++){ var_dump($distance_table[$i]); echo"<br>"; } $path = array(0, 5, 2, 3, 1, 4); var_dump($path); echo"<br>"; print_r(opt_2(count($path), $path)); ?>申し訳ありません。質問の仕方が悪かったですね。
実行時間を長くすればいい、と考えたので試しにやってはみたのですが、ずっと読み込みが続きいつになっても結果が出ませんでした。
なので、このコードの結果を「処理を早くしてどのような数値でも結果を得られる」ようにするにはどうしたらよいでしょうか、という質問です。
追記:
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/10 07:52