私は巡回セールスマン問題全体とスタックオーバーフローに慣れていないので、正しくないことを言ったら教えてください。
イントロ:
複数の国(エリア)内の複数の都市(ノード)が関与するゲームの利益/時間最適化マルチトレードアルゴリズムをコーディングしようとしています。ここで、
- 接続された2つの都市間を移動するのにかかる物理的な時間は常に同じです。
- 都市は直線的に接続されていません(同時にいくつかの都市間でテレポートできます)。
- 一部の国(地域)には、他の国を経由する最短経路を利用できるテレポートルートがあります。
- 旅行者(またはトレーダー)は、小銭入れ、商品の重量、および特定の交易路で取引できる数量に制限があります。交易路は複数の都市にまたがることができます。
質問パラメータ:
メモリ内にデータベース(python:sqlite)がすでに存在し、ソース都市と宛先都市、配列と金額としての中間の最短パス都市、および総資本に対する%リターン(またはいずれの要因も制限されていない場合は、総資本に対して最大の利益をもたらす方法だけです)。
- 特定のプリセット時間(つまり30分)に対して最適な利益を見つけようとしています
- 新しい都市に渡るという行為は実際には同時です
- 通常、都市地図を移動するのに同じ定義された時間(つまり2分)かかります
- 最初の取引または新しい取引を開始する行為は、1つの都市地図を横断するのと同じ時間(つまり2分)かかります
- 私の出発点は実際には有効な取引がない可能性があります(最初/最も近い/最良のものに移動する必要があります)
これまでの疑似ソリューション
最適化
まず、所要時間に制限があり、各ホップにかかる時間(トレードを開始するための-1を含む)がわかっているため、ホップが。以下のすべてのトレードにグラフを制限できることに気付きましたmax_hops=int(max_time/route_time) -1
。この制限時間内に収まらない貿易データベースの要素を切り取り、最短経路の長さが。より大きい都市を剪定しますmax_hops
。
私は、現在の都市と、現在の都市ではないすべての既存の取引の開始都市との間の最短経路を含む取引データベースに別のエントリを作成し、それらに0%のリターンを与えます。これらをシティホップの数が、未満の場所に制限します。max_hops
また、現在の都市から開始都市に加えて最短パスホップを取引する都市が超過するかどうかを計算し、max_hops
この制限を超えた都市を削除します。
次に、そうでない残りの取引を(current_city->starting_city)
取得し、ホップが超過しないすべての目的地と開始都市の間で0%のリターンで取引ルートを追加しますmax_hops
次に、取引データベースに開始都市、目的地都市、または最短経路都市配列の一部として含まれていないすべての都市について、最後の整理を行います。
グラフ検索 制限時間内(つまり30分)に実行可能な取引の(はるかに)小さいグラフが残ります。
接続されているすべてのノードが隣接しているため、接続はデフォルトですべて加重1になります。%returnをトレードのホップ数で割ってから、逆数を取り、+ 1を加算します(これは、 100%帰路)。リターンが0%の場合は…2?
その後、最も収益性の高いルートを返す必要があります...
質問:
多くの場合、
お金やスペースを残したときに複数のルートを取る機能を追加して、単一の貿易ルートに個別のパスを介してルートを検索し続けるにはどうすればよいですか?市内で複数の価格と数量で販売されている商品の性質上、重複するルートが多数あります。
新しい交易路の開始にペナルティを課すにはどうすればよいですか?
この状況でグラフ検索はさらに役立ちますか?
ちなみに、
- グラフに対してどのような種類の整理/最適化を行う必要がありますか(または行わないでください)?
- 私の重み付け方法は正しいですか?私はそれが私に不釣り合いな重みを与えるだろうと感じています。パーセンテージリターンの代わりに実際のリターンを使用する必要がありますか?
- Pythonでコーディングしている場合、 python-graphなどのライブラリは私のニーズに適していますか?それとも、特殊な関数を作成するためのオーバーヘッドを大幅に節約できますか(私が理解しているように、グラフ検索アルゴリズムは計算量が多くなる可能性があります)。
- A *検索を使用するのが最善ですか?
- トレードデータベースの最短経路ポイントを事前に計算して最適化を最大化する必要がありますか、それともすべてをグラフ検索に任せる必要がありますか?
- 私が改善できることは何か気づきましたか?