Алгоритм поиска самого длинного кластера. (В идеале Python, возможно Matlab)

#python #algorithm #matplotlib #math #path-finding

#python #алгоритм #matplotlib #математика #поиск пути

Вопрос:

Я экспериментирую с чем-то, называемым «теорией просачивания связей», эффективно у вас есть некоторая решетчатая сетка n на n, а затем (случайным образом) с некоторой вероятностью p вы сохраняете или удаляете ребро. Вот пример: йоу

Вот мой код:
введите описание изображения здесь

У меня есть 2 вопроса к этому фантастическому сообществу:

  1. Как мне заставить вставленную мной сетку отображаться для всех целых значений, пока она отображается только для кратных 5. (тонкие серые линии)
  2. Я хотел бы иметь алгоритм, который обеспечивает нечто, называемое «самым длинным кластером». Кластер представляет собой связный граф ребер (толстые черные линии), например, в верхнем левом углу у нас есть кластер из 6 (перевернутая f-образная форма), кластер из 2 (маленькая головка стрелки),кластер из 4 (квадрат) и кластер из 3 (перевернутый L) Самый длинный кластер — это просто самый длинный.

Любая помощь очень ценится. Если я плохо задал этот вопрос, пожалуйста, дайте мне знать или если требуется какое-либо разъяснение.

 def graph_contruction(n,p):
for i in range(0,n):
    for t in range(0,n):
        if coin(p):
            plt.hlines(i,t,t 1)
        if coin(p):
            plt.vlines(i,t,t 1)
plt.title('A ' str(n)  ' by '  str(n)   ' grid with probability '  str(p))
plt.show()
 

Комментарии:

1. Вам будет намного проще помочь, если мы сможем просто скопировать и вставить ваш код вместо того, чтобы вводить его, поэтому, пожалуйста, вставьте ваш код непосредственно в вопрос вместо картинки.

2. Конечно, сейчас подойдет 🙂

Ответ №1:

Ваша первая проблема может быть просто решена путем включения незначительных тиков:

 plt.figure(figsize=(8,8))
plt.minorticks_on()
plt.grid(True, which="both")
graph_contruction(25, 0.5)
 

Ответ №2:

Чтобы дать вам некоторое представление о том, как думать о проблеме 2):

Шаг 1) Создайте функцию, которая проверяет связанные с каждой точкой точки и возвращает набор этих точек. Что для (0,0) было бы ничем. Но для (0,1) эта функция вернет {(0,1), (1,0), (1,1), (2,0)} — a.k.a набор связанных точек, в которых также присутствует точка поворота (0,1).

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

Шаг 3) Теперь вы можете объединять множества, если в них есть общая точка. Смотрите ниже:

 set_1 = {(1,0), (1,1), (2,0)}

set_2 = {(1,2), (1,1), (2,1), (1,0)}

if any(x in set_1 for x in set_2):
    set_1.update(set_2) 
 

Итак, я просто попытался сформулировать ваше мышление, а не дать вам точный код. Вероятно, вы захотите использовать понимание, чтобы сохранить набор сравнений pythonic.

Если вы действительно испытываете трудности, я могу найти свой код, в котором я реализовал нечто подобное. Я искал его сегодня, но не смог найти. Это решит эту проблему, если вы действительно сдались, но это забавная задача, так что попробуйте.