manbet体育手机客户端


数独


“版权2019,古罗比优化有限责任公狗万app足彩司”“数独示例”数独板是一个9x9的网格,它被进一步划分为一个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。每个值在每个3x3子网格中使用一次(总和网格x(i,j,v)=1),本例的输入数据集可在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如果args.Length<1,那么Console.WriteLine(“用法:sudoku_vb filename”)返回End If Try Dim env as New GRBEnv()Dim model as New GRBModel(env))创建模型变量Dim vars的三维数组Dim as GRBVar(,,,,)=New GRBVar(n-1,n-1,n-1){}对于i作为整数=0到n-1对于j作为整数=0到n-1对于v作为整数=0到n-1 Dim st As String=“G_”&i&“”&j&“”&v变量(i,j,v)=model.AddVar(0.0,1.0,0.0,GRB.BINARY,st)下一步“添加约束Dim expr As GRBLinExpr”每个单元格必须为i As Integer=0取一个值,为j As Integer=0取一个值,为n-1 expr=0为v As Integer=0取一个值,为n-1 expr.AddTerm(1.0,vars(i,j,v))下一步Dim st As String=“v_”&i&“_”&j model.AddConstr(expr=1,st)Next Next“每一个值在每一行中显示一次,i为整数=0到n-1,v为整数=0到n-1,expr=0,j为整数=0到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“每个值在每列中显示一次,对于j为整数=0到n-1对于v为整数=0到n-1 expr=0对于i为整数=0到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“每个值在每个子网格中显示一次,v为Integer=0到n-1,i0为Integer=0到s-1,j0为Integer=0到s-1,expr=0,i1为Integer=0到s-1,j1为Integer=0到s-1,expr.AddTerm(1.0,vars(i0*s+j1,v))下一个Dim st为String=“sub_u”&v&“&u0&”&j0 model.AddConstr(expr=1,st)Next-Next“将与预先指定的单元格相关联的变量Dim sr作为StreamReader=File.OpenText(args(0))作为i的整数=0到n-1 Dim input作为String=sr.ReadLine()作为j的整数=0到n-1 Dim val作为整数=Microsoft.VisualBasic.Asc(input(j))-48-1'0如果val>=0,那么vars(i,j,val).LB=1.0如果下一步“Optimize model.Optimize()”将模型写入文件模型。Write(“sudoku.lp”)Dim x As Double(,)=model.Get(GRB.DoubleAttr.x,vars)Console.WriteLine()对于i As Integer=0到n-1对于j As Integer=0到n-1对于v As Integer=0到n-1如果x(i,j,v)>0.5那么Console.Write(v+1)End If Next Console.WriteLine()Next“Dispose of model和env model.Dispose()env.Dispose()捕获e作为GRBEException Console.WriteLine(“错误代码:”&e.ErrorCode&“&e.Message)End Try End子端类