sudoku_vb.vb


“版权2023,Gurobi Opt狗万app足彩imization, LLC”“数独例子。“数独板是一个9x9的网格,它被进一步划分为3x3网格的3x3网格。”网格中的每个单元格必须取0到9之间的值。”同一行、列或3x3子网格中的两个网格单元格不能具有“相同的值”。在MIP公式中,二进制变量x(i,j,v)表示' cell 是否取值'v'。约束条件如下:每个单元格必须取一个值(sum_v x(i,j,v) = 1)“2。每个值每行只使用一次(sum_i x(i,j,v) = 1)“3。 Each value is used exactly once per column (sum_j x(i,j,v) = 1) ' 4. Each value is used exactly once per 3x3 subgrid (sum_grid x(i,j,v) = 1) ' ' Input datasets for this example can be found in examples/data/sudoku*. Imports System Imports System.IO Imports Gurobi Class sudoku_vb Shared Sub Main(ByVal args as String()) Dim n As Integer = 9 Dim s As Integer = 3 If args.Length < 1 Then Console.WriteLine("Usage: sudoku_vb filename") Return End If Try Dim env As New GRBEnv() Dim model As New GRBModel(env) ' Create 3-D array of model variables Dim vars As GRBVar(,,) = New GRBVar(n - 1, n - 1, n - 1) {} For i As Integer = 0 To n - 1 For j As Integer = 0 To n - 1 For v As Integer = 0 To n - 1 Dim st As String = "G_" & i & "_" & j & "_" & v vars(i, j, v) = model.AddVar(0.0, 1.0, 0.0, GRB.BINARY, st) Next Next Next ' Add constraints Dim expr As GRBLinExpr ' Each cell must take one value For i As Integer = 0 To n - 1 For j As Integer = 0 To n - 1 expr = 0 For v As Integer = 0 To n - 1 expr.AddTerm(1.0, vars(i, j, v)) Next Dim st As String = "V_" & i & "_" & j model.AddConstr(expr = 1, st) Next Next ' Each value appears once per row For i As Integer = 0 To n - 1 For v As Integer = 0 To n - 1 expr = 0 For j As Integer = 0 To n - 1 expr.AddTerm(1.0, vars(i, j, v)) Next Dim st As String = "R_" & i & "_" & v model.AddConstr(expr = 1, st) Next Next ' Each value appears once per column For j As Integer = 0 To n - 1 For v As Integer = 0 To n - 1 expr = 0 For i As Integer = 0 To n - 1 expr.AddTerm(1.0, vars(i, j, v)) Next Dim st As String = "C_" & j & "_" & v model.AddConstr(expr = 1, st) Next Next ' Each value appears once per sub-grid For v As Integer = 0 To n - 1 For i0 As Integer = 0 To s - 1 For j0 As Integer = 0 To s - 1 expr = 0 For i1 As Integer = 0 To s - 1 For j1 As Integer = 0 To s - 1 expr.AddTerm(1.0, vars(i0 * s + i1, j0 * s + j1, v)) Next Next Dim st As String = "Sub_" & v & "_" & i0 & "_" & j0 model.AddConstr(expr = 1, st) Next Next Next ' Fix variables associated with pre-specified cells Dim sr As StreamReader = File.OpenText(args(0)) For i As Integer = 0 To n - 1 Dim input As String = sr.ReadLine() For j As Integer = 0 To n - 1 Dim val As Integer = Microsoft.VisualBasic.Asc(input(j)) - 48 - 1 ' 0-based If val >= 0 Then vars(i, j, val).LB = 1.0 End If Next Next ' Optimize model model.Optimize() ' Write model to file model.Write("sudoku.lp") Dim x As Double(,,) = model.Get(GRB.DoubleAttr.X, vars) Console.WriteLine() For i As Integer = 0 To n - 1 For j As Integer = 0 To n - 1 For v As Integer = 0 To n - 1 If x(i, j, v) > 0.5 Then Console.Write(v + 1) End If Next Next Console.WriteLine() Next ' Dispose of model and env model.Dispose() env.Dispose() Catch e As GRBException Console.WriteLine("Error code: " & e.ErrorCode & ". " & e.Message) End Try End Sub End Class