manbet体育手机客户端


sudoku.r.


# Copyright 2019, 狗万app足彩Gurobi Optimization, LLC */ # #数独例子。数独板是一个9x9网格,它被进一步划分为3x3网格# of 3x3网格。网格中的每个单元格都必须接受0到9之间的值。在同一行、列或3x3子网格中,没有两个网格单元格可以使用#相同的值。# #在MIP公式中,二进制变量x[i,j,v]表示# cell 是否取值'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。# #这个例子的输入数据集可以在examples/data/sudoku*中找到。 # 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 environment env <- list() env<- list() model . logfile <- 'sudoku.log' #构建模型Modelname <-“sudoku”模型modelsense <- 'min' #创建变量名、类型和边界模型vtype <- 'B'模型lb <- rep(0, nVars)模型ub <- rep(1, nVars)模型varnames <- rep(", nVars) for (i in 1:Dim) {for (j in 1:Dim) {for (k in 1:Dim) {if (board[i,j] == k)模型lb[varIdx(i,j,k)] = 1模型varnames[varIdx(i,j,k)] = paste0('X',i,j,k)}}} #创建(空)约束:模型一个<- spMatrix(0,nVars)模型RHS <- c()模型感觉< -  c()模型{B <- spMatrix(1, nVars, i = rep(1,Dim), j = varIdx(i,j,1:Dim), x = rep(1,Dim))模型a < -  rbind(型号A、B)模型rhs < - c(模型, 1)模型感觉< -  c(模型意义上说,' = ')模型constrnames < - c(模型{for (k in 1:Dim) {B <- spMatrix(1, nVars, i = rep(1,Dim), j = varIdx(i,1:Dim,k), x = rep(1,Dim))模型的每个列必须出现一次a < -  rbind(型号A、B)模型rhs < - c(模型, 1)模型感觉< -  c(模型意义上说,' = ')模型constrnames < - c(模型Constrame,Paste0('deportvalueInrow',i,k))}}} #ach值必须在每行中出现一次(j在1:dim中的){(k在1:dim中){b < -  spmatrix(1,nvars,i = rep(1,dim),j = varidx(1:dim,j,k),x = rep(1,dim))模型a < -  rbind(型号A、B)模型rhs < - c(模型, 1)模型感觉< -  c(模型意义上说,' = ')模型constrnames < - c(模型Constrame,Paste0('ordrevalueincolumn',j,k))}}#每个值必须在每个子级Subdim < -  3中出现一次(k在1:dim中的k){(g1在1:subdim){for(g21:subdim){b < -  spmatrix(1,nvars,i = rep(1,dim),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 = rep(1,dim))模型a < -  rbind(型号A、B)模型rhs < - c(模型, 1)模型感觉< -  c(模型意义上说,' = ')模型constrnames < - c(模型}} #保存模型gurobi_write(model, 'sudoku ');#优化模型结果<- gurobi(model, env = env) if (result . lp', envstatus =='最佳'){cat('解决方案:\ n')cat('-----------------------------------------------------\n') for (i in 1:Dim) { for (j in 1:Dim) { if (j %% SubDim == 1) cat('| ') for (k in 1:Dim) { if (resultx [varidx(i,j,k)]> 0.99){cat(k,'')}}} cat('| \ n')如果(i %% subdim == 0)cat('------------------------------ \ n')}} else {cat('问题是不可行的\ n')}#清除空间RM(结果,型号,板,LINN,ENV)