sudoku.R


# 2023年版权,Gurobi优化狗万app足彩,LLC * / # #数独的例子。# # 9 x9网格数独板,这是进一步分为3 x3网格# 3 x3的网格。网格中的每个单元格必须采取一个值从0到9。#没有两个网格细胞在相同的行,列,或3 x3次网格可能需要#相同的值。# # MIP配方,二进制变量x (i, j, v)表明是否#细胞< i, j >价值“v”。约束如下:# 1。每个单元格必须采取一个值(sum_v x (i, j, v) = 1) # 2。每个值完全使用一次每一行(sum_i x (i, j, v) = 1) # 3。每个值是完全一次使用每列(sum_j x (i, j, v) = 1) # 4。每个值是完全一次使用/ 3 x3的次网格(sum_grid x (i, j, v) = 1) # #输入数据集对于这个示例中可以找到例子/数据/数独*。 # library(Matrix) library(gurobi) args <- commandArgs(trailingOnly = TRUE) if (length(args) < 1) { stop('Usage: Rscript sudoku.R filename\n') } # Read input file conn <- file(args[1], open='r') if(!isOpen(conn)) { cat('Could not read file',args[1],'\n') stop('Stop now\n') } linn <- readLines(conn) close(conn) # Ensure that all lines have the same length as the number of lines, and # that the character set is the correct one. # Load fixed positions in board Dim <- length(linn) board <- matrix(0, Dim, Dim, byrow = TRUE) if (Dim != 9) { cat('Input file',args[1],'has',Dim,'lines instead of 9\n') stop('Stop now\n') } for (i in 1:Dim) { line <- strsplit(linn[[i]],split='')[[1]] if (length(line) != Dim) { cat('Input line',i,'has',length(line),'characters, expected',Dim,'\n') stop('Stop now\n') } for (j in 1:Dim) { if (line[[j]] != '.') { k <- as.numeric(line[[j]]) if (k < 1 || k > Dim) { cat('Unexpected character in Input line',i,'character',j,'\n') stop('Stop now\n') } else { board[i,j] = k } } } } # Map X[i,j,k] into an index variable in the model nVars <- Dim * Dim * Dim varIdx <- function(i,j,k) {i + (j-1) * Dim + (k-1) * Dim * Dim} cat('Dataset grid:',Dim,'x',Dim,'\n') # Set up parameters params <- list() params美元日志文件<——‘数独。日志' #构建模型模型< -列表()模型美元modelname < -“数独”模型美元modelsense < -“min”#创建变量名称,类型,和边界模型美元vtype < - B模型美元磅< -代表(0,据nvar)模型美元乌兰巴托< -代表(1,据nvar)模型美元varnames < -代表(”,据nvar)(我在1:暗){(j在1:暗){(k 1:暗){如果(委员会(i, j) = = k)模型美元磅(varIdx (i, j, k)] = 1模型美元varnames [varIdx (i, j, k)] = paste0 (“X”, i, j, k)}}} #创建(空的)约束:模型美元< - spMatrix(0,据nvar)模型美元rhs < - c()模型美元感觉< - c()模型美元constrnames < - c() #每个细胞有价值:对(我在1:暗){(1 j:暗){B < - spMatrix(1、据nvar i =代表(暗),j = varIdx (i, j, 1:暗),x =代表(暗))模型美元< - rbind(模型美元A、B)模型美元rhs < - c(模型美元,1)模型美元< - c(模型美元意义上说,' = ')模型美元constrnames < - c(模型美元constrnames, paste0 (OneValInCell, i, j))}} #每个值在每一列必须出现一次(我在1:暗){(k 1:暗){B < - spMatrix(1、据nvar i =代表(暗),j = varIdx(我,1:昏暗,k), x =代表(暗))模型美元< - rbind(模型美元A、B)模型美元rhs < - c(模型美元,1)模型美元< - c(模型美元意义上说,' = ')模型美元constrnames < - c(模型美元constrnames, paste0 (OnceValueInRow, i (k))}} #每个值在每一行必须出现一次(1 j:暗){(k 1:暗){B < - spMatrix(1、据nvar i =代表(暗),j = varIdx(1:昏暗的,j, k), x =代表(暗))模型美元< - rbind(模型美元A、B)模型美元rhs < - c(模型美元,1)模型美元< - c(模型美元意义上说,' = ')模型美元constrnames < - c(模型美元constrnames paste0 (OnceValueInColumn, j, k))}} #每个值在每一次网格必须出现一次SubDim < - 3 (k 1:暗){(g1在1:SubDim) {(g2在1:SubDim) {B < - spMatrix(1、据nvar i =代表(暗),j = c (varIdx (1 + (g1-1) * SubDim (g2-1) * SubDim + 1: SubDim, k), varIdx (2 + (g1-1) * SubDim (g2-1) * SubDim + 1: SubDim, k), varIdx (3 + (g1-1) * SubDim (g2-1) * SubDim + 1: SubDim, k)), x =代表(暗))模型美元< - rbind(模型美元A、B)模型美元rhs < - c(模型美元,1)模型美元< - c(模型美元意义上说,' = ')模型美元constrnames < - c(模型美元constrnames paste0 (OnceValueInSubGrid, g1, g2, k))}}} # gurobi_write保存模型(模型,“数独。lp ', params) #优化模型结果< - gurobi(模型、params = params)如果(结果美元状态= = '最佳'){猫(解决方案:\ n)猫(“- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n”),(我在1:暗){(1 j:暗){如果(j % % SubDim = = 1)猫(“|”)(k 1:暗){如果结果美元x [varIdx (i, j, k)) > 0.99){猫(k, ' ')}}}猫(“| \ n”)如果(我% % SubDim = = 0)猫(“- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ n”)其他}}{猫(问题是不可行的\ n)} #腾出rm(结果,模型、板、绝壁,params)