DuplicateFlagError при запуске решателя ограничений TSP Google or-tools на нескольких графах

Я использую ortools.constraint_solver от Google, чтобы найти решения для коммивояжера Проблема. Как видно здесь. Все работает должным образом, когда я запускаю программу на одном наборе точек.

Теперь, когда у меня это работает, я пытаюсь решить TSP для нескольких наборов точек, перебирая все наборы и вызывая решатель ограничений для каждого набора.

У меня есть приведенный ниже код, повторно определяющий gflag _ 1_ в зависимости от размера конкретной задачи (не все наборы имеют одинаковый размер):

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

Опять же, он работает, когда указан только один набор, но после его запуска для второго набора я получаю сообщение об ошибке: gflags.DuplicateFlagError: The flag 'tsp_size' is defined twice.

Как я могу создать отдельные экземпляры решателя ограничений в рамках одного запуска программы, учитывая, что у меня несколько графиков?


person sgarza62    schedule 28.06.2015    source источник
comment
Вы можете перечитать Как спросить.   -  person boardrider    schedule 28.06.2015
comment
@boardrider Не могли бы вы объяснить свое отвращение к этому вопросу? Я вижу, что вы еще не внесли значительного вклада в работу сайта; может вы неправильно понимаете, что считается приемлемым? :)   -  person sgarza62    schedule 29.06.2015


Ответы (1)


Я решил эту проблему, импортировав модуль в начале каждой итерации, а затем удалив его в 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, чтобы сделать это асинхронно.

Надеюсь, это кому-то поможет.

person sgarza62    schedule 29.06.2015