Я создал алгоритм, который определяет, какие атомы связаны в молекуле из списка атомов (учитывая их расстояние друг от друга).Чтобы думать об этой проблеме вне физического контекста, это просто проблема замкнутой сети, в которой узлы - это атомы, а ребра - это атомные связи, соединяющие атомы.У меня есть список узлов и список ребер, которые соединяют узлы, и мне нужно выяснить список каждой уникальной молекулы.Я сделал это в коде ниже, однако это довольно медленно и довольно некрасиво.Есть ли способ оптимизировать этот алгоритм?
Вот мой код, который работает, с соответствующей информацией для вас, чтобы попробовать его (я предоставлю другой список атомов, чтобы попытаться назвать пары _1 и selected_atom_1, просто измените пары pair_1 на парыи selected_atom_1 to selected_atom, чтобы он работал, конечно)
pairs = [[0, 1],
[0, 2],
[3, 4],
[3, 5],
[6, 7],
[6, 8],
[9, 10],
[9, 11],
[12, 13],
[12, 14],
[15, 16],
[15, 17],
[18, 19],
[18, 20],
[21, 22],
[21, 23],
[24, 25],
[24, 26],
[27, 28],
[27, 29],
[30, 31],
[30, 32],
[33, 34],
[33, 35],
[36, 37],
[36, 38],
[39, 40],
[39, 41],
[42, 43],
[42, 44],
[45, 46],
[45, 47]]
chosen_atom = [np.random.rand() for i in range(48)]
pairs_1 = [[0, 6],
[1, 7],
[2, 8],
[3, 9],
[4, 10],
[5, 6],
[5, 10],
[6, 7],
[7, 8],
[8, 9],
[9, 10]]
chosen_atom_1 = [np.random.rand() for i in range(11)]
# use list of lists to define unique molecules
molecule_list = []
for i in pairs:
temp_array = []
for ii in pairs:
temp_pair = [i[0], i[1]]
if temp_pair[0] == ii[0]:
temp_array.append(ii[1])
temp_array = set(temp_array)
temp_array = list(temp_array)
if temp_pair[1] == ii[1]:
temp_array.append(ii[0])
temp_array = set(temp_array)
temp_array = list(temp_array)
for iii in temp_array:
for j in pairs:
if iii == j[0]:
temp_array.append(j[1])
temp_array = set(temp_array)
temp_array = list(temp_array)
if iii == j[1]:
temp_array.append(j[0])
temp_array = set(temp_array)
temp_array = list(temp_array)
if len(temp_array) > len(chosen_atom):
break
molecule_list.append(temp_array)
molecule_list = [list(item) for item in set(tuple(row) for row in molecule_list)]
# the output of pairs should be
molecule_list = [[8, 6, 7],
[27, 28, 29],
[9, 10, 11],
[0, 1, 2],
[32, 30, 31],
[18, 19, 20],
[45, 46, 47],
[33, 34, 35],
[24, 25, 26],
[42, 43, 44],
[16, 17, 15],
[12, 13, 14],
[21, 22, 23],
[3, 4, 5],
[40, 41, 39],
[36, 37, 38]]
# the output of pairs_1 should be:
molecule_list = [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]
Итак, выше я привел результаты, которые я получаю сейчас и должен получить - любые идеи по улучшению этого кода будут высоко оценены.