Оптимизационная задача в комбинаторике
От: Khimik  
Дата: 10.06.24 08:02
Оценка:
Продолжение этой темы
Автор: Khimik
Дата: 09.06.24
. Есть брутто-формула молекулы, например C6H6. Нужно перебрать все осколки, и далее для каждого осколка перебрать все возможные связи в нём, чтобы проверить – можно ли расставить связи так, чтобы валентность водорода была всегда 1, а валентность углерода от 1 до 4. Т.е. c C6H6 можно сгенерировать осколок CH4 или H2, но нельзя CH5 или H3.
Я пока решил эту задачу в лоб. Для молекулы из n атомов строится массив n*(n-1)/2 – все возможные пары атомов. В массиве хранятся булевы значения, т.е. если true – значит эта связь есть. Программа перебирает все комбинации связей по алгоритму в теме по ссылке выше; если например в молекуле 10 атомов, то число возможных пар атомов будет 10*9/2=45, и число всех комбинаций 2^45. Для каждой комбинации программа проверяет текущую валентность всех атомов (попадает ли она в мои критерии). И даже для десятитомной молекулы ресурсов компьютера не хватает, чтобы всё перебрать.
Как оптимизировать этот алгоритм?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать." Р.П. Уоррен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.