申し訳ありませんが、次のアルゴリズムのアルゴリズムまたは問題の名前がわかりません。私は問題を述べ、次に私が試したことを述べます。おそらく誰かが私を正しい方向に向けることができます.
あなたがアイテムのバッグを持っていると想像してください(注文されていない、重複は許可されています)。実際には、この緩和が役立つ場合に備えて、バッグには 2 ~ 20 個のアイテムが含まれる場合があります。
目標は、バッグ内のすべてのアイテムを任意の順序で含む最小の長さのチェーン (チェーンの概念が異なる場合の順序付けられたリンク リスト) を見つけることです。
チェーンは、開始トークン (バッグに存在しない) とそれに続く任意の数のアイテムと、それに続く終了トークン (これもバッグに存在しない) で構成されます。
チェーンは、n 個のタプル (順序が重要です) をつなぎ合わせることによって形成されます。さらに緩和するために、n の値はすべてのタプルで同じであるとしましょう。実際には、n = 3 で作業しています。要素が重複している場合、チェーンは連結ではなく「ブレンド」される場合があります。たとえば、(a,b,c) と (c,d,e) を考えてみましょう。は (a,b,c,d,e) のように結合できます。同様に、(a,b,c) と (b,c,d) を結合して (a,b,c,d) にすることもできます。一部のタプルでは最初の位置に開始トークンがあり、一部のトークンでは最後の位置に終了トークンがあり、もちろん問題の解決策が得られます。
したがって、問題の正確な解決策は一般的に扱いにくいように思えます。問題の「良い」解決策を得るには、ある種の最適化アルゴリズムが必要です。私が一緒に暮らすことができる「良い」ソリューション。
私が始めたのは貪欲なアプローチです。最初のパスで、バッグ内の要素の数が最も多いタプルを見つけ、恣意的に関係を壊します。これまでに構築したチェーンを保持するデータ構造を作成し、選択したタプルをこのデータ構造に貼り付けます。問題を開始トークン側と終了トークン側の 2 つのサブ問題に分割します。サブ問題 1 のデータ構造の最初のトークンが開始トークンになり、サブ問題 2 の最後のトークンが終了トークンになるまで、できるだけ早く停止条件を見つけようとするように (開始または終了トークンに応じて) チェーンを成長させます。副問題について)できるだけ早くバッグの中身を使い果たしようとします。
この問題をどこかで見た人はいますか? このアルゴリズムを改善する (または正しく動作させる) 方法について何か考えはありますか? これは私が取り組んでいる実際の問題であり、はるかに大きなシステムのスマートな部分であり、おもちゃの問題でも宿題の問題でもありません。
編集
今日はパソコンから離れていてごめんなさい。些細すぎず、複雑すぎて見えない解決策の例を投稿しようと思います。
与えられた:
Bag = {A, B, C, D}
(例としてセットにしていますが、各アイテムは複数回出現する可能性があります)/ = Start Token
\ = End Token
3-タプル (トリプル): 命名を簡単にするために、これらに ag というラベルを付けます。この問題では、小文字には実際の機能はありません。
(/,A, E) a (/,C, D) b (/,G, H) c (D,B, A) d (C,G, H) e (B,A, \) f (G,H, \) g
解決策: b、d、および f を連結すると、 が得られ(/,C,D,B,A,\)
ます。
これは、開始トークンと終了トークンの両方を数える場合、長さ 6 のバッグ内のすべての要素を含む可能な限り短いチェーンです。一般に、可能な最短経路の長さは |BAG| です。+ 2 (実際に存在する場合)。私の問題文がより意味のあるものになることを願っています。