Если вас интересуют такие вещи, я рекомендую вам попробовать некоторые проблемы в проекте euler, например, http://projecteuler.net/problem=15
В модуле pythons itertools есть несколько примеров с примером кода.
Вы можете преобразовать пример кода на язык программирования по вашему выбору.
http://docs.python.org/library/itertools.html
функции выборки:
product('ABCD', repeat=2) AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD
permutations('ABCD', 2) AB AC AD BA BC BD CA CB CD DA DB DC
combinations('ABCD', 2) AB AC AD BC BD CD
combinations_with_replacement('ABCD', 2) AA AB AC AD BB BC BD CC CD DD
пример кода:
def combinations(iterable, r):
# combinations('ABCD', 2) --> AB AC AD BC BD CD
# combinations(range(4), 3) --> 012 013 023 123
pool = tuple(iterable)
n = len(pool)
if r > n:
return
indices = range(r)
yield tuple(pool[i] for i in indices)
while True:
for i in reversed(range(r)):
if indices[i] != i + n - r:
break
else:
return
indices[i] += 1
for j in range(i+1, r):
indices[j] = indices[j-1] + 1
yield tuple(pool[i] for i in indices)
Обратите внимание, что в приведенной выше проблеме, если вы позволяете ей перейти от точки x1, y1 к точке x2, y2 на расстоянии по прямой линии, то это не та же проблема. (так как вы можете отсортировать точки и поместить их в пространственную структуру данных). Я думаю, что в задаче о коммивояжере у вас должны быть «ветреные / холмистые дороги», так что даже если две точки расположены близко друг к другу по x и y, они могут иметь большой взвешенный край, соединяющий их.