分割統治法を使用して PHP の最小スパニング ツリー問題を解決し、最適な解を得るにはどうすればよいですか?
最小スパニング ツリーはグラフ理論の古典的な問題であり、接続されたグラフ内のすべての頂点のサブセットを見つけ、そのサブセットがツリーを形成するようにエッジを接続し、すべてのエッジの重みを計算することを目的としています。合計が最小になります。分割統治法とは、大きな問題を複数のサブ問題に分解し、そのサブ問題を 1 つずつ解決し、最後に結果を結合するという考え方です。分割統治法を使用して PHP の最小スパニング ツリー問題を解決するには、次の手順を実行します。
まず、グラフのデータ構造を定義する必要があります。グラフは配列と 2 次元配列を使用して表現できます。配列は頂点を表し、2 次元配列はエッジを表します。実際のニーズに応じて、重みなどの他の属性を追加できます。
class Graph { public $vertices; public $edges; public function __construct($vertices) { $this->vertices = $vertices; $this->edges = array(); } public function addEdge($u, $v, $weight) { $this->edges[] = array("u" => $u, "v" => $v, "weight" => $weight); } }
次に、分割統治アルゴリズムを実装して最小スパニング ツリーを解決する必要があります。最小スパニングツリー。具体的な手順は次のとおりです。
次は、分割統治法を使用して最小スパニング ツリーを解くコード例です:
function minSpanningTree($graph) { // 基准情况:图只有一个顶点 if ($graph->vertices == 1) { return array(); } // 选择两个子图 $subgraph1 = new Graph($graph->vertices / 2); $subgraph2 = new Graph($graph->vertices - $graph->vertices / 2); // 将边分配给子图 foreach ($graph->edges as $edge) { if ($edge["v"] <= $graph->vertices / 2) { $subgraph1->addEdge($edge["u"], $edge["v"], $edge["weight"]); } else { $subgraph2->addEdge($edge["u"], $edge["v"] - $graph->vertices / 2, $edge["weight"]); } } // 递归求解子图的最小生成树 $tree1 = minSpanningTree($subgraph1); $tree2 = minSpanningTree($subgraph2); // 合并两个子图的最小生成树 $tree = array_merge($tree1, $tree2); // 返回最小生成树 return $tree; }
最後に、上記のアルゴリズムを使用して最小スパニング ツリー問題を解決し、最適な解を得ることができます。以下は簡単なテスト例です:
// 创建一个带权重的无向图 $graph = new Graph(4); $graph->addEdge(1, 2, 1); $graph->addEdge(1, 3, 2); $graph->addEdge(2, 3, 3); $graph->addEdge(2, 4, 4); $graph->addEdge(3, 4, 5); // 求解最小生成树 $tree = minSpanningTree($graph); // 输出最小生成树的边和权重 foreach ($tree as $edge) { echo $edge["u"] . "-" . $edge["v"] . " weight: " . $edge["weight"] . " "; }
上記のコードを実行すると次の結果が出力されます:
1-2 weight: 1 2-3 weight: 3 3-4 weight: 5
ご覧のとおり、分割統治法を使用して最小スパンを解決しています。ツリー問題では、グラフの最小全域木を求めることに成功し、最適解が得られました。
以上がPHP で分割統治法を使用して最小スパニング ツリー問題を解決し、最適解を得るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。