R语言igraph网格彩色区域连通性异常修复请求
网格彩色连通图案生成问题
我编写了代码尝试在方格网格上生成彩色图案,要求任意颜色的所有方格无需经过其他颜色即可互相连通。
1. 构建网格
library(igraph) create_lattice_graph <- function(width, height) { coords <- expand.grid(x = 1:width, y = 1:height) n_nodes <- nrow(coords) horizontal_edges <- cbind(1:(n_nodes-1), 2:n_nodes) horizontal_edges <- horizontal_edges[horizontal_edges[,1] %% width != 0, ] vertical_edges <- cbind(1:(n_nodes-width), (width+1):n_nodes) edges <- rbind(horizontal_edges, vertical_edges) g <- make_graph(edges = t(edges), n = n_nodes, directed = FALSE) return(list(graph = g, layout = as.matrix(coords))) }
2. 颜色选择有效性检查函数
is_valid_move <- function(position, player, territories, g) { neighbors <- neighbors(g, position) has_same_territory_neighbor <- any(territories[neighbors] == player) return(has_same_territory_neighbor) }
3. 生成颜色区域函数
generate_territories <- function(width, height, source_nodes) { lattice <- create_lattice_graph(width, height) g <- lattice$graph n_nodes <- vcount(g) n_players <- length(source_nodes) territories <- rep(NA, n_nodes) for(i in 1:n_players) { territories[source_nodes[i]] <- i } while(any(is.na(territories))) { empty_positions <- which(is.na(territories)) valid_moves <- list() for(pos in empty_positions) { neighbors <- neighbors(g, pos) neighbor_territories <- unique(territories[neighbors]) neighbor_territories <- neighbor_territories[!is.na(neighbor_territories)] if(length(neighbor_territories) > 0) { for(territory in neighbor_territories) { if(is_valid_move(pos, territory, territories, g)) { valid_moves[[length(valid_moves) + 1]] <- list( position = pos, territory = territory ) } } } } if(length(valid_moves) == 0) break selected_move <- sample(length(valid_moves), 1) position <- valid_moves[[selected_move]]$position territory <- valid_moves[[selected_move]]$territory territories[position] <- territory } return(territories) }
4. 可视化相关函数
convert_to_color_matrix <- function(territories, width, height) { color_matrix <- matrix(".", nrow = height, ncol = width) color_map <- c("R", "B", "G", "Y", "P") for(i in 1:length(territories)) { row <- ceiling(i/width) col <- ((i-1) %% width) + 1 color_matrix[row, col] <- color_map[territories[i]] } return(color_matrix) } plot_color_matrix <- function(color_matrix, source_nodes = NULL) { plot(NULL, xlim = c(0, ncol(color_matrix)), ylim = c(0, nrow(color_matrix)), xlab = "", ylab = "", axes = FALSE, asp = 1) color_map <- c( "R" = "#FF6B6B", # 红色 "B" = "#4DABF7", # 蓝色 "G" = "#69DB7C", # 绿色 "Y" = "#FFD93D", # 黄色 "P" = "#DA77F2", # 紫色 "." = "#F8F9FA" # 空白 ) for(i in 1:nrow(color_matrix)) { for(j in 1:ncol(color_matrix)) { linear_idx <- (i-1)*ncol(color_matrix) + j is_source <- linear_idx %in% source_nodes rect(j-1, nrow(color_matrix)-i, j, nrow(color_matrix)-i+1, col = color_map[color_matrix[i,j]], border = if(is_source) "black" else "gray90", lwd = if(is_source) 2 else 0.5) # 添加节点编号 text(j-0.5, nrow(color_matrix)-i+0.5, linear_idx, col = "black", cex = 0.4) } } }
完整模拟代码
width <- 10 height <- 10 source_nodes <- c(1, 10, 91, 100, 45) territories <- generate_territories(width, height, source_nodes) color_matrix <- convert_to_color_matrix(territories, width, height) plot_color_matrix(color_matrix, source_nodes) title("Territory Simulation")
问题描述
多次运行模拟后,发现颜色连通规则有时会被违反:部分颜色区域被其他颜色隔断,导致该颜色的方格无法互相连通(比如红色区域被紫色区域隔开)。
请问如何解决这个问题?
内容的提问来源于stack exchange,提问作者farrow90
相关产品推荐
相关产品推荐

