正直なところ、これはまだ質問されていないとは信じられませんが、ここでは
バックグラウンド
単純な無向平面(グラフは交差なしで平面に描くことができます)グラフを考えると、グラフが4色であることが証明された定理です。ただし、グラフを5色にする方がはるかに簡単です。これが、今日の課題に焦点を当てるものです。
グラフの有効なk色は、次のプロパティを持つグラフのノードへの「色」の割り当てです。
- 2つのノードがエッジで接続されている場合、ノードは異なる色で色付けされます。
- グラフ全体で、最大5色があります。
これを踏まえて、単純な無向平面グラフを5色にするための非常に基本的なアルゴリズムを紹介します。このアルゴリズムには次の定義が必要です
到達可能性:ノード1がノード2から到達可能である場合、最初のノードがノード2で最後がノード1であるように、それぞれがエッジで接続された一連のノードがあることを意味しますノード1がノード2から到達可能である場合、ノード2はノード1から到達可能です。
サブグラフ:ノードNの特定のセットのグラフのサブグラフは、サブグラフのノードがすべてNであり、両方のノードがエッジで接続されている場合にのみ、元のグラフのエッジがサブグラフにあるグラフです。北にあります
Color(N)を、N個のノードを持つ平面グラフを5色で色付けする関数とします。以下の関数を定義します
- 接続されているノードの数が最も少ないノードを見つけます。このノードには、最大で5つのノードが接続されます。
- グラフからこのノードを削除します。
- この新しいグラフでColor(N-1)を呼び出して、色を付けます。
- 削除したノードをグラフに追加し直します。
- 可能であれば、追加されたノードに、接続されているノードのいずれにもない色を割り当てます。
- 可能でない場合、追加されたノードに隣接する5つのノードすべてに5つの異なる色があるため、次のプロセスを試す必要があります。
- 追加されたノードn1 ... n5を囲むノードに番号を付けます
- n1またはn3のいずれかと同じ色の元のグラフのすべてのノードのサブグラフを検討します。
- このサブグラフで、n1から到達可能なノードのセット(n1を含む)で、n1からn3に到達できない場合、n1のすべての色をn3に置き換えます。追加したノードn1の元の色に色を付けます。
- この新しいグラフでn1からn3に到達できる場合、n1とn3ではなく、ノードn2とn4でステップ9からのプロセスを実行します。
チャレンジ
edgelist(グラフを表す)の入力を指定して、各ノードに値を割り当てることにより、グラフに色を付けます。
入力:グラフ内のエッジのリスト(つまり、[('a','b'),('b','c')...]
)
入力エッジリストは、(a、b)がリスト内にある場合、(b、a)はリスト内にないことに注意してください。
出力:値のペアを含むオブジェクト。各ペアの最初の要素はノードで、2番目はその色、つまり、[('a',1),('b',2)...]
または{'a':1,'b':2,...}
色、数字、文字、その他のものを表すために何でも使用できます。
入力と出力が非常に明確である限り、入力と出力は非常に柔軟です。
ルール
- これはコードゴルフの挑戦です
- 上記のアルゴリズムを使用する必要はありません。これは単に参照用です。
- どのグラフでも、多くの場合、有効な色付けの方法があります。アルゴリズムが生成した色付けが有効である限り、それは受け入れられます。
- グラフは5色でなければならないことに注意してください。
テストケース
次のコードを使用して、カラーリング結果の有効性をテストします。グラフごとに有効なグラフの色が多数あるため、このアルゴリズムは単に色の有効性をチェックします。コードの使用方法については、docstringをご覧ください。
いくつかのランダムな(そしてかなり馬鹿げた)テストケース:
テストケース2:Krackhardt Kite Graph
[(0, 1), (0, 2), (0, 3), (0, 5), (1, 3), (1, 4), (1, 6), (2, 3), (2, 5), (3, 4), (3, 5), (3, 6), (4, 6), (5, 6), (5, 7), (6, 7), (7, 8), (8, 9)]
有効な出力:
{0: 4, 1: 3, 2: 3, 3: 2, 4: 4, 5: 1, 6: 0, 7: 4, 8: 3, 9: 4}
注:これらのテストケースは小さすぎて、カラーアルゴリズムのより微妙な動作をテストできないため、独自のグラフを作成することは、おそらく作業の妥当性の良いテストです。
注2:すぐにカラーリングソリューションをグラフ化する別のコードを追加します。
注3:提示されたランダムなカラーリングアルゴリズムは予測していませんでした。PPCGのすばらしいところです!ただし、より決定的なアルゴリズムを使用できる人がいれば、それも非常にクールです。
5
し4
て再送信できないように設計する必要があります。