Uncle4enni писал(а): ↑Пт ноя 17, 2023 3:55 pm
Вот именно, что вручную выходит, просто требует много обезьяней работы. От того мне и не понятно, что в этом сложного.
Вам же выше объяснили в разных словах в чём сложность: комбинаторный взрыв + сложность формулировки правил, по которым отсекать нереальные структуры.
Допустим, у Вас нет циклов, только вращение по всяким связям (разветвлённые алканы, например), и этих связей у Вас
N штук. Пусть на одну связь возможно три угла (0
o, 120
o, 240
o). Тогда число возможных конформаций у Вас имеет вид 3
N, т.е. экспоненциальный рост от числа связей. В случае 5 связей, их уже за 200 штук, а в случае 9 (например, декан, C
10H
22, маленькая молекула-то), их уже около 20 тысяч. Давайте оценим память на это дело, пусть 1 координата занимает 1 байт, на одну структуру нам нужно 32*3 байта, а всё это хозяйство для одной маленькой молекулы займёт 2 мегабайта. А представьте, что будет если Вы зададите молекулку на 100 атомов? Число конфигураций и размер на одну из них внезапно становится не таким маленьким
И это только для грубого упрощения в 3 значения угла поворота, на практике нужно брать более мелкое разделение, скажем, хотя бы 6-10 значений. А дальше из всего этого многообразия надо отобрать адекватные структуры. И тут возникает проблема, что при жёстком вращении по углам, без оптимизации других параметров, будут получаться "врезающиеся" друг в друга атомы. И что с ними делать? Допустим, они на расстоянии 2 Å друг от друга, надо их выкидывать? По каким радиусам делать отсечки (ковалентные, ван-дер-ваальсовы, ионные, и из какой таблицы)? А если мы немножко изменим другие параметры (связи, углы), они внезапно могут разъехаться, и такая "невыгодная" структура может по результату оказаться искомой.
Вот поэтому есть специальные алгоритмы, которые и занимаются решением каждой из этих проблем, тот же (Open)Babel, разные коды, типа Tinker-а, CREST, и ещё туча разных подходов и кодов.