どのSEサイトを選択するか(stackoverflowとmathが候補でした)はわかりませんでしたが、この問題のソフトウェアを作成する可能性があるため、ここに投稿することにしました。
私たちのクライミングジムでは、隣接する壁のセクターが同じ(または同様の)クライミングホールドカラーを使用していない可能性があるという問題に直面しています。クライミングホールドカラーを壁のセクターに割り当てるためのアルゴリズムを探しています。これまでは手動で行っていましたが、結果はさまざまで、時には不快なものでした。これが私たちの「ルール」です:
セクターAのルートが赤の場合、近くのセクター(A-1およびA + 1)に赤のルートを設定することはできません。ルートセッターがルートを「接触」させないように特別な注意を払わない限り、セクターA-2およびA+2にその色のルートを設定しないことが望ましい。
1つまたは隣接するセクターの異なる色は、「十分に異なる」必要があります。たとえば、赤とピンクのような組み合わせは許可されていません。赤と紫は避けてください。赤緑の色覚異常の登山者がいるため、色が互いに補完し合うことは、実際にはそれらを1つのエリアで組み合わせる理由にはなりません(他のいくつかのフレーバーも同様です)。また、白と黒(一緒に行かない)などの非色、蛍光色、2色または3色を組み合わせたホールドもあります。ただし、どの色の組み合わせがうまく調和するか、避けるべきか、許可されないかは安全に判断できます。
1つのセクターに最大4つのルートが存在する可能性があります。ルートが1つか2つしかないセクターは避けてください。色ごとに量が違うので、それも考慮に入れる必要があります。セクターは円形(柱の周りなど)または相互接続(柱と屋根で接続された近くの壁)の場合があります。
そのような問題への一般的なアプローチはありますか?
編集1:
mbeckishの提案を実装し、この問題のシミュレーテッドアニーリングアルゴリズムを作成しました。私のコードは正常に機能すると思いますが、結果は満足のいくものではありません。
詳細は次のとおりです。
- それぞれ4つのルートを持つ15のセクターがあります。
- ルートの色は10色あります。プライマリ3色、セカンダリ3色、黒、白、ターコイズ、紫/白(組み合わせ)です。
- 各色の量は、色ごとに3〜8ルートに固定されています。
- アルゴリズムの開始時に、色は「クラスター化」されます。
- 可能な色の組み合わせごとにペナルティ(1e-2 ... 1)のある行列を定義しました。
- energy()関数は、各セクター内および隣接するセクター間のすべてのペナルティを合計します。
- neighbour()関数は、ランダムに選択されたルートのペアを2つの異なるセクター間でスワップします(ルートの色が同じでない場合は、スワップ用の新しいペアが選択されます)。
- T()は指数関数的に減衰します
- P()は、シミュレーテッドアニーリングに関するウィキペディアの記事のように実装されています。
これはうまく実行され、交換されますが、結果には常に同じ色の2つのルートを持つセクターが含まれます。それでも、エネルギー(正規化、青:現在、緑:最良)と反復の「収束」プロットを含めたいと思います。
アルゴリズムを開始する前にルートをシャッフルした場合の結果も同様です。これは、ペナルティを見ずに事前反復を行うようなものです。これは、アルゴリズムをより貪欲にし、より多くの反復を行うためにT()のより速い減衰を伴う、事前にシャッフルされた同じ種類のプロットです。
編集2:neighbour()関数は、エネルギーが最も高いセクター(S1)からランダムな色(C1)を選択し、C1が既に含まれている場合を除き、ランダムな他のセクター(S2)からのランダムな色(C2)と交換します。 S2またはC2はすでにS1に含まれています。これにより、わずかに良い結果が得られますが、色が重複しているセクターが含まれています。今から違うものを考えてみます。