私はこれに数日間取り組んできましたが、成功しませんでした。基本的に、2D マトリックスに配置された多数のノードがあります。各ノードには、それぞれ 3 つと 2 つの隣接ノードがある行列の側面とコーナーのノードを除いて、4 つの隣接ノードがあります。長方形の領域に並べて配置された正方形のカードの束を想像してみてください。このプロジェクトは、実際には一種のカード/ボード ゲームをシミュレートしています。
各ノードは、その周囲のノードに接続されている場合と接続されていない場合があります。各ノードには関数 (get_connections()) があり、接続されているノードのすぐ周囲のノードを返します (つまり、0 ~ 4 個のノードが返されます)。各ノードには、ボード マトリックス上の位置を含む "index" プロパティもあります (例: '1, 4' -> 行 1、列 4)。私がやろうとしているのは、特定の「開始」ノードを指定して、接続されたノードの最長の非反復パスを見つけることです。
私がやろうとしていることの良いアイデアを与えるはずのいくつかの画像をアップロードしました:
(ソース: requiredgames.com )
(ソース: requiredgames.com )
両方の画像で、強調表示された赤いカードは、おそらく左上のカードを含む接続されたカードの最長パスです。ただし、両方の画像で、パスにあるはずのカードがいくつか除外されていることがわかります (最初の画像ではルーマニアとマルドバ、2 番目の画像ではギリシャとトルコ)。
開始ノード/カードを指定して、最長パスを見つけるために現在使用している再帰関数を次に示します。
def get_longest_trip(self, board, processed_connections = list(),
processed_countries = list()):
#Append this country to the processed countries list,
#so we don't re-double over it
processed_countries.append(self)
possible_trips = dict()
if self.get_connections(board):
for i, card in enumerate(self.get_connections(board)):
if card not in processed_countries:
processed_connections.append((self, card))
possible_trips[i] = card.get_longest_trip(board,
processed_connections,
processed_countries)
if possible_trips:
longest_trip = []
for i, trip in possible_trips.iteritems():
trip_length = len(trip)
if trip_length > len(longest_trip):
longest_trip = trip
longest_trip.append(self)
return longest_trip
else:
print
card_list = []
card_list.append(self)
return card_list
else:
#If no connections from start_card, just return the start card
#as the longest trip
card_list = []
card_list.append(board.start_card)
return card_list
ここでの問題は、processed_countries リストと関係があります。私の最初のスクリーンショットを見ると、何が起こったかがわかります。ウクライナがやってきたとき、最長経路 (マルドバ-ルーマニア、またはトルコ) の 2 つの可能な選択肢を調べたことです。 、ブルガリア) は、両者が同等であることを確認し、無差別に一方を選択しました。ハンガリーがやってきたとき、ウクライナによってルーマニアがprocessed_countriesリストに追加されているため、ルーマニアを通るパスを作成しようとすることはできません(実際には最長のパスがあります).
これに関するヘルプは非常に高く評価されています。再帰的であろうとなかろうと、これに対する解決策を見つけていただければ、喜んで $$ を寄付させていただきます。
完全なソース コード (Python 2.6、Pygame 1.9 が必要) を次の場所にアップロードしました。
http://www.necessarygames.com/junk/planes_trains.zip
関連するコードは src/main.py にあり、すべて実行するように設定されています。