無向グラフからコードレスサイクルを抽出する

数年前、私は仕事でこのトピックに飛び込む必要がありました。グーグルで驚いたことに、既成の解決策は見つかりませんでした。それでも、一般的には何も見えません。そのため、テーマを最初から開発する必要がありました。



これが何であるかを明確にするために、最も簡単な例を示します。



画像



グラフは非常に単純であり、この種のグラフでは、コードレスサイクル(つまり、自己交差がなく、小さなサイクルに分割できないサイクル)を選択するアルゴリズムを簡単に思い付くことができます。問題は、グラフがはるかにトリッキーになる可能性があり、すべてのケースを考慮する必要があることです。審議、コーディング、試行錯誤を経て、最終的にアルゴリズムが誕生しました。これは現在、エンジニアリングの探鉱者の利益のために機能します。



テキストの説明:



  1. グラフの各頂点について、隣接するすべての頂点を見つけ、隣接する各頂点に向かって順番に移動することでサイクルを形成し始めます。
  2. 隣接する頂点の数(入力したものを除く)= 0の場合、戻ってサイクルを形成します--->項目5
  3. 隣接する頂点の数(入力したものを除く)が1に等しい場合、それに沿って進み、サイクルを形成します--->項目5
  4. ( , ) >=2, ( ), , ---> .5
  5. — ? , ---> .2
  6. , .
  7. , , , .
  8. , , ---> .1 ( )
  9. もう一度、サイクルを通過し、そこから左側のブランチを確認します。そのようなブランチを見つけたら、それぞれについて、幅優先の検索(または深さ優先の検索)を編成します(問題ではありません)。同時に、形成されたサイクルの先頭に到達した場合(現在のサイクルを除く)、サイクルの形成を中断して、--->項目1に進みます。
  10. サイクルを書き留めて、新しいものを探しに行きます--->アイテム1




より大きな疑似コード:

画像



最初は、アルゴリズムをテストするために、ますます洗練されたグラフが作成されました。

画像

または

画像

、最終的には、次のようなすべての実際の探索グラフでテストされました。

画像

最適だとは思いませんが、現時点(すでに約3年)では、失敗や苦情なしで機能します。



私はコードを引用していません。誰もが興味を持ってくれる可能性は低く、これは作業のほんの一部であるため、ピースを引き出すのは難しいでしょう。



All Articles