クライミングホールドカラーを壁のセクターに割り当てるアルゴリズムを探す


8

以前にこの質問をstackoverflowに投稿しましたが、オフトピックとして閉じられました。私はそれがここで生き残ることを望みます。

私のクライミングジムでは、ルートは時々再設定する必要があります。次の規則が適用されます。

  • 私たちは、さまざまな量のさまざまな色で登りを保持しています。-セクターにルートを設定する場合、混乱を避けるために、そのセクターまたは近くのセクターに同じ色の他のルートを設定してはなりません。
  • 白/灰色または赤/ピンクなど、一部の色の組み合わせは、セクターで避ける必要があります。
  • 目標は、各セクターに4つのルートを設定することですが、4つが上記のルールに違反する場合は、それより少なくてもかまいません。

今までに2つの異なるアプローチを試しました。1つ目はSimulated Annealingで、ランダムなパターンの色(ただし、指定された色の重み)で壁を初期化し、各色の組み合わせの悪さを計算しました。この悪さは、1つのセクターとその近隣のセクターの組み合わせについても計算されました。各反復で、最悪のセクターからランダムに選択されたルートが、ランダムに選択された他のセクターからのルートと交換されました。これはある種の収束を示しましたが、結果は使用できませんでした(つまり、結果の状態には2色または3色のセクターが含まれていました)。

それから反対側から問題に取り組み、空の壁から始めました。今回は、すべての色に1つのセクターから隣接するセクターに減衰する濃度がありました。同様の色の濃度も増加しました。つまり、赤いルートは、セクターとその周辺のオレンジの濃度を増加させました。重み付けされたランダムな色のソース(バケット)により、壁の次の色が得られました。これは、この色の濃度が最も低いセクターに配置されました。濃度が特定のしきい値を超えた場合、色は追加されませんでした(ただし、バケットに戻されました)。結果の状態にダブルカラーが含まれていなかったため、これは部分的に成功しました。

だから:上記のルールを考えると、この問題を解決するための適切なアルゴリズムは何でしょうか?必要に応じて、情報を追加させていただきます。


編集1-詳細:

  • 私のテストケースには15のセクターがあります。
  • 各セクターには4つのルートが含まれている必要があります
  • 実際のジムには平均50セクターの建物が3つあります
  • 一部のセクターは柱の周りに配置され、一部は屋根で接続されています
  • 約10種類のホールドカラーがあります
  • セクターの高さは6(初心者セクション)から20メートル(13垂直+ 7屋根)の間で変化するため、ホールドの消費量は異なります。ただし、平均は約12で、これは一定と見なすことができます。
  • 各色の量には限りがあり、量は等しくありません
  • いくつかの色はより簡単で、いくつかはより困難です(つまり、どんな困難でも黄色のルートを作成できますが、子供のために非常に簡単なオレンジのルートを作成することはほとんど不可能です)
  • 一部のセクターは「より簡単」なので、簡単な色を使用する必要があります(これはオプションです。ルートセッターは、広範囲で困難または簡単にすることができます)。
  • セクター内または隣接するセクター内でどの色がうまく調和し、どの組み合わせがうまくいかないかを安全に判断できます。白と黒(コンボが悪い)など、いくつかの驚きがあります。ゴム(靴)またはチョーク(手)が残っていると、どちらも灰色になります。
  • 一部の保持色は、紫/白(縞模様)のような組み合わせです。

編集2:遺伝的アルゴリズムに関するいくつかの質問

ParadisEOをダウンロードしてコンパイルし、IDE(Code :: Blocksを使用)でQuickStartサンプルをコンパイルしました。ParadisEOは、単一目的と多目的GAを備えた遺伝的アルゴリズムを提供します。GertVdEは、各セクターの適合度を計算し、すべてのセクターの適合度の合計を単一の目的として最大化することを提案しました。また、多目的GAを使用して、各セクターの適応度を最大化できますか?それは約50の目標になります。

また、私は賢明なクロスオーバー関数の定義に苦労しています。各色の最大量が固定されているため、交差すると違法な状態になる可能性があります。以前に与えられた最大量よりも多くを許可すると、パターン全体が、厄介な色が捨てられた「厄介な」組み合わせの繰り返しに収束する可能性があります。一方、最大に達するまで余分な色を捨てて、クロスオーバー機能を非保守的にすることもできます。

(私は遺伝的アルゴリズムに完全に新しいです)


@Christopheルート内の2つの保留の間の最小/最大距離に制限を追加すべきではありませんか?
GertVdE 2013

現在、私はどの色がどこに行くかを決定したいだけです。ルートに実際に設定されるホールドのサイズ、形状、およびホールド間の距離は、目的のルートグレード(難易度)およびルートセッターの個人的なスタイルによって異なります。
クリストフ

@クリストフ:わかりました。しかし、問題はまだあいまいです。色はいくつありますか。いくつのセクターを埋める必要がありますか?前に述べたようにさまざまなルートの「品質」を無視する場合、各色で利用できる保留の合計量とルートごとの保留の平均数(または、正確な量)を考慮に入れますか?知っている)。そうでない場合は、各色が無限にあると想定する必要があります。
GertVdE 2013

私が行ったすべてのクライミングジムでは、特定のルートのホールドがホールドに隣接する壁に色付きのテープでマークされています-色はルートに特有です。これにより、ルートセッターは、色に関係なく、すべての保留から自由に選択できます。色の美しさのためにルートの品質を犠牲にしていますか?
Glenn

@グレン:まあ、どこにいたの?これを処理するローカルな方法があるかもしれません。私たちのクライミングジム(実際、私が行ったすべてのジム)では、ルートはホールドカラーでマークされています(これはハンブルクとその周辺にあります)。テープは落ちる傾向があり、下の13メートルからかろうじて見える場合があります。ルートセッターが選択できる十分なホールドがあり、これまではルートの品質を犠牲にしているという感覚がありませんでした。
クリストフ

回答:


2

私は遺伝的アルゴリズムのアプローチを使用して上記の問題を解決します。各解を整数のベクトルとしてコーディングします。

  • セクターあたりのルートの最大量をM(ユーザーが選択)と仮定します。Nセクターを想定
  • サイズM * Nのコーディングベクトルを作成します。各セグメントはセクターを表し、セグメント内の各アイテムはルートを表します。
  • 整数値、インデックスで色を割り当てます。ルートなしとして0を使用(Mより少ないルートを許可するため)
  • 各カラーインデックスについて、RGB値を持っている

次に、各セクターの最小色差とセクター内のルートの量(ベクトルのゼロの量)の重み付き合計として適合関数を定義します。あなたは使用することができますParadiseoのフレームワークやInspyredを遺伝的アルゴリズムの実装のために。


私はPythonの経験がないので、Paradisoを試してみます。また、Matlabを使用しているので、これにさらに1時間を費やすことができます。一般的な色差関数は機能しません(追加情報を参照)が、セクター内のルートとその周りのすべてのルートを考慮したフィットネス関数を考え出すことができます。
クリストフ

Matlab(またはOctave)の場合、このGAパッケージを
GertVdE 2013

Paradiseoから始められるかどうかを確認します(優れたアルゴリズムがあり、UIやその他のものを追加したい場合は、C ++を拡張する方が簡単です)。それが難しい場合は、Matlabを使用します。Matlabのグローバル最適化ツールボックスも機能するはずです。遺伝的アルゴリズムが含まれています。
クリストフ

1
簡単なコメントを追加しましょう。同じルートで色を並べ替えても適合度関数は変更されないため、単一のセクターに対してすべての「nで選択」k可能な色の組み合わせのテーブルを作成し、色ベクトルの代わりにインデックスを格納できます。このテーブルの行に。そうすることで、2つのルートが与えられた場合、色の互換性の計算は、小さな三角行列への単純なルックアップに減少します(diagは色の組み合わせ自体のメリットです)
Stefano M

1
ParadisEOを使用してこの問題のGAを2日間で実装できたので、この回答を受け入れます。まだ作業中ですが、正常に動作しているようで、いくつか調整する必要があります。追加の回答として、実装の詳細を投稿することは適切ですか?
クリストフ

0

ここに私の現在の実装の簡単な概要があります、私は概念に固執して言語の詳細には触れないようにします。私は、遺伝的アルゴリズムのC ++テンプレートライブラリであるParadisEOフレームワークを使用し、あちこちにブーストを追加しました。

クライミングホールドカラー

保持色は、色の名前と量のペアとしてXMLファイルに保存されます。ファイルで見つかった金額が合計され、正規化されます。これにより、この色で設定できるルートの総数、またはパーセンテージで金額を表すことができます。各色には1から始まるIDが割り当てられています。ゼロは「空の」ルート用に予約されています。

色の組み合わせペナルティ

一部の色は、1つのセクターまたは隣接するセクターでうまく連携しません。あまり良くない色の組み合わせはすべて、2つの色名(前のXMLファイルのように、上記を参照)と任意の「悪さ」で表されます。内部的には、悪さの値は、カラーIDでインデックス付けされたマトリックスに格納されます。

WallはParadisEOのゲノム表現クラスから派生したクラスであり、ParadisEOが操作および評価できるようになっていますが、いくつかの機能が追加されています。各遺伝子は、IDによって1つのルートの色を表します(ゼロまたは空を含む)。セクターは遺伝子へのインデックスのペアで表されるため、各セクターには始まりと終わりがあります。最初に遺伝子のイテレータを使用しましたが、Wallオブジェクトはコピー構築可能である必要があり、追加の作業なしにイテレータを無効にします。現在、すべてのセクターに4つのルートがありますが、将来的には構成可能になる予定です。

壁にも色のバケツがあります。このバケットには、カラーXMLファイルで説明されているように配布される各色のカウンターが含まれています。カラーカウントの合計は、壁のルートの総数になります。バケツから色を選択してカウンターを減らしたり、元に戻したりしてカウンターを増やすこともできます。

セクターにまだその色が含まれていない場合にのみ、セクターに色を追加できます(色を追加するとき、セクターは「合法」のままである必要があります)。

評価オペレーター

評価演算子は、上記の不良マトリックスを使用して、セクター内のすべての不良値を合計します。各セクターの値はフィットネスベクトル(Wallクラスの一部でもある)に格納されるため、これは多目的GAです。必要に応じて変更する場合があります。

2点交差演算子

クロスオーバー演算子は2つの親を取り、それぞれの子(子孫)のコピーを作成してから、セクター全体を再結合して2ポイントのクロスオーバーを実行します。これの利点は、セクターが合法のままであることです(ダブルカラーなし)。クロスオーバー操作(この問題の場合)の欠点は、親で色がクラスター化されている場合、結果の子孫に余分な色が含まれる可能性があることです。過剰なルート(色0)をランダムに削除する修復機能が追加されました。したがって、子孫のルートは、修復の親が子孫を変更した場合よりも少なくなります。

突然変異1:ルートを追加

子孫のルートの潜在的な減少は、「ルートの追加」演算子によって説明されます。壁のバケツから色を取り、どこかに追加します。それが正当な操作でない場合は、何もしません(残りの色に正当な場所がない場合があります)。

突然変異2:ランダム交換

2つのランダムなセクターの2つのランダムなルートが交換されます。このスワッピングのペアは、結果のセクターが合法になるまで生成され、次にスワップが実行されます。

突然変異3:シフト

複数のセクターが左に1桁シフトします。

もう時間がないですが、後でさらに情報を追加するかもしれません。特に評価はそのままで非常に簡単で、コンポーネントはconecptの証明としてプログラムされました。GAは確かにある程度まで壁を最適化しますが、結果は実際に使用する準備ができていません。ルートセッターと話し合ったときにこれは改善され、評価のためのより多くのルールが利用可能になると確信しています。写真が利用可能になったときにも写真が表示されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.