2013-04-09 11 views
11

私は依存アルゴリズムに問題があります。依存関係は厳密なバージョンスコープに基づいていることを除いて、依存関係はmaven依存関係と似ています。例えばバージョンスコープベースの依存関係を解決するアルゴリズム

component A, version 1 depends on: component B, version 1~3; and component C, version 2~3 
component D, version 1 depends on: component B, version 2~4; and component C, version 1~2 

は今、私は、成分A、バージョン1および成分D、バージョン1をインストールしたい場合、彼らはすべてのコンポーネントBに依存しているため、依存関係を取得したい、Cので、私また、より多くのBとC

の正しいバージョンを取得するには、正しいアルゴリズムを必要とする、私は例えば、成分AとDをアップグレードする必要があり、今私は、新しいバージョンの下にあります

component A, version 2 depends on: component B, version 3~5; and component C, version 4~5 
component A, version 3 depends on: component B, version 6~7; and component C, version 4~5 
component D, version 2 depends on: component B, version 3~4; and component C, version 3~4 

これで、AとDの正しいバージョンを取得するためのアルゴリズムと、そのすべての依存関係をアップグレードする必要があります。 1つの問題はコンポーネントAのバージョン3とコンポーネントDです。バージョン2はコンポーネントBの依存関係の競合があります

この問題を解決する既存のアルゴリズムはありますか?または同様の(簡単な)問題。提案はありますか?

データがたくさんあるべきではないので、パフォーマンスを考慮しないでください。

ありがとうございます!

+0

簡単な解決策として、トポロジカルソートを使用できますか?まず、すべてのノードが{ノードID、バージョン番号}であるグラフを作成します。その後、トポロジカルな並べ替えを行って依存関係の順序を取得します。 – trequartista

+0

私のケースでは、依存関係は1つのコンポーネントバージョンを解決するだけで済みます。したがって、同じノードIDを持つノードのグラフを作成する場合、出力リストは1つのノードのみを出力する必要があります。いくつかのノードでは、それらのバージョンが競合する可能性があるため、そのようなノードは決して出力リストに存在しない可能性があります。この問題を解決するには? – Xilang

+0

いいえ、私はどういう意味ですか、各ノードにはノードIDとバージョンIDの両方があります。すなわち、 {Component A、version 1}と{Component A、version 2}は異なるノードです。したがって、例えば: – trequartista

答えて

1

これはsatisfiability problemの亜種です。 osgiもそれに対処しなければならない。したがって、osgiの仕様や実装を見て、それらがどのように解決しているかを見ることができます。

11

この問題は、3SATからの次の削減を介してNPハードです。 3CNFの式が与えられた場合、各変数には2つのバージョンのコンポーネントがあり、各セクションには3つのバージョンのコンポーネントがあります。 「スーパー」コンポーネントの1つのバージョンをインストールしたいと思います。これは、すべての句コンポーネントに依存していますが、バージョンについては気にしません。各節について、節の構成要素1は、リテラルが正の場合はバージョン1が必要、負の場合は0で、節に表示される最初の変数に依存します。句2は第2変数などに依存します。式が充足可能である場合に限り、スーパーコンポーネントをインストールできます。

この削減に照らして、問題をconstraint satisfactionと定式化することは理にかなっています。各コンポーネントは、そのコンポーネントのバージョンを示す可能性のある変数であり、インストールされているコンポーネントがない場合は「インストールされていません」というオプションです。コンポーネントBのバージョンに依存するバージョンを持つすべてのコンポーネントAについて、バージョンの選択をそのドメインの製品の特定のサブセットに制限する、AおよびBの変数に関する制約があります。最初の例のAとBについては、バージョン1はBバージョン1〜3に依存するため、これは{(1,1)、(1,2)、(1,3)}です。 Aのバージョン2も利用可能である場合、この制約は{(1,1)、(1,2)、(1,3)、(2,3)、(2,4)、(2,5) }。 AまたはBをインストールする必要がない場合は、{(none、none)、(none、1)、(none、2)、(none、3)、(none、4)、 (1,1)、(1,2)、(1,3)、(2,3)、(2,4)、(2,5)}の順である。

インスタンスが小さいため、おそらく完全なバックトラッキング検索が必要な場合があります。制約の伝播のための一般的なアルゴリズムは、アーク整合性を強制する、つまり除去されたものに基づいて、明らかに動作しないすべてのバージョンを考慮から除外する、AC-3です。例えば、制約{(1,1)、(1,2)、(1,3)}が与えられれば、決して出現しないので、B = noneを排除することができる。今度はBの選択肢が制限されているので、Bの依存関係Cなどについての推論を行うことができます。それ以上の単純化がなければ、推測する必要があります。 1つの戦略は、残っているバージョンが最も少ないコンポーネントを選択し、それらのすべてを再帰的に試してみることです(バックトラッキング)。

関連する問題