Перевод понимания из интуиции в логику
От: Khimik  
Дата: 20.11.20 16:13
Оценка: :)
У меня возникла такая задача: определить в молекуле все циклы (точнее, ароматические циклы). Молекула – это набор атомов с декартовыми координатами и связей между ними. Например в этой молекуле два цикла по 6 атомов:



В этой молекуле четыре цикла по 6 атомов; если в ней удалить два центральных атома, останется один большой цикл из 14 атомов:



Я корпел несколько недель над алгоритмом, и то он получился несовершенным. А вы могли бы быстро что-то придумать?
Когда я писал этот алгоритм, возникли такие мысли. С одной стороны, достаточно мельком взглянуть на молекулу и сразу видно, где в ней циклы. В то же время формализовать это “видно” – задача на порядки более трудная. Судя по всему, понимание – штука сложная и понимание бывает на разных уровнях: одно дело – когда смотришь на молекулу и сразу понятно где в ней циклы, а другое дело – когда понятно с точки зрения алгоритма, что такое цикл и как его распознать.
Полагаю, такие же мысли приходят в голову разработчикам переводчиков. Когда мы видим текст на языке который мы знаем, нам он понятен и мы можем перевести его на другой язык; но в то же время формализовать это “понятно”, написать алгоритм который переводит текст – задача неимоверно сложная, особенно если не использовать нейросети.
Возникает вопрос: можно ли разработать эвристические приёмы, которые переводят “интуитивно-понятное” в “формализованно-понятное”? Например большой список универсальных вопросов.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re: Перевод понимания из интуиции в логику
От: Pzz Россия https://github.com/alexpevzner
Дата: 20.11.20 17:37
Оценка: +5
Здравствуйте, Khimik, Вы писали:

K>У меня возникла такая задача: определить в молекуле все циклы (точнее, ароматические циклы). Молекула – это набор атомов с декартовыми координатами и связей между ними. Например в этой молекуле два цикла по 6 атомов:


Ну т.е., ненаправленный граф. Заметим заодно, что координаты атомов не влияют на топологию, важны только связи.

K>Я корпел несколько недель над алгоритмом, и то он получился несовершенным. А вы могли бы быстро что-то придумать?


Алгоритм поиска циклов в графе является классическим. Но слово "граф" надо знать самому.
Re: Перевод понимания из интуиции в логику
От: anonymouse2 Иностранный Агент
Дата: 20.11.20 17:37
Оценка: +4
Здравствуйте, Khimik, Вы писали:

K>У меня возникла такая задача: определить в молекуле все циклы (точнее, ароматические циклы). Молекула – это набор атомов с декартовыми координатами и связей между ними. Например в этой молекуле два цикла по 6 атомов:


Под циклом ты понимаешь кратчайший путь из атома в этот же атом минимум через два других атома и без повторных проходов через уже пройденные атомы, или не обязательно кратчайший?

K>В этой молекуле четыре цикла по 6 атомов; если в ней удалить два центральных атома, останется один большой цикл из 14 атомов:


Если искать не только кратчайшие циклы, то здесь их значительно больше чем 4.
Нет такого преступления, на которое не пошло бы суверенное родоплеменное быдло ради продления своего бессмысленного рода и распространения своего бессмысленного генома.
Re[2]: Перевод понимания из интуиции в логику
От: Khimik  
Дата: 20.11.20 17:43
Оценка:
Здравствуйте, anonymouse2, Вы писали:

A>Здравствуйте, Khimik, Вы писали:


K>>У меня возникла такая задача: определить в молекуле все циклы (точнее, ароматические циклы). Молекула – это набор атомов с декартовыми координатами и связей между ними. Например в этой молекуле два цикла по 6 атомов:


A>Под циклом ты понимаешь кратчайший путь из атома в этот же атом минимум через два других атома и без повторных проходов через уже пройденные атомы, или не обязательно кратчайший?


Да, кратчайший. Это критерий для моего алгоритма.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[2]: Перевод понимания из интуиции в логику
От: pagid Россия  
Дата: 20.11.20 17:52
Оценка:
Здравствуйте, anonymouse2, Вы писали:

A>Под циклом ты понимаешь кратчайший путь из атома в этот же атом минимум через два других атома и без повторных проходов через уже пройденные атомы, или не обязательно кратчайший?

Он ароматические циклы ищет. Надо полагать обязательно кратчайший и обязательно с шестью вершинами в которых атомы углерода, еще условия могут быть, но он сам разберется.
Re[3]: Перевод понимания из интуиции в логику
От: anonymouse2 Иностранный Агент
Дата: 20.11.20 17:54
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Да, кратчайший. Это критерий для моего алгоритма.


Как ты понимаешь, человек видит картинку нейросетью и анализирует ее по возможности всю сразу (и то это потому что у тебя молекула уже красиво расправлена, а в жизни молекулы трехмерные и не такие красивые, сразу циклы можно не увидеть). А компьютер без нейросетей "видит" максимум два числа одновременно (количество операндов любой машинной операции, скажем сравнения). Поэтому — представляй молекулу в виде графа, далее рекурсивный обход с разметкой уже пройденных атомов (отмечать например можно счетчиком вложенности рекурсии), в качестве результата будут списки атомов.
Нет такого преступления, на которое не пошло бы суверенное родоплеменное быдло ради продления своего бессмысленного рода и распространения своего бессмысленного генома.
Re[4]: Перевод понимания из интуиции в логику
От: pagid Россия  
Дата: 20.11.20 18:09
Оценка:
Здравствуйте, anonymouse2, Вы писали:

A>Как ты понимаешь, человек видит картинку нейросетью и анализирует ее по возможности всю сразу (и то это потому что у тебя молекула уже красиво расправлена, а в жизни молекулы трехмерные и не такие красивые, сразу циклы можно не увидеть).

В данном случае молекулу можно рассматривать как двумерную — граф планарный.
Re[5]: Перевод понимания из интуиции в логику
От: anonymouse2 Иностранный Агент
Дата: 20.11.20 20:11
Оценка:
Здравствуйте, pagid, Вы писали:

P>В данном случае молекулу можно рассматривать как двумерную — граф планарный.


Я не химик, но мне казалось что в жизни молекулы трехмерные. И почему сложным органическим молекулам не быть трехмерными и не содержать циклов таким образом, чтобы молекулу нельзя было отобразить как планарный граф?
Вот даже фуллерены какие-нибудь.
Нет такого преступления, на которое не пошло бы суверенное родоплеменное быдло ради продления своего бессмысленного рода и распространения своего бессмысленного генома.
Re[6]: Перевод понимания из интуиции в логику
От: pagid Россия  
Дата: 20.11.20 20:22
Оценка:
Здравствуйте, anonymouse2, Вы писали:

A>Вот даже фуллерены какие-нибудь.

Есть такое дело, теоретически возможно. На практике это не совсем химия. Хотя интересная тема.
Re: Перевод понимания из интуиции в логику
От: xma  
Дата: 20.11.20 23:51
Оценка:
Здравствуйте, Khimik, Вы писали:

K>У меня возникла такая задача: определить в молекуле все циклы (точнее, ароматические циклы). Молекула – это набор атомов с декартовыми координатами и связей между ними. Например в этой молекуле два цикла по 6 атомов:


вкртаце, чтобы получить число наикратчайших замкнутых путей (циклов), (синтаксис приблизительный )

для начала надо разработать структуру хранения данных

  Скрытый текст
struct cycle_data {
   int cycle_index = -1; // ну понятно такая инициализация - не прокатит, надо переписать нормально
   int cycle_deep_length = -1; //
};

struct atom {
    int index = -1; // 
    int deep_counter = -1; // 
    std::vector <cycle_data> cycles_index;
    bool have_cycles = false;
    
    std::vector <struct atom *> neighborhoods;
};


для начала найдём все атомы — присвоим каждому индекс и поместим в массив

  Скрытый текст
vector <struct atom *> atoms;

void find_atoms( struct atom * atom_ ) { // рекурсивненько

   if (NULL == atom_) return;
   
   if (atom_->index >= 0) return;
   
   atom_->index = atoms.size();
   atoms.push_back(atom_); 
   
   for (int i = 0; i<atom_->neighborhoods.size(); ++i) {
    find_atoms( atom_->neighborhoods[i] );
   }
}


далее, напишем метод нахождения первого попавшегося кратчайшего замкнутого пути из атомов (для цикла)

  Скрытый текст
/* 
рекурсивненько обходим весь граф, сохраняя при каждом шаге рекурсии - глубину (количество) шагов (deep_counter) в проходимом атоме, чтобы при напарывании на атом с меньшей глубиной (расстоянием до эталона атома atom_ref) - мы текущую ветвь рекурсии отбрасывали .. и сохраняем в cycle_data в атоме - текущий номер цикла и количество атомов в нём (да, тут криво сделано - по идее лучше бы через hash_map и т.п., но мне лень и я уже спать хочу)

возвращает глубину пути (первую попавшуюся минимальную), (-1 нет замкнутого пути)
*/ 
int find_least_way( struct atom * atom_, int way_deep, const struct atom * atom_ref, const int cycle_index ) {

   if (NULL == atom_ref) return -1;
   if (NULL == atom_) return -1;
   
   if (atom_ref->neighborhoods.size() <= 1) return -1;
   if (atom_->neighborhoods.size() <= 1) return -1;

   atom_->deep_counter = way_deep;
  
   int new_way_deep = INT_MAX;
   bool have_a_way = false; 
   for (int i = 0; i<atom_->neighborhoods.size(); ++i) {
   
       if (atom_ref == atom_->neighborhoods[i] ) {
            return 1;
       }

        
        if ( atom_->neighborhoods[i]->deep_counter >= 0 ) {
            if ( atom_->neighborhoods[i]->deep_counter <= way_deep) continue;
        }
        
        int temp_new_way_deep = find_least_way( atom_->neighborhoods[i], way_deep + 1, atom_ref );        
        
        if (temp_new_way_deep < 0) continue; // нудевых указателей - не должно быть
        
        if ( temp_new_way_deep < new_way_deep ) {
           new_way_deep = temp_new_way_deep;
           have_a_way = true; 
        }
   }
   
   if (false == have_a_way) return -1;
   
   atom_->cycles_index.resize( cycle_index + 1 );
   atom_->cycles_index[cycle_index].cycle_index = cycle_index;
   atom_->cycles_index[cycle_index].cycle_deep_length = way_deep + new_way_deep;
  
   return new_way_deep;
}


  Скрытый текст

void clear_deep_counters() {
   for (int i=0; i<atoms.size(); ++i) {
     atoms[i]->deep_counter = -1;
   }
}

// ставит флаг (have_cycles) вхождения атома в цикл в true или false, а также - очищает следы в атомах от более длинных чем наименьший циклы (/пути)
void delete_temp_cycle_indices ( const int cycle_index ) {

   for (int k=0; k<cycle_index; ++k) {
       for ( int i=0; i<atoms.size(); ++i ) {
          if ( k >= atoms[i]->cycles_index.size() ) continue;
          
          for ( int j=0; j<atoms.size(); ++j ) {
             if ( atoms[j]->cycles_index[k].cycle_deep_length > atoms[i]->cycles_index[k].cycle_deep_length ) {
                 atoms[j]->cycles_index[k].cycle_index = -1;
                 atoms[j]->cycles_index[k].cycle_deep_length = -1;
             }
          }
       }
   }
   
   for ( int i=0; i<atoms.size(); ++i ) {
      atoms[i]->have_cycles = false;
      
      if ( atoms[i]->cycles_index.size() <= 0 ) continue;
      
      const int n = (cycle_index > atoms[i]->cycles_index.size() ) ? atoms[i]->cycles_index.size() : cycle_index;
      for (int k=0; k<n; ++k) {
          if ( (atoms[i]->cycles_index[k].cycle_index >= 0) &&(atoms[i]->cycles_index[k].cycle_deep_length >= 3)) {
             atoms[i]->have_cycles = true;
             break;
          }
      }
   }
};

/*
ну и главная функция - запихивает все атомы в массив, далее для каждого ещё не попавшегося в цикл - пытается его (цикл) найти .. 

по итогу работы функции - в массиве atoms - атомы с отметками (have_cycles) о том входят ли они в циклы (хотя бы в один) и в cycles_index в атомах - номер (индекс) цикла и количество атомов в нём .. 

возвращает количество циклов (cycle_index) в графе .. 
*/
int find_num_cycles (struct atom * first_atom) {

   find_atoms( first_atom ); // atoms;
   
   int cycle_index = 0;
   for (int i=0; i<atoms.size(); ++i) {

       // работает если у каждого цикла есть хотя бы один атом не входящий в другие циклы (т.е. без сот)
       if ( atoms[i]->have_cycles ) continue; 
       
       clear_deep_counters(); 
       
       if ( find_least_way( atoms[i], 0, atoms[i], cycle_index ) >= 3) {   
          ++cycle_index;
       }

       delete_temp_cycle_indices( cycle_index ); // жЫр конечно но что поделать :D
   }
   
   return cycle_index;
};


щаз понял, что если как соты фигачится будут циклы с атомами — то надо будет дополнительно сохранять массив индексов атомов каждого цикла в каждый атом, и уже по каждому атому пробегаться (по аналогии с методом выше) — и сравнивать все индексы (цикла), и при их полной одинаковости — считать совпадающие атомы одним циклом ..

понятно что может можно и похэшить для оптимизации и т.д., но это уже другой вопрос .. я так понял человеку — надо для начала просто чтобы работало ..

вообщем я спать, код тот (выше) на скорую руки набацал ночью — но для понимания общей идеи думаю пойдёт ..

P.S.: ну и сохранять дополнительно придётся — все одинаковые минимальные длины пути (циклы), а не только первый попавшийся минимальный цикл (/путь) — для каждого атома ..
Отредактировано 21.11.2020 14:17 xma . Предыдущая версия . Еще …
Отредактировано 21.11.2020 14:17 xma . Предыдущая версия .
Отредактировано 20.11.2020 23:59 xma . Предыдущая версия .
Отредактировано 20.11.2020 23:58 xma . Предыдущая версия .
Отредактировано 20.11.2020 23:57 xma . Предыдущая версия .
Отредактировано 20.11.2020 23:53 xma . Предыдущая версия .
Отредактировано 20.11.2020 23:51 xma . Предыдущая версия .
Re[2]: Перевод понимания из интуиции в логику
От: xma  
Дата: 21.11.20 05:30
Оценка:
Здравствуйте, xma, Вы писали:

K>>У меня возникла такая задача: определить в молекуле все циклы (точнее, ароматические циклы). Молекула – это набор атомов с декартовыми координатами и связей между ними. Например в этой молекуле два цикла по 6 атомов:


xma>щаз понял, что если как соты фигачится будут циклы с атомами, то ..


и если с сотами — вопросики можно порешать, то если циклы в одной молекуле могут состоять — из разного числа атомов, становится всё уже не так очевидно ..

короче надо уточнять ТЗ .. возможно там — можно добавить координаты для атомов (или угол связывания — с соседними атомами), тогда можно различать — большие циклы окружённые меньшими, решая задачу — об отсутствии лишних атомов (точек) в многоугольнике (большем цикле) ..
Отредактировано 21.11.2020 5:50 xma . Предыдущая версия .
Re[2]: Перевод понимания из интуиции в логику
От: Khimik  
Дата: 21.11.20 06:31
Оценка:
Здравствуйте, xma, Вы писали:

xma>Здравствуйте, Khimik, Вы писали:


K>>У меня возникла такая задача: определить в молекуле все циклы (точнее, ароматические циклы). Молекула – это набор атомов с декартовыми координатами и связей между ними. Например в этой молекуле два цикла по 6 атомов:


xma>вкртаце, чтобы получить число наикратчайших замкнутых путей (циклов), (синтаксис приблизительный )


xma>для начала надо разработать структуру хранения данных


Честно говоря мне трудно разобраться в коде C++, вроде у вас близко к моему алгоритму. Надо было ещё пояснить как создаётся массив соседей атомов. И с алгоритмом много подводных камней вроде того, как отбрасывать совпадающие (вложенные друг в друга) циклы.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[3]: Перевод понимания из интуиции в логику
От: xma  
Дата: 21.11.20 07:07
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Честно говоря мне трудно разобраться в коде C++,


а ты на чём пишешь ?

K>вроде у вас близко к моему алгоритму.


под ТЗ — с картинок должно работать без сбоев (под соты и разно-количественные циклы — надо допиливать, первое просто — а второе тот ещё квест)

K>Надо было ещё пояснить как создаётся массив соседей атомов.


тарищЪ, я же не знаю какие у вас исходные данные .. и как вы их туда "вбиваете" — вручную или грузите откуда то ..

да и не понятно как ты вообще свой алгоритм (хоть и частично работающий, по твоим словам) — проверял на данных, если ты их — ни в какие структуры не загружал ..

K>И с алгоритмом много подводных камней вроде того, как отбрасывать совпадающие (вложенные друг в друга) циклы.


для начала надо уточнить ТЗ — будут ли соты (когда есть циклы каждый атом которых — задействован в других циклах), а они скорей всего будут, и будут ли — разно-количественные циклы ?

что касается картинок выше (ваших, без сот и т.д.), то в них — чтобы найти кратчайший замкнутый на выбранный атом путь, надо запустить рекурсию с выбранного атома, и далее пробегаться по всем связанным атомам — помечая в них глубину рекурсии (поле deep_counter в структуре atom), чтобы при повторном напарывании (из очередного вызова рекурсии) на уже пройденный атом — была возможность проверить — не длиннее ли текущий путь (тогда переходим к след. связанным атомам), или иначе — переписываем (deep_counter в атоме) и пытаемся аналогичным образом — переть (рекурсией) по его связям .. (для всего этого используется функция "find_least_way" — в коде выше) ..

но в целом всё это бессмысленно — без полноценного ТЗ, в котором более полно — должны быть отражены все нюансы (такие как, наличие сот и наличие разно-количественных циклов)
Re: Перевод понимания из интуиции в логику
От: scf  
Дата: 21.11.20 07:12
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Возникает вопрос: можно ли разработать эвристические приёмы, которые переводят “интуитивно-понятное” в “формализованно-понятное”? Например большой список универсальных вопросов.


Похоже на задачу поиска доказательства к теореме. Есть новая теорема и большой список известных теорем, нужно выбрать нужные и скомпоновать из них доказательство.

Это именно то, что (пока) отличает человека от машины — умение творить, изобретать, создавать новое.
Re[2]: Перевод понимания из интуиции в логику
От: pagid Россия  
Дата: 21.11.20 07:41
Оценка:
Здравствуйте, scf, Вы писали:

scf>Похоже на задачу поиска доказательства к теореме. Есть новая теорема и большой список известных теорем, нужно выбрать нужные и скомпоновать из них доказательство.

Не. Это просто графы. Задача может специфическая, но более-менее реальные задачи все специфические.
Re[4]: Перевод понимания из интуиции в логику
От: Khimik  
Дата: 21.11.20 09:26
Оценка:
K>>Честно говоря мне трудно разобраться в коде C++,

xma>а ты на чём пишешь ?


На Delphi.

K>>вроде у вас близко к моему алгоритму.


xma>под ТЗ — с картинок должно работать без сбоев (под соты и разно-количественные циклы — надо допиливать, первое просто — а второе тот ещё квест)


Я честно говоря не понял, что вы имеете в виду под сотами? На второй картинке видно, что возможны смежные циклы — один атом входит в несколько циклов.

Ещё я не знаю что такое графы.

K>>Надо было ещё пояснить как создаётся массив соседей атомов.


xma>тарищЪ, я же не знаю какие у вас исходные данные .. и как вы их туда "вбиваете" — вручную или грузите откуда то ..


Исходные данные — два массива: в первом перечислены атомы — тип атома и координаты x,y,z. Во втором перечислены связи — номера двух атомов которые друг с другом связаны.
Нужно создать для каждого атома динамический массив — атомы, связанные с ним, пробежаться циклом по связям и добавлять в эти динамические массивы соседние атомы для каждого атома.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re: Перевод понимания из интуиции в логику
От: Aquilaware  
Дата: 21.11.20 10:41
Оценка: :))
Здравствуйте, Khimik, Вы писали:

K>Возникает вопрос: можно ли разработать эвристические приёмы, которые переводят “интуитивно-понятное” в “формализованно-понятное”?


Ув. Khimik! Именно этой проблемой занимается математика, в частности — алгебра. Алгебра позволяет вывести и зафиксировать *любые* закономерности в абстрактных символах.

Дилемма состоит в том, что большинство специалистов функционирует в своих областях (например, химия), не осознавая глубину доступных средств из соседних областей (математика).

То же самое происходит и с программистами — в массе своей они склонны думать, что программирование это одно, а математика — нечто совсем другое. Но если смотреть глубже, то оказывается что программа — это набор связанных математических выражений к которым добавлена операция условного перехода, обеспечивающая полноту по Тьюрингу, и это вообщем-то всё.

Те же из редких программистов, которые прикасаются к Лиспу (языку программирования), начинают понимать эти связи и в их в голове происходит Большой Взрыв — из казалось бы пустоты и непонятности открывается целая вселенная всепроникающего познания.

Математики, в свою очередь, тоже обладают профдеформацией — некоторые из них могут смотреть на все через призму чисел, некоторые ударяются в непрерывность, отвергая дискретность, забывая что непрерывность это просто инструмент познания. Видели какие программы пишут математики? Зачастую это нагроможденные клубки кода с магическими числами которые могут работать только с числами с плавающей точкой.

Чему стоит научится — интердисциплинарному взгляду на вещи. Тогда многие двери открываются намного легче.

В важей задаче с циклами в молекуле вам уже советовали граф. Граф является очень мощной структурой абстрактного представления элементов и связей между ними, а такие примитивы как транспонирование и инверсия позволяют эффективно находить решения казалось бы нерешаемых задач! Раздел математики "Топология" как раз и занимается такими проблемами, в т.ч. нахождением циклов в графе.

Если бы вы знали это до того, как начали решать задачу "в лоб", то формальное решение бы было найдено за 3 дня и оно было бы доказаным и правильным. В нем не было бы изьянов. Оно было бы крепким и сияющим как алмаз. Оно было бы надежным кирпичом в фундаменте. На него можно было бы всегда пололожится и никогда более к этой проблеме не возвращаться, так как она была бы уже решенной.

Дирижирует же всем процессом познания философия — наука об искусстве нахождения границ возможного. Именно поэтому ее преподают в ВУЗах. Чтобы заставить слушателей задуматься: а где же эти границы? Так ли они известны как кажется? Или все привычные каноны это всего лишь иллюзия вызванная неведением?
Отредактировано 21.11.2020 10:51 Aquilaware . Предыдущая версия . Еще …
Отредактировано 21.11.2020 10:47 Aquilaware . Предыдущая версия .
Re[5]: Перевод понимания из интуиции в логику
От: xma  
Дата: 21.11.20 14:49
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Я честно говоря не понял, что вы имеете в виду под сотами? На второй картинке видно, что возможны смежные циклы — один атом входит в несколько циклов.


если есть такие циклы в которых — каждый их атом является и частью других циклов, то можно назвать это сотой (не знаю как по другому назвать) ..

у тебя на картинке — просто в каждом цикле есть атомы, которые не входят в другие циклы .. я это обыграл в решении ..

K>>>Надо было ещё пояснить как создаётся массив соседей атомов.


K>Исходные данные — два массива: в первом перечислены атомы — тип атома и координаты x,y,z. Во втором перечислены связи — номера двух атомов которые друг с другом связаны.

K>Нужно создать для каждого атома динамический массив — атомы, связанные с ним, пробежаться циклом по связям и добавлять в эти динамические массивы соседние атомы для каждого атома.

ну если это "не игра на скорость", то

  Скрытый текст
// считаем что все атомы связаны хотя бы через один другой друг с другом
// топорный метод, но тебе вроде скорость профиг  :))

struct atom {
 int x,y,z;
 //vector <struct atom *> neighborhoods; // links
 vector <int> neighborhoods_indices; 
};

vector <atom> atoms;

atoms.resize ( source_atoms_array.size() );

for (int i=0; i<source_atoms_array.size(); ++i) {
    atoms[i].xyz = source_atoms_array[i].xyz; // условный код
}

bool have_neighborhood_link( const int atom_index, const int neighborhood_index ) {
   for (int i=0; i<atoms[atom_index].neighborhoods_indices.size(); ++i) {
      if ( neighborhood_index == atoms[atom_index].neighborhoods_indices[i] ) return true;
   }

   return false;
};

// сначала надо нафигачить линки (индексы) - на соседние атомы, в каждый атом массива atoms
for (int i=0; i<atom_links; ++i) {
   if (false == have_neighborhood_link ( atom_links[i].index0, atom_links[i].index1 ) ) {
      atoms[atom_links[i].index0].neighborhoods_indices.push_back( atom_links[i].index1); 
   }

   if (false == have_neighborhood_link ( atom_links[i].index1, atom_links[i].index0 ) ) {
      atoms[atom_links[i].index1].neighborhoods_indices.push_back( atom_links[i].index0); 
   }
}

// ну а далее по сути имеем готовый "список" (точнее граф) через индексы соседей (в массиве atoms), можно по нему бегать - а можно развернуть через прямые ссылки (указпатели) на список граф, начиная с любого элемента (назовём его первым) ..
Отредактировано 21.11.2020 15:28 xma . Предыдущая версия . Еще …
Отредактировано 21.11.2020 15:28 xma . Предыдущая версия .
Re[5]: Перевод понимания из интуиции в логику
От: Lazytech Ниоткуда  
Дата: 21.11.20 15:46
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Ещё я не знаю что такое графы.


Могу порекомендовать видеолекции, в которых весьма дотошно объясняется, как работать с графами.

Graph Theory – YouTube
Re: Перевод понимания из интуиции в логику
От: graniar  
Дата: 21.11.20 19:11
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Когда я писал этот алгоритм, возникли такие мысли. С одной стороны, достаточно мельком взглянуть на молекулу и сразу видно, где в ней циклы. В то же время формализовать это “видно” – задача на порядки более трудная. Судя по всему, понимание – штука сложная и понимание бывает на разных уровнях: одно дело – когда смотришь на молекулу и сразу понятно где в ней циклы, а другое дело – когда понятно с точки зрения алгоритма, что такое цикл и как его распознать.


Это обманное ощущение, из-за того что молекулы в этих простых примерах представимы планарными графами.
Алгоритм для частного случая планарных графов действительно будет очень простым.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.