web-dev-qa-db-ja.com

ロケーション間の依存関係を持つ巡回セールスマンアルゴリズムを実装する方法

ロケーション間の制約を伴う巡回セールスマンまたは購入者アルゴリズムを実装する方法はありますか?たとえば、アイテムBの前にアイテムX、Dの前にc、F、G、Hを任意の順序で取得する必要があります。

5
SaadK

ウィキペディアには、標準TSPの正確かつヒューリスティックなソリューションの いくつかのアプローチ がリストされています。これらのアプローチはいずれも、特別な順序で解の空間と部分的な解を探索します。したがって、私はそれらのほとんど(おそらくすべて)を、追加の依存関係を満たすソリューション(部分的および完全)に制限することで拡張できると思います。

簡単な例として、最近接ヒューリスティックは通常、1つの場所を次々と選択し、常に最も近い未訪問の場所を選択します。 Xを以前に訪問したことがない限り、B以外の最も近い場所を選択するという追加の制約によってこれを拡張します。

もちろん、最適に近い本当に良い解を見つけるには、 シミュレーテッドアニーリング のようなより洗練されたものを実装する必要があります。

2
Doc Brown

one依存関係、「アイテムBの前にアイテムXを取得」しかない場合、解決策は簡単です。

最短のルートを見つけます。そのルートでBの前にXに遭遇するか、ルートを反対方向に移動します。

1
gnasher729

私があなたの質問を理解している限り、あなたが解決しようとしている問題は、優先順位制約のある巡回セールスマン問題の名の下で研究されており、これが検索の良い出発点になるかもしれません。

混合整数プログラミングで問題を解決する場合は、シーケンスを表す各ノードに整数変数を追加できます。デポのシーケンスは0に固定されています。他のすべてのノードでは、s_iがソリューションのノードiのシーケンスを表し、x_ijがノードiとjの間のアークが使用されるかどうかを表すバイナリ変数である場合、次のことができます。次の制約を追加:s_j> = s_j + 1-M *(1-x_ij)、ノードi、jのすべてのペア

ここで、Mは十分に大きな値を表します。

次に、Bの前にAにアクセスする必要がある場合は、s_A <s_Bを示す制約を追加する必要があります

0
Renaud M.