次の記事は、データマジシャン、作者のZhou Hangによるものです
この記事の関連コードと例をダウンロードするには、公開番号[program ape sound]に注意してください。バックグラウンド応答[TSVRPJAVA]には[]が含まれていません
序文
みなさん、こんにちは!
Xiao Bianは9102がほとんど終わったことを見て、ますます不安を感じています。
どうして今年そんなにカイな気分になるの!
試験週が来る直前に、私はVRPTWを解決するためにタブー検索アルゴリズムに関するこの記事を書き、一時的に仏の足をつかんで、今年何かを学ぶふりをしました。
この記事には、過去の先輩が書いたC ++コードから変更されたJavaコードの詳細な説明が付属しています。
ドライグッズ|タブウ検索アルゴリズムを習得するための10分で、タイムウィンドウ(C ++コードと詳細なコードコメントを含む)による配車ルートの問題を解決します
新しいコードには、忘れられた元の軽蔑基準が組み込まれ、冗長なコードが関数呼び出しに変更され、大規模なコメントが追加されています。VRPTWを試したことがない学生に適しています(そうです、私です)。
計算例は上記の形式なので、この記事のコードを注意深く読む前に、上記を参照することをお勧めします。
今日から共有を始めましょう!
VRPTWの概要
VRPTWの問題は次のように説明できます。配送センターが、商品の配送時間に対する要件が異なる、周辺の地理的な場所にあるいくつかの顧客の場所に配送サービスを提供するとします。その中で、配送センターで使用される車両はすべて同じモデル(つまり、容量と速度が同じ)であり、配送センターには車両の出入り時間に制限があります。私たちの仕事は、すべての車両の移動経路の合計を最小化するルートを見つけることです。
VRPTWのより詳細な紹介は、前のツイートを参照できます。
乾燥品| 10分でCPLEXをマスターし、VRPTW数学モデルを解く(JAVAコードとCPLEXインストールプロセスを使用)
記事の独立性を維持し、同時に後続の説明を容易にするために、モデリングの例を次に示します(参照は記事の最後にマークされています)。
リクエストされたすべての車両ルートは、次の要件を満たしている必要があります。
これに基づいて、各車両の合計時間が最短のルート(車速は同じであるため、最短の時間は最短距離に相当します)。(一部の車両は許可されていません)
タブーサーチについて
タブー検索アルゴリズム(TSと省略)は、人間の記憶機能の模倣に由来し、メタヒューリスティックスです。これは、最初の実行可能なソリューションから始まり、一連の特定の検索方向(動き)を探索し、特定の目的関数の値を最大化する動きを選択します。ローカル最適解に陥らないようにするために、タブー検索は、経験した検索プロセスの情報を記録し、次の検索方向を導きます。
タブーサーチは人工知能の顕現であり、ローカルサーチの拡張です。タブー検索は、実行されたいくつかの操作を表にするタブーリストを設定し、軽視基準を使用していくつかの優れたソリューションのブロックを解除することにより、ローカル検索に基づいています。
タブー検索アルゴリズムの具体的な内容については、以前のツイートを参照してください。
ドライグッズ|どんな種類のアルゴリズムが人々をそんなに必死にすることができますか?
乾物| 10分のクイックレビュータブー検索(c ++バージョン)
TSはVRPTWを解決します
近傍検索アルゴリズムの場合、採用された検索演算子と評価関数は重要です。以下では、VRPTWの挿入演算子と評価関数をコードに詳しく紹介します。
挿入演算子:
評価関数:
アルゴリズムの概要
詳細なJavaコード
この記事の関連コードと例をダウンロードするには、公開番号[program ape sound]に注意してください。バックグラウンド応答[TSVRPJAVA]には[]が含まれていません
コードは主に次のカテゴリに分類されます。
メイン、メイン関数;
CustomerType、顧客ノードの情報を格納します;
RouteType、車両ルート情報を格納します;
パラメータ、グローバル変数を格納します;
EvaluateRoute、プロセスルートメソッド;
InitAndPrint、初期化および出力対応メソッド;
TS、タブー検索メソッド
次に、それらを個別に紹介します。
メイン:プログラムの入り口。
CustomerType:顧客クラス図の各顧客について、顧客クラスを作成し、独自の番号、車両ルート、座標位置、アクセス時間枠、サービス期間、および需要を格納します。
RouteType:ルートタイプ。総キャパシティ、ルートの全長、時間枠制約の違反の合計、および単一ルート上の顧客ノードのシーケンスを記録します。
パラメータ:パラメータクラス、VRPTWおよびTSに関する変数がここに格納され、データがここで変更されます。
EvaluateRoute:チェック機能は、結果として得られるソリューションのテストです。
挿入演算子によって生成された解はすべての制約をすべて満たすわけではないため、ローカル検索によって生成されたより良い解は、実行可能解かどうかを決定する前に、時間枠制約と容量制約が満たされているかどうかを判断する必要があります。
局所最適解をチェックするプロセスで、ペナルティ係数AlphaおよびBetaの値を変更します。
UpdateSubT関数は、車両ルートの各顧客ポイントでの時間枠違反の量を更新します。結果は、ルート全体をトラバースして累積することで得られます。
計算関数は目的関数の値を計算し、ペナルティ部分が累積され、ペナルティ係数が乗算されます。
InitAndPrint:計算された距離に従って。
ファイルからスタディを読み取り(ここでスタディを変更し、同時にParameterクラスのパラメーターを変更することを忘れないでください)、現在のソリューションルート[]の各ルートを初期化します。開始点と終了点は配布センターです。
顧客間の距離が記録され、グラフ配列に格納されます。
構築は初期ソリューションを構築します。最初の解は前の疑似コードに従って構築され、ノードは毎回ランダムに選択されます(順序付けられた数列を破壊するのと同様)。
ノードの容量制約を満たし、時間枠の開始時間が要件を満たしている場所を見つけ、ノードを挿入します。ノードを挿入するときは、ノードが属するパスを必ず更新してください。時間枠違反を初期化します。
最後に、CheckAns関数を追加して、出力ソリューションが時間ウィンドウ制約を満たし、計算された距離が正しいかどうかを確認します。
TS:最初に、挿入演算子の実行部分である2つの補助関数addnodeとremovenodeがあります。
すべてが準備できたので、私はそれを風に負っているだけです。タブー検索ルーチンに従ってすべてのツールを統合し、コードフレームワークを構築する必要があるだけです。
ルート[]配列を使用して現在のソリューションを格納するため、データの一部を挿入操作の前に保存し、目的関数の計算後に復元操作を実行する必要があります。
タブーテーブルを更新する場合、タブーステップサイズの式を柔軟に変更できます。
ローカル最適解を判断し、実行可能なグローバル最適解を選択することを忘れないでください。
計算例
テストには、標準のソロモンテストデータc101.txtを使用します。(計算例はメッセージエリアからダウンロードできます)
VehicleNumber = 25;
容量= 200;
ノード25、50、100の数をそれぞれテストします。正確なソリューションは次のとおりです。
CustomerNumber = 25:
CustomerNumber = 50:
CustomerNumber = 100:
私たちのコードの精度はまだ非常に良いことがわかります~~
もちろん、私たちは不運を除外せず、非常に貧弱な解決策を得ます。キャラクターが反復回数IterMaxを手動で調整できるとは思わないでください。
この号の内容はほぼここにあります!ハッピー!
ここで、ヒューリスティックアルゴリズムの学習プロセスでは、コードを書く能力が非常に重要であることを皆さんに思い出させます。VRPTWは優れたキャリアであり、学習したアルゴリズムの知識を実践に適用する時間のある読者に推奨されます。エディターはあなたと一緒に学び、進歩します!
またねヾ( ̄▽ By)バイバイ
参照:
Cordeau、JF、Laporte、G.&Mercier、A.。(2001)。タイムウィンドウでの配車ルートの問題に対する統合タブー検索ヒューリスティック。 オペレーショナルリサーチソサエティのジャーナル**、 52(8)、928-936。
コード参照:
ドライグッズ|タブウ検索アルゴリズムを習得するための10分で、タイムウィンドウ(C ++コードと詳細なコードコメントを含む)による配車ルートの問題を解決します