Перевод понимания из интуиции в логику
От: 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>Когда я писал этот алгоритм, возникли такие мысли. С одной стороны, достаточно мельком взглянуть на молекулу и сразу видно, где в ней циклы. В то же время формализовать это “видно” – задача на порядки более трудная. Судя по всему, понимание – штука сложная и понимание бывает на разных уровнях: одно дело – когда смотришь на молекулу и сразу понятно где в ней циклы, а другое дело – когда понятно с точки зрения алгоритма, что такое цикл и как его распознать.


Это обманное ощущение, из-за того что молекулы в этих простых примерах представимы планарными графами.
Алгоритм для частного случая планарных графов действительно будет очень простым.
Re[2]: Перевод понимания из интуиции в логику
От: pagid Россия  
Дата: 21.11.20 19:35
Оценка:
Здравствуйте, graniar, Вы писали:

G>Это обманное ощущение, из-за того что молекулы в этих простых примерах представимы планарными графами.

G>Алгоритм для частного случая планарных графов действительно будет очень простым.
В большинстве случаев они действительно планарные. Одно из возможных исключений фуллерены о которых anonymouse2 написал.
Но пусть непланарные. Алгоритм не должен принципиально отличаться. Или совсем не должен отличаться Но представить сложнее, это да.
Re: Перевод понимания из интуиции в логику
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 21.11.20 20:59
Оценка:
Здравствуйте, Khimik, Вы писали:

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

Гугли алгоритмы на графах, лучше главу у Кормена почитать или спец. книжку скачать. А вообще, эта проблема не нова и советую поискать реальную статью или готовый алгоритм.
Я так понимаю твоя цель найти все бензольные кольца?
Sic luceat lux!
Re: Перевод понимания из интуиции в логику
От: xma  
Дата: 21.11.20 21:05
Оценка: :)
Здравствуйте, Khimik, Вы писали:

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


чё, как успехи ? ТЗ допилил ?

вообще если ты химик, то не особо понятно — почему тебя код заставляют писать ..
Re[2]: Перевод понимания из интуиции в логику
От: pagid Россия  
Дата: 21.11.20 21:10
Оценка: +1
Здравствуйте, xma, Вы писали:

xma>вообще если ты химик, то не особо понятно — почему тебя код заставляют писать ..

Прикинь, есть люди которых не заставляют, они сами решают, что делать. Наверно счастливые люди

xma>чё, как успехи ? ТЗ допилил ?

Там, к слову, все понятно.
Re[3]: Перевод понимания из интуиции в логику
От: xma  
Дата: 21.11.20 21:21
Оценка:
Здравствуйте, pagid, Вы писали:

xma>>вообще если ты химик, то не особо понятно — почему тебя код заставляют писать ..

P>Прикинь, есть люди которых не заставляют, они сами решают, что делать. Наверно счастливые люди

например, неделями ковырять "неработающий код" ? да, кучеряво, правда у нас на работе за такое выгоняли ..

xma>>чё, как успехи ? ТЗ допилил ?

P>Там, к слову, все понятно.

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

ну и что самое интересное — в старт посте не было озвучено, что атомы содержат координаты .. но тебе pagid'у, как "Вяликому химику" и "погромизду" — конечно же всё и так сразу было "понятно и очевидно" (c) .. кто бы сомневался ..
Отредактировано 21.11.2020 21:24 xma . Предыдущая версия . Еще …
Отредактировано 21.11.2020 21:22 xma . Предыдущая версия .
Re[4]: Перевод понимания из интуиции в логику
От: pagid Россия  
Дата: 21.11.20 21:33
Оценка:
Здравствуйте, xma, Вы писали:

xma>например, неделями ковырять "неработающий код" ? да, кучеряво, правда у нас на работе за такое выгоняли ..

ТС на себя работает, насколько я понял.

xma>ну тогда ответь на вопросы — 1) могут ли в исходных данных молекулы попадаться циклы все атомы которых также являются частью других циклов ? — и

Нет. Все циклы могут состоять только из шести атомов, и в этом случае это будет тот же самый цикл.

2) могут ли в исходных данных одной молекулы попадаться циклы с разным числом атомов ?
см.выше.

xma>ну и что самое интересное — в старт посте не было озвучено, что атомы содержат координаты ..

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

xma>но тебе pagid'у, как "Вяликому химику" и "погромизду" — конечно же всё и так сразу было "понятно и очевидно" (c) .. кто бы сомневался ..

Тю. у тебя понос что ли уже начался? Впрочем, как обычно.
Re[5]: Перевод понимания из интуиции в логику
От: xma  
Дата: 22.11.20 09:52
Оценка:
Здравствуйте, pagid, Вы писали:

xma>>ну тогда ответь на вопросы — 1) могут ли в исходных данных молекулы попадаться циклы все атомы которых также являются частью других циклов ? — и

P>Нет. Все циклы могут состоять только из шести атомов, и в этом случае это будет тот же самый цикл.

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

  вот что я называл сотами


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

P>Ну и не атомы конечно содержат координаты, а их описание.


какое "ценное" замечание .. сам бы я никогда не догадался ..

P>Тю. у тебя понос что ли уже начался? Впрочем, как обычно.


а ты что, по совместительству химик или что — откуда такое самомнение об условиях задачи ? (сразу начинает попахивать дилетантством)
Отредактировано 22.11.2020 9:52 xma . Предыдущая версия .
Re[6]: Перевод понимания из интуиции в логику
От: pagid Россия  
Дата: 22.11.20 10:14
Оценка:
Здравствуйте, xma, Вы писали:

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


xma>вот что я называл сотами

Там семь циклов которые нужно найти.
Соты и соты, пусть будет так.

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

Может быть.

xma>а ты что, по совместительству химик или что — откуда такое самомнение об условиях задачи ? (сразу начинает попахивать дилетантством)

Для этого достаточно немного помнить школьную химию.
Re: Перевод понимания из интуиции в логику
От: pagid Россия  
Дата: 22.11.20 10:21
Оценка:
Здравствуйте, Khimik, Вы писали:

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

Цикл останется ароматическим? Такое вещество вообще будет устойчивым?
Re[7]: Перевод понимания из интуиции в логику
От: xma  
Дата: 22.11.20 10:26
Оценка:
Здравствуйте, pagid, Вы писали:

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

P>Может быть.

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

xma>>ну тогда ответь на вопросы — 1) могут ли в исходных данных молекулы попадаться циклы все атомы которых также являются частью других циклов ? — и
P>Нет. Все циклы могут состоять только из шести атомов, и в этом случае это будет тот же самый цикл.


P>Для этого достаточно немного помнить школьную химию.


ничё си память у тебя ..
Отредактировано 22.11.2020 10:28 xma . Предыдущая версия .
Re[2]: Перевод понимания из интуиции в логику
От: xma  
Дата: 22.11.20 10:32
Оценка:
Здравствуйте, pagid, Вы писали:

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

P>Цикл останется ароматическим? Такое вещество вообще будет устойчивым?

ты же говорил что "Там (в ТЗ — прим.), к слову, все понятно."

и что,

P>Нет. Все циклы могут состоять только из шести атомов

https://rsdn.org/forum/education/7887923?tree=tree


а теперь вдруг вопросы появились — и оказалось что ты ТЗ то даже толком и не читал .. (я же сразу сказал — что дилетант )
Re[3]: Перевод понимания из интуиции в логику
От: pagid Россия  
Дата: 22.11.20 11:19
Оценка:
Здравствуйте, xma, Вы писали:

xma>ты же говорил что "Там (в ТЗ — прим.), к слову, все понятно."

Это непринципиальные "тонкости"

P>>Нет. Все циклы могут состоять только из шести атомов

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

xma>а теперь вдруг вопросы появились — и оказалось что ты ТЗ то даже толком и не читал .. (я же сразу сказал — что дилетант )

Читал конечно. В правильном ТЗ, все неочевидные вещи должны быть описаны отдельно, если этого нет, то следует ограничится очевидными. Не знал, профессионал?
У ТС, к слову, было не ТЗ, в вопрос с описанием задачи. Он предлагал поделиться мыслями, а вовсе не выполнять задание. И да, он ни разу не уточнил её, значит инфы содержащейся в первоначальной постановке вопроса по его мнению было достаточно. Но мне стало интересно, да, потрындеть, а вовсе не для предложения готового решения, формат форума не предполагает.

К слову, правильный ответ на вопрос ТС в топике был — выразить задачу в терминах графов и взглянуть на алгоритмы разработанные для графов, если среди них нет готового решения именно его задачи, то нужно адаптировать к её условиям какой-нибудь из них. Или продолжить поиски своего, после ознакомления с готовыми эти поиски могут оказаться более плодотворными.
Re[4]: Перевод понимания из интуиции в логику
От: xma  
Дата: 22.11.20 11:30
Оценка:
Здравствуйте, pagid, Вы писали:

xma>>ты же говорил что "Там (в ТЗ — прим.), к слову, все понятно."

P>Это непринципиальные "тонкости"

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

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


ты же сказал что тебе всё понятно ? "всё понятно — но надо уточнить .." (c), вообще то от этого — в корне зависят алгоритмы реализации требовании поставленной задачи ..

P>К слову, правильный ответ на вопрос ТС в топике был — выразить задачу в терминах графов


для начала надо вообще то определится с двумя вопросами — изложенными мною пару постов выше ..
Re[5]: Перевод понимания из интуиции в логику
От: pagid Россия  
Дата: 22.11.20 11:58
Оценка:
Здравствуйте, xma, Вы писали:

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

Мне оно зачем, я решать задачу за ТС не брался. В том числе понимая, что она не такая уж и простая.

xma>ты же сказал что тебе всё понятно ?

Мне понятно какими ограничениями следовало бы воспользоваться при решении вот так поставленной задачи. Вопрос о том почему ТС поставил именно так мне показался более интересным, чем попытка решить её за него

xma>для начала надо вообще то определится с двумя вопросами — изложенными мною пару постов выше ..

Первый вопрос изначально я понял неправильно. Ответ на такой — схема названная тобой сотами возможна. Она и в примере из стартового сообщения была, в немного более простом виде. Почему возник вопрос
Про второй тоже писал. Исходя из изложения вопроса и примеров не могут. Во всяком случае вопрос на предложенном уровне проработки следует воспринимать именно так. Иначе ТС следует заложить в вопрос инфу об особенностях ароматических циклов содержащих атомы не углерода или исключить из вопроса слово "ароматические циклы"
Re[6]: Перевод понимания из интуиции в логику
От: xma  
Дата: 22.11.20 12:16
Оценка:
Здравствуйте, pagid, Вы писали:

P>Первый вопрос изначально я понял неправильно.


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

P>Ответ на такой — схема названная тобой сотами возможна.


P>Она и в примере из стартового сообщения была, в немного более простом виде.


не было сотами я назвал циклы где "ВСЕ атомы этого цикла являются также составной частью соседних циклов"

P>Почему возник вопрос


тебе всё на картинках показывать надо ?

  Скрытый текст
помеченные (красным — 1 группа) атомы входящие в цикл, не входят в другие соседние циклы (потому что их нет — рядом с ними),

а помеченные (жёлтым — 2 группа) атомы входящие в цикл — входят также и в другие циклы,

НО в каждом цикле (молекулы на картинке ниже) — есть атомы в них входящие — из 1 группы, т.е. под определение "СОТ" — не попадают .. а вопрос был именно — про соты ..



P>Почему возник вопрос


"слышу звон, да не знаю где он .." (c) на работе — также внимательно ТЗ и поставленные в Jira задачи читаешь ?
Отредактировано 22.11.2020 12:28 xma . Предыдущая версия . Еще …
Отредактировано 22.11.2020 12:17 xma . Предыдущая версия .
Re[2]: Перевод понимания из интуиции в логику
От: Khimik  
Дата: 22.11.20 13:07
Оценка: 2 (1)
Здравствуйте, pagid, Вы писали:

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


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

P>Цикл останется ароматическим? Такое вещество вообще будет устойчивым?

Дело в том что я упростил задачу — предложил определять вообще любые циклы. Такого вещества с 14-членным циклом конечно не существует, а вообще ароматические циклы могут быть разных размеров, например в азулене есть два смежных цикла из 5 и 7 атомов.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[7]: Перевод понимания из интуиции в логику
От: Khimik  
Дата: 22.11.20 13:30
Оценка: +2
Здравствуйте, xma, Вы писали:

xma>не было сотами я назвал циклы где "ВСЕ атомы этого цикла являются также составной частью соседних циклов"


Я так и не понял, что вы привязались к этим сотам? Какая разница, все атомы цикла или не все входят в другие циклы? Так да, на моей второй картинке "сот" нет а на вашей картинке с короненом есть один такой цикл в середине. И что?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[8]: Перевод понимания из интуиции в логику
От: xma  
Дата: 22.11.20 13:40
Оценка:
Здравствуйте, Khimik, Вы писали:

xma>>не было сотами я назвал циклы где "ВСЕ атомы этого цикла являются также составной частью соседних циклов"


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


реализация решения разная — для молекул без сот проще ..

K>Так да, на моей второй картинке "сот" нет а на вашей картинке с короненом есть один такой цикл в середине.


настоящий химик — я "от балды" нарисовал, а он уже "выяснил" — что это коронен ..

K>И что?


осталось выяснить — могут ли быть в одной молекуле циклы с различным числом атомов ? (это самый тухлый вариант — реализация одновременно с сотовостью — уже не так проста и очевидна)
Re[3]: Перевод понимания из интуиции в логику
От: xma  
Дата: 22.11.20 15:52
Оценка: -1
Здравствуйте, Khimik, Вы писали:

K>Дело в том что я упростил задачу — предложил определять вообще любые циклы. Такого вещества с 14-членным циклом конечно не существует, а вообще ароматические циклы могут быть разных размеров, например в азулене есть два смежных цикла из 5 и 7 атомов.


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

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

2) проходим по каждому оставшемуся атому в массиве,

2.1) находим для текущего атома — все циклы в которые он входит, сохраняя для каждого атома (этих циклов) — полный список всех индексов входящих в них атомов

3) по новой проходим по атомам в массиве (исключая атомы из п.1.),

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

вуаля !!

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

на самом деле — на словах мне кажется понять тоже не просто, но если человек — не понимает ни на словах ни на C/C++, то сложно представить как ему это вообще объяснять можно ..

дискасс ?
Отредактировано 22.11.2020 15:54 xma . Предыдущая версия . Еще …
Отредактировано 22.11.2020 15:53 xma . Предыдущая версия .
Re[3]: Перевод понимания из интуиции в логику
От: pagid Россия  
Дата: 22.11.20 16:05
Оценка:
Здравствуйте, Khimik, Вы писали:

K>Дело в том что я упростил задачу — предложил определять вообще любые циклы. Такого вещества с 14-членным циклом конечно не существует, а вообще ароматические циклы могут быть разных размеров, например в азулене есть два смежных цикла из 5 и 7 атомов.

Забавно, о таких не знал.
Они могут только рядом быть и существую на пару? Или бывают одиночные варианты?
Re[4]: Перевод понимания из интуиции в логику
От: xma  
Дата: 22.11.20 16:18
Оценка:
Здравствуйте, xma, Вы писали:

xma>п.2.1.1) находить циклы при этом придётся отсечением тех многоугольников (возможно и невыпуклых) где внутри есть другие атомы, по координатам .. (другого решения сходу не видать)


не видать, потому что в общем случае не определить (только по "графу" и без координат) — пересекает ли цепочка связанных атомов — многоугольник (потенциальный цикл), по внутренней его области (тогда этот многоугольник — точно не цикл) или всё таки — с внешней стороны ..
Re[2]: Перевод понимания из интуиции в логику
От: TMU_2  
Дата: 22.11.20 17:13
Оценка:
A>Ув. Khimik! Именно этой проблемой занимается математика, в частности — алгебра. Алгебра позволяет вывести и зафиксировать *любые* закономерности в абстрактных символах.
A>Дилемма состоит в том, что большинство специалистов функционирует в своих областях (например, химия), не осознавая глубину доступных средств из соседних областей (математика).



Подозреваю, что ты хотел использовать слово "проблема", но дилемма звучит лучше, признаю.
Re[4]: Перевод понимания из интуиции в логику
От: Khimik  
Дата: 22.11.20 17:37
Оценка: 2 (1)
Здравствуйте, pagid, Вы писали:

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


K>>Дело в том что я упростил задачу — предложил определять вообще любые циклы. Такого вещества с 14-членным циклом конечно не существует, а вообще ароматические циклы могут быть разных размеров, например в азулене есть два смежных цикла из 5 и 7 атомов.

P>Забавно, о таких не знал.
P>Они могут только рядом быть и существую на пару? Или бывают одиночные варианты?

Если я ничего не путаю, пятичленные ароматические циклы не могут состоять только из атомов углерода, либо они могут быть в виде смежных циклов как в азулене.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[8]: Перевод понимания из интуиции в логику
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 24.11.20 10:58
Оценка:
Здравствуйте, Khimik, Вы писали:

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

Потомоу, что на второй картинке у тебя больше чем 4 цикла если не рассматривать циклы только из 6 вершин.
Sic luceat lux!
Re[9]: Перевод понимания из интуиции в логику
От: Khimik  
Дата: 24.11.20 12:48
Оценка:
Здравствуйте, Kernan, Вы писали:

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


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

K>Потомоу, что на второй картинке у тебя больше чем 4 цикла если не рассматривать циклы только из 6 вершин.

Ну это подразумевается условиями задачи — из вложенных друг в друга циклов оставлять самые маленькие.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re: Перевод понимания из интуиции в логику
От: gyraboo  
Дата: 24.11.20 13:11
Оценка:
Здравствуйте, Khimik, Вы писали:

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

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

Например можно найти специализированный инструмент или понятийный аппарат, в котором предметную область уже формализовали, и оперировать этими терминами и возможностями.
Например в случае с циклами: загрузить граф в специализированную графовую БД типа Neojj, и тогда можно оперировать циклами очень лаконично, например, поиск циклов тогда будет выглядеть всего 1-2 короткими строками на специализированном графовом языке:
https://stackoverflow.com/questions/34136944/detecting-short-cycles-in-neo4j-property-graph

Ну а если тебя интересует сам общий подход формализации, то можно посмотреть в сторону DSL и платформы для этого, например Jetbrains MPS.
Т.е. идея заключается в том, что ты сначала придумываешь язык, термины и понятия для той области, которую хочешь формализовать и понять (создаёшь язык DSL), а затем оперируешь этим языком для решения задач этой предметной области. Поэтому ищи и читай про практики создания DSL, чтобы увидеть такие эвристические приёмы.
Re[10]: Перевод понимания из интуиции в логику
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 24.11.20 13:27
Оценка:
Здравствуйте, Khimik, Вы писали:

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


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


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

K>>Потомоу, что на второй картинке у тебя больше чем 4 цикла если не рассматривать циклы только из 6 вершин.

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

Так не получится. Ты опять формулируешь задачу как поиск всех циклов в графе и потом поиска среди них наименьшего, но тут опять вопрос, что если будет цикл из 3х или 4х вершин, но будут и из 6 которые включают 2 по 3?
Sic luceat lux!
Re[11]: Перевод понимания из интуиции в логику
От: Khimik  
Дата: 24.11.20 16:31
Оценка:
K>>>>Я так и не понял, что вы привязались к этим сотам? Какая разница, все атомы цикла или не все входят в другие циклы?
K>>>Потомоу, что на второй картинке у тебя больше чем 4 цикла если не рассматривать циклы только из 6 вершин.

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

K>Так не получится. Ты опять формулируешь задачу как поиск всех циклов в графе и потом поиска среди них наименьшего, но тут опять вопрос, что если будет цикл из 3х или 4х вершин, но будут и из 6 которые включают 2 по 3?

Я не понимаю что вы спрашиваете.
Вот молекула нафталина:



В ней, строго говоря, есть три цикла: два по 6 атомов и один из 10 атомов. Последний нужно отбросить, т.к. он включает в себя первый и второй цикл. Если перебирать циклы через графы, будут найдены все три цикла и алгоритм должен отбрасывать бОльший, содержащие вложенные меньшие циклы.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[12]: Перевод понимания из интуиции в логику
От: Sinclair Россия https://github.com/evilguest/
Дата: 25.11.20 12:39
Оценка:
Здравствуйте, Khimik, Вы писали:
K>В ней, строго говоря, есть три цикла: два по 6 атомов и один из 10 атомов. Последний нужно отбросить, т.к. он включает в себя первый и второй цикл. Если перебирать циклы через графы, будут найдены все три цикла и алгоритм должен отбрасывать бОльший, содержащие вложенные меньшие циклы.
По-прежнему непонятно.
Смотрите:
    A   B
    |   |
C   D   E   F
 \ / \ / \ /
  G   H   I
  |   |   |
  J   K   L
 / \ / \ / \
M   N   O   P
    |   |
    Q   R

Вы видите здесь циклы GDHKNJ и HEILOK. Под "циклом из 10 атомов" вы подразумеваете что — GDHEILOKNJ? Что насчёт GDHKOLIEHKN? или мы должны отбрасывать циклы с самопересечениями?
Дальше — что значит "состоит из вложенных меньших циклов"? В GDHEILOKNJ есть фрагмент HEILOK, но нету GDHKNJ.
Интересуют ли вас циклы произвольной длины, или только 5/6 атомов, только углерода, и без самопересечений?
Могут ли встречаться случаи типа
       
       
A   B     C   
 \ /|\  / 
  D E F   
  |/  |   
  G   H  
   \ / \  
    I   J - K
    |   
    L

? Какие циклы должны быть построены в таком случае? GDBFHI/GEBFHI, или DBEG?
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[13]: Перевод понимания из интуиции в логику
От: Khimik  
Дата: 25.11.20 13:02
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

K>>В ней, строго говоря, есть три цикла: два по 6 атомов и один из 10 атомов. Последний нужно отбросить, т.к. он включает в себя первый и второй цикл. Если перебирать циклы через графы, будут найдены все три цикла и алгоритм должен отбрасывать бОльший, содержащие вложенные меньшие циклы.
S>По-прежнему непонятно.
S>Смотрите:
S>
S>    A   B
S>    |   |
S>C   D   E   F
S> \ / \ / \ /
S>  G   H   I
S>  |   |   |
S>  J   K   L
S> / \ / \ / \
S>M   N   O   P
S>    |   |
S>    Q   R
S>

S>Вы видите здесь циклы GDHKNJ и HEILOK. Под "циклом из 10 атомов" вы подразумеваете что — GDHEILOKNJ?
Да

> Что насчёт GDHKOLIEHKN? или мы должны отбрасывать циклы с самопересечениями?


Да, конечно. Атомы в цикле должны встречаться только по разу.

S>Дальше — что значит "состоит из вложенных меньших циклов"? В GDHEILOKNJ есть фрагмент HEILOK, но нету GDHKNJ.


Почему нет? Можно же по-другому пронумеровать атомы в цикле.

S>Интересуют ли вас циклы произвольной длины, или только 5/6 атомов, только углерода, и без самопересечений?


Проще искать любые циклы, произвольной длины.

S>Могут ли встречаться случаи типа

S>
       
       
S>A   B     C   
S> \ /|\  / 
S>  D E F   
S>  |/  |   
S>  G   H  
S>   \ / \  
S>    I   J - K
S>    |   
S>    L   
S>

S>? Какие циклы должны быть построены в таком случае? GDBFHI/GEBFHI, или DBEG?

Такие циклы встречаются, хотя для моей задачи их находить в принципе необязательно; по идее нужно выделить все три цикла которые вы назвали.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re: Перевод понимания из интуиции в логику
От: Sinclair Россия https://github.com/evilguest/
Дата: 25.11.20 13:02
Оценка: +1
Здравствуйте, Khimik, Вы писали:

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

Быстро бы я придумал загуглить https://www.google.com/search?q=алгоритм+поиска+циклов+в+графе.
Потом бы медленно думал над тем, что делать с "лишними" циклами, которые будет выдавать алгоритм.
K>Когда я писал этот алгоритм, возникли такие мысли. С одной стороны, достаточно мельком взглянуть на молекулу и сразу видно, где в ней циклы. В то же время формализовать это “видно” – задача на порядки более трудная. Судя по всему, понимание – штука сложная и понимание бывает на разных уровнях: одно дело – когда смотришь на молекулу и сразу понятно где в ней циклы, а другое дело – когда понятно с точки зрения алгоритма, что такое цикл и как его распознать.
Да, верно.
K>Возникает вопрос: можно ли разработать эвристические приёмы, которые переводят “интуитивно-понятное” в “формализованно-понятное”? Например большой список универсальных вопросов.
Этим всю жизнь занимаются математики — они учатся отбрасывать всё лишнее, оставляя в задаче только существенные характеристики.
Потом им иногда удаётся заметить, что получившаяся задача похожа на какую-то другую — например, распределение регистров вычисления неожиданно сводится к задаче о раскраске графа.
Для того, чтобы добиться успеха в какой-нибудь дисциплине, необходимо стоять на её стыке с какой-то другой дисциплиной. Потому что всё, что можно сделать "внутри" дисциплины уже сделали поколения учёных до нас.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Перевод понимания из интуиции в логику
От: bnk СССР http://unmanagedvisio.com/
Дата: 25.11.20 14:01
Оценка:
Здравствуйте, Khimik, Вы писали:

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


Я бы точно начал со штудирования матчасти, а не бросился с шашкой на танк. Вроде же более-менее очевидно, что задача про минимальные циклы в графе?
Там (в графах) вроде как все уже неплохо перепахано, зачем изобретать велосипед.
Re[14]: Перевод понимания из интуиции в логику
От: Sinclair Россия https://github.com/evilguest/
Дата: 26.11.20 00:57
Оценка:
Здравствуйте, Khimik, Вы писали:
K>Да, конечно. Атомы в цикле должны встречаться только по разу.
Ну, тогда всё более-менее прямолинейно. Берём алгоритм Джонсона https://www.cs.tufts.edu/comp/150GA/homeworks/hw1/Johnson%2075.PDF, применяем.
S>>Дальше — что значит "состоит из вложенных меньших циклов"? В GDHEILOKNJ есть фрагмент HEILOK, но нету GDHKNJ.
K>Почему нет? Можно же по-другому пронумеровать атомы в цикле.
Ок, формализуем понятие "цикл C1 входит в С2":
— Длина С1 < длины C2
— Цикл С2 содержит в себе последовательность тех же вершин, что и С1 (либо в обратном порядке).

Это сразу даёт нам алгоритм сравнения двух циклов:
1. Если длина С2 <= длины C1, то возвращаем НЕТ
2. Берём 1 вершину из C1, ищем её в C2 (O(len(C2)))
3. Если не нашли, то возвращаем НЕТ
4. Если нашли (по индексу m), то начинаем проверять следующие вершины:
4.1. C1[i] = C2[(m+i) mod len(C2)] (O(len(C1))) — если хотя бы один не совпал, прерываем цикл и идём в 4.2
4.2. С1[i] = C2[(m-i) mod len(C2)] (O(len(C1))) — если хотя бы один не совпал, возвращаем НЕТ
5. Возвращаем ДА

На основе этого алгоритма легко построить алгоритм изгнания дубликатов:
1. Сортируем список циклов по возрастанию длины, группируем его по длине. То есть у нас есть список L списков циклов, где L[i] — список циклов с одинаковой длиной; и длина циклов в L[i+1] строго больше длины циклов в L[i].
2. Цикл: i перебирает все индексы списка L
3. Цикл: j перебирает все индексы списка L[i]
4. Цикл: k перебирает индексы L от i+1 до конца
5. Цикл: m перебирает все циклы списка L[k]
3. Если L[i][j] входит в L[k][m], то выбрасываем L[k][m] из L[k]
После окончания работы алгоритма в списке L останутся только те циклы, в которые не входят другие циклы.

S>>Интересуют ли вас циклы произвольной длины, или только 5/6 атомов, только углерода, и без самопересечений?


K>Проще искать любые циклы, произвольной длины.

Ну, вообще-то проще искать циклы фиксированной длины
S>>Могут ли встречаться случаи типа
S>>
       
       
S>>A   B     C   
S>> \ /|\  / 
S>>  D E F   
S>>  |/  |   
S>>  G   H  
S>>   \ / \  
S>>    I   J - K
S>>    |   
S>>    L   
S>>

S>>? Какие циклы должны быть построены в таком случае? GDBFHI/GEBFHI, или DBEG?

K>Такие циклы встречаются, хотя для моей задачи их находить в принципе необязательно; по идее нужно выделить все три цикла которые вы назвали.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.