Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Google或tools库中约束的布尔运算_C#_Constraint Programming_Boolean Operations_Or Tools - Fatal编程技术网

C# Google或tools库中约束的布尔运算

C# Google或tools库中约束的布尔运算,c#,constraint-programming,boolean-operations,or-tools,C#,Constraint Programming,Boolean Operations,Or Tools,我是约束编程的初学者,正在c#程序中使用 我想向我的解算器添加以下约束: ((t1>=12&&t1=16&&t2首先,必须为域定义变量(例如正整数)。 然后,在要求解算器求解之前,定义约束和目标函数 您可以轻松地将以下C 代码示例转换为您的问题: string solverType = "GLPK_MIXED_INTEGER_PROGRAMMING"; Solver solver = Solver.CreateSolver("IntegerProgramming", solver

我是约束编程的初学者,正在c#程序中使用

我想向我的解算器添加以下约束:


((t1>=12&&t1=16&&t2首先,必须为域定义变量(例如正整数)。 然后,在要求
解算器
求解之前,定义约束和目标函数

您可以轻松地将以下
C 
代码示例转换为您的问题:

    string solverType = "GLPK_MIXED_INTEGER_PROGRAMMING";
    Solver solver = Solver.CreateSolver("IntegerProgramming", solverType);
    if (solver == null)
    {
      Console.WriteLine("Could not create solver " + solverType);
      return;
    }
    // x1 and x2 are integer non-negative variables.
    Variable x1 = solver.MakeIntVar(0.0, double.PositiveInfinity, "x1");
    Variable x2 = solver.MakeIntVar(0.0, double.PositiveInfinity, "x2");

    // Minimize x1 + 2 * x2.
    Objective objective = solver.Objective();
    objective.SetMinimization();
    objective.SetCoefficient(x1, 1);
    objective.SetCoefficient(x2, 2);

    // 2 * x2 + 3 * x1 >= 17.
    Constraint ct = solver.MakeConstraint(17, double.PositiveInfinity);
    ct.SetCoefficient(x1, 3);
    ct.SetCoefficient(x2, 2);

    int resultStatus = solver.Solve();

    // Check that the problem has an optimal solution.
    if (resultStatus != Solver.OPTIMAL)
    {
      Console.WriteLine("The problem does not have an optimal solution!");
      return;
    }

    Console.WriteLine("Problem solved in " + solver.WallTime() +
                      " milliseconds");

    // The objective value of the solution.
    Console.WriteLine("Optimal objective value = " + objective.Value());

    // The value of each variable in the solution.
    Console.WriteLine("x1 = " + x1.SolutionValue());
    Console.WriteLine("x2 = " + x2.SolutionValue());

    Console.WriteLine("Advanced usage:");
    Console.WriteLine("Problem solved in " + solver.Nodes() +
                      " branch-and-bound nodes");
抄袭自


另一个简单方法是:


不幸的是,Google或tools库没有提供丰富的逻辑约束。如果您可以用Java开发实现,我建议您使用它,其中包括一个具有大量SAT约束的SAT解算器

在Google或tools中,当前制定逻辑约束的方法是将其转换为线性约束。最好先检查以了解转换的概念,然后查看HakanK的示例。此实现的一部分与逻辑约束相关:

//   if (i != j) =>
//       ((richer[i,j] = 1) <=> (richer[j,i] = 0))
for(int i = 0; i < n; i++) {
  for(int j = 0; j < n; j++) {
    if (i != j) {
      solver.Add((richer[i, j]==1) - (richer[j, i]==0) == 0);
    }
  }
}
//如果(i!=j)=>
//((富[i,j]=1)(富[j,i]=0))
对于(int i=0;i

您还可以检查。

您可以使用
MakeMin
MakeMax
分别对连接和分离进行编码。对每个片段进行编码后,您将得到如下结果:

var solver=new solver(“MY_CP_solver”);
var t1=solver.MakeIntVar(12,20,“t1”);
var t1ge=solver.makegreaterrequal(t1,12);
var t1le=solver.MakeLessOrEqual(t1,15);
var t1eath=solver.MakeMin(t1ge,t1le);
var t2=solver.MakeIntVar(12,20,“t2”);
var t2ge=solver.makegreaterrequal(t2,16);
var t2le=solver.MakeLessOrEqual(t2,18);
var t2both=solver.MakeMin(t2ge,t2le);
var或=solver.MakeMax(t1both,t2both);
求解器。添加(或==1);
求解器添加(t1+t2<30);
var db=solver.MakePhase(新[]{t1,t2},solver.CHOOSE_FIRST_UNBOUND,solver.ASSIGN_MIN_VALUE);
求解器。求解(db);
while(solver.NextSolution())
WriteLine($“t1:{t1.Value()},t2:{t2.Value()}”);
输出:

t1: 12, t2: 12
t1: 12, t2: 13
t1: 12, t2: 14
t1: 12, t2: 15
t1: 12, t2: 16
t1: 12, t2: 17
t1: 13, t2: 12
t1: 13, t2: 13
t1: 13, t2: 14
t1: 13, t2: 15
t1: 13, t2: 16
t1: 14, t2: 12
t1: 14, t2: 13
t1: 14, t2: 14
t1: 14, t2: 15
t1: 15, t2: 12
t1: 15, t2: 13
t1: 15, t2: 14
特别是,析取中的第一个约束始终处于活动状态

使用较新的
Google.OrTools.Sat.CpSolver
,您可以执行如下操作,其中我们引入了一个辅助布尔值
b
,它的属性是确保至少满足析取中的一个子句:

var模型=新的CpModel();
var t1=model.NewIntVar(12,20,“t1”);
var t2=model.NewIntVar(12,20,“t2”);
var b=model.NewBoolVar(“第一个约束激活”);
model.Add(t1>=12)。仅限forceif(b);
model.Add(t1=16).OnlyEnforceIf(b.Not());
模型。添加(t2)这个。v=v;
public override void OnSolutionCallback()=>Console.WriteLine($“t1:{Value(v[0])},t2:{Value(v[1])}”);
私有只读IntVar[]v;
}

请注意,这将多次找到相同的
(t1,t2)
-对(但具有不同的
b

我的语言是python,我认为应该很容易将跟随python代码转换为C

model=cp\u model.CpModel()
t1=model.NewIntVar(12,20,“t1”)
t1_bool_ge=model.NewBoolVar(“t1_bool_ge”)
t1_bool_le=model.NewBoolVar(“t1_bool_le”)
t1_bool_and=model.NewBoolVar(“t1_bool_and”)
tmp_t1=[]
tmp_t1.append(t1_bool_ge)
tmp_t1.append(t1_bool_le)
model.Add(t1>=12)。仅限强制(t1\u bool\u ge)#t1>=12
模型。添加(t1=16

Add(t2)谢谢,但我正在寻找约束上的布尔运算。
    Context ctx = new Context();

    IntExpr t1 = ctx.MkIntConst("t1");
    IntExpr t2 = ctx.MkIntConst("t2");
    IntNum c12 = ctx.MkInt(12);
    IntNum c15 = ctx.MkInt(15);
    IntNum c16 = ctx.MkInt(16);
    IntNum c18 = ctx.MkInt(18);
    IntNum c30 = ctx.MkInt(30);

    Solver solver = ctx.MkSolver();

    BoolExpr constraintInterval12_15 = 
        ctx.MkAnd(ctx.MkLe(c12, t1), ctx.MkLe(t1, c15));
    BoolExpr constraintInterval16_18 = 
        ctx.MkAnd(ctx.MkLe(c16, t2), ctx.MkLe(t2, c18));
    BoolExpr constraintLe20 = 
        ctx.MkLt(ctx.MkAdd(t1, t2), c30);

    solver.Assert(constraintLe20);
    solver.Assert(ctx.MkOr(constraintInterval12_15, constraintInterval16_18));

    if (solver.Check() == Status.SATISFIABLE)
    {
        Model m = solver.Model;

        Console.WriteLine("t1 = " + m.Evaluate(t1));
        Console.WriteLine("t2 = " + m.Evaluate(t2));
    }
//   if (i != j) =>
//       ((richer[i,j] = 1) <=> (richer[j,i] = 0))
for(int i = 0; i < n; i++) {
  for(int j = 0; j < n; j++) {
    if (i != j) {
      solver.Add((richer[i, j]==1) - (richer[j, i]==0) == 0);
    }
  }
}
t1: 12, t2: 12
t1: 12, t2: 13
t1: 12, t2: 14
t1: 12, t2: 15
t1: 12, t2: 16
t1: 12, t2: 17
t1: 13, t2: 12
t1: 13, t2: 13
t1: 13, t2: 14
t1: 13, t2: 15
t1: 13, t2: 16
t1: 14, t2: 12
t1: 14, t2: 13
t1: 14, t2: 14
t1: 14, t2: 15
t1: 15, t2: 12
t1: 15, t2: 13
t1: 15, t2: 14
model = cp_model.CpModel()

t1 = model.NewIntVar(12, 20, "t1")
t1_bool_ge = model.NewBoolVar("t1_bool_ge")
t1_bool_le = model.NewBoolVar("t1_bool_le")
t1_bool_and =  model.NewBoolVar("t1_bool_and")
tmp_t1 = []
tmp_t1.append(t1_bool_ge)
tmp_t1.append(t1_bool_le)
model.Add(t1 >= 12).OnlyEnforceIf(t1_bool_ge) # t1 >=12
model.Add(t1 <= 15).OnlyEnforceIf(t1_bool_le) # t1 <= 15
model.Add(t1_bool_and==1).OnlyEnforceIf(tmp_t1) # (t1 >=12)&&(t1 <= 15)

t2 = model.NewIntVar(12, 20, "t2")
t2_bool_ge = model.NewBoolVar("t2_bool_ge")
t2_bool_le = model.NewBoolVar("t2_bool_le")
t2_bool_and =  model.NewBoolVar("t2_bool_and")
tmp_t2 = []
tmp_t2.append(t2_bool_ge)
tmp_t2.append(t2_bool_le)
model.Add(t2 >= 16).OnlyEnforceIf(t2_bool_ge) # t2 >=16
model.Add(t2 <= 18).OnlyEnforceIf(t2_bool_le) # t2 <= 18
model.Add(t2_bool_and==1).OnlyEnforceIf(tmp_t2) #(t2 >=16) && (t2 <=18)

tmp_t1_t2 = []
tmp_t1_t2.append(t2_bool_and)
tmp_t1_t2.append(t1_bool_and)
model.Add(sum(tmp_t1_t2)==1) #((t1 >=12)&&(t1 <= 15))||((t2 >=16) && (t2 <=18))

model.Add(t1 + t2 < 30) # ( t1 + t2 ) < 30