Здравствуйте, kov_serg, Вы писали:
K>>Пока у меня есть идея, как сделать алгоритм для линейных алканов:
_>У вас атом развывают чем? Если его обстреливают. То имеет смысла так осколки и строить по томуже принципу а не все подряд. Попали в атом, он получил энергию достаточную что бы разорвать связи и улететь вместе с ближайшим окружением, т.е. порвать наиболее слабые связи. Далее имея некое распределение вероятностей осколков вы можете их комбинировать в более сложные конструкции, при этом приписывая им вероятность на основе вероятностей составных частей. Нафига перебирать конфигурации с около нулевой вероятностью
Да, я тут разбираюсь в теме и честно говоря мой изначальный вопрос про алгоритмы, возможно, уже не актуален. Мои вопросы надо задавать химикам а не программистам, но я всё-таки тут напишу их, может кому интересно.
Наверно да мне надо в исходной задаче брать не брутто-формулу, а структуру молекулы (набор атомов и связей между ними), и оценивать как она развалится при обстреле электронами. Мне сказали что перегруппировочные ионы бывают достаточно часто, и надо выяснить наиболее вероятные пути их образования. Слышал что есть изученные виды перегруппировок, в частности перегруппировка Маклаферти и миграция двойной связи, буду это разбирать. И мне показалось что есть какой-то общий механизм перегруппировок, который заключается в том, что из молекулы выбиваются отдельные связи и дальше всё разлетается или рекомбинирует.
Возьмём эту молекулу:
Я сейчас полагаю, что надо сделать такой алгоритм: перебрать в молекуле все пары (вариант — тройки) связей, которые мы удаляем, и смотреть осколки и их комбинации. Для этой молекулы, если удалить связи например C1-C10 и C4-C20, образуются три фрагмента, которые являются радикалами и могут перекомбинироваться, итого имеем такие варианты осколочных ионов:
Буду разбираться, насколько годится такой алгоритм. Тут можно много придумать, например указать что обычные связи могут рваться в количестве до трёх, а ароматические — только два, и так далее. Хорошо бы оценить прочность каждой связи в молекуле, методами квантовой химии это считать муторно, а может есть более простые подходы вроде анализа заселённостей связей (электронная плотность на связях и т.п.).
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Здравствуйте, Khimik, Вы писали:
K>Продолжение этой темыАвтор: Khimik
Дата: 09.06 17:02
. Есть брутто-формула молекулы, например C6H6. Нужно перебрать все осколки, и далее для каждого осколка перебрать все возможные связи в нём, чтобы проверить – можно ли расставить связи так, чтобы валентность водорода была всегда 1, а валентность углерода от 1 до 4. Т.е. c C6H6 можно сгенерировать осколок CH4 или H2, но нельзя CH5 или H3.
K>Я пока решил эту задачу в лоб. Для молекулы из n атомов строится массив n*(n-1)/2 – все возможные пары атомов. В массиве хранятся булевы значения, т.е. если true – значит эта связь есть. Программа перебирает все комбинации связей по алгоритму в теме по ссылке выше; если например в молекуле 10 атомов, то число возможных пар атомов будет 10*9/2=45, и число всех комбинаций 2^45. Для каждой комбинации программа проверяет текущую валентность всех атомов (попадает ли она в мои критерии). И даже для десятитомной молекулы ресурсов компьютера не хватает, чтобы всё перебрать.
K>Как оптимизировать этот алгоритм?
Я, как и большинство ответивших, не химик, но вижу здесь задачу на нагруженных графах. Возможно, стоит курить в этом направлении.
Узел — атом, ребро — межатомная связь и так далее. Думаю, если начать описывать задачу с этой стороны, то потом можно будет прикрутить
какое-либо существующее решение на графах.
Здравствуйте, Khimik, Вы писали:
K>Продолжение этой темыАвтор: Khimik
Дата: 09.06 17:02
. Есть брутто-формула молекулы, например C6H6...
Освой рекурсивные функции (это функции, которые могут вызывать сами себя.
И научись ими обходить графы. В том числе граф, который ты строишь этой же функцией.
Можешь сначала потренироваться на построении дерева шахматных ходов.