Я недавно изучил гипотезу Коллатца и попытался найти метод для вычисления вектора для заданного числа, ведущего к 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)
когда я пытаюсь использовать другой макет, график выглядит совсем иначе, чем тот, к которому я стремился
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))
Есть ли в igraph компоновка, которая создала бы структуру, аналогичную той, которую я связал в начале?