Визуализация графика Коллатца с помощью igraph - PullRequest
0 голосов
/ 31 октября 2018

Я недавно изучил гипотезу Коллатца и попытался найти метод для вычисления вектора для заданного числа, ведущего к 1, и визуализации нескольких из этих векторов одновременно. Однако я не могу понять, как придумать хороший макет для графика. В идеале я хотел бы иметь график типа this или this .

вот что я делаю:

1) Функция для вычисления значений Коллатца

Collatz <- function(x){

    # checking whether the number is a mathematical integer
    if(round(x) != x){

            warning("x must be an integer larger than 1")
            break
    }

    # initializing output vector
    vec <- integer()
    vec[1] <- x

    # checking whether the input is valid
    if(x > 0){

            # continuing computation until we get a 1 in the vector
            while( 1 %in% vec == FALSE){

                    # when the last element of the vector is even
                    if(vec[length(vec)] %% 2 == 0){

                            # initilaize a new element in vec by dividing the previous one by 2
                            vec[length(vec)+1] <- vec[length(vec)]/2

                    }

                    # when the last element of the vector is odd
                    if(vec[length(vec)] %% 2 != 0){

                            # initilaize a new element in vec by multiplying the previous one with 3 and adding 1
                            vec[length(vec)+1] <- 3*vec[length(vec)]+1
                    }

            }   

    } else(warning("x must be an integer larger than 1"))

    # returning output vector except for the last element (which will be 4 insted of 1 due to the while loop)
    return(vec[-length(vec)])
}

2) Функция для создания графика для всех векторов в заданном диапазоне

CollatzGraphing <- function(x){

    # loading igraph library
    library(igraph)

    Numbers <- 1:x
    List <- sapply(Numbers,Collatz)

    # sorting list by length and removing empty lists
    x <- List[order(sapply(List,length),decreasing=T)]
    x <- x[sapply(x,length) >= 2]

    # transforming the vectors into graph format
    x <- lapply(x, rep, each = 2)
    x <- lapply(x, function(y){y[-c(1,length(y))]})
    x <- lapply(x, function(y){as.character(y)})

    # transforming the prepared vectors into graph objects
    x <- lapply(x, graph, directed=TRUE)

    # creating a union of all graph objects
    CompleteGraph <- do.call(union, x)

    # plotting graph
    Plot <- plot(CompleteGraph,
                 vertex.size = 5,
                 edge.arrow.size=.1,
                 vertex.label.cex = 0.5,
                 vertex.color = "white")

    # returning graph object
    return(CompleteGraph)

}

Когда я использую вторую функцию без указания макета, я получаю что-то вроде этого:

Graph1 <- CollatzGraphing(20)

graph

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

V(Graph1)
plot(Graph1,
        vertex.size = 5,
        edge.arrow.size=.1,
        vertex.label.cex = 0.5,
        vertex.color = "white",
        layout = layout_as_tree(Graph1, circular = TRUE, root = 21))

enter image description here

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...