1

巡回セールスマン問題の解決策を見つけるために、Google のortools.constraint_solverを使用しています。ここに見られるように。1 セットのポイントでプログラムを実行すると、すべてが期待どおりに機能します。

これが機能するようになったので、すべてのセットをループし、各セットで制約ソルバーを呼び出すことにより、複数のポイント セットの TSP を解決しようとしています。

特定の問題のサイズに応じてgflag を再定義する以下のコードがありますtsp_size(すべてのセットが同じサイズであるとは限りません)。

gflags.DEFINE_integer('tsp_size', len(points), 'Size of Traveling Salesman Problem instance.')

繰り返しますが、指定されているセットが 1 つだけの場合は機能しますが、2 番目のセットに対して実行すると、次のエラーが発生します。gflags.DuplicateFlagError: The flag 'tsp_size' is defined twice.

複数のグラフがあることを考慮して、プログラムの同じ実行内で制約ソルバーの個別のインスタンスを作成するにはどうすればよいですか?

4

1 に答える 1

0

各反復の開始時にモジュールをインポートしてから、 で削除することでこれを解決しましたsys.modules

これにより、セットのサイズに固有の gflag 構成値を使用して、各セットの制約ソルバーの新しいインスタンスが得られます:)

for graph in graphs:
    import shp
    shp.run(graph)
    del sys.modules['shp']

編集:

上記のコードはshp.py、メインとして実行されていなかったため、問題が発生していました。私はこれを使用することになりました:

from subprocess import call

# graph_files is a collection of filenames each referencing graph txt files I'm using.    
for fn in graph_files:
    call(["python", "shp.py", fn])

subprocess.Popenこれを非同期で行うために使用します。

これが誰かに役立つことを願っています。

于 2015-06-29T04:18:08.163 に答える