まず、変数をドメインに対して定義する必要があります (例: 正の整数)。Solver
次に、が解を求められる前に、制約と目的関数が定義されます。
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");
ここからコピペ。
Håkan Kjellerstrandによる別の簡単な例:
Solver solver = new Solver("Volsay", Solver.CLP_LINEAR_PROGRAMMING);
//
// Variables
//
Variable Gas = solver.MakeNumVar(0, 100000, "Gas");
Variable Chloride = solver.MakeNumVar(0, 100000, "Cloride");
Constraint c1 = solver.Add(Gas + Chloride <= 50);
Constraint c2 = solver.Add(3 * Gas + 4 * Chloride <= 180);
solver.Maximize(40 * Gas + 50 * Chloride);
int resultStatus = solver.Solve();
if (resultStatus != Solver.OPTIMAL) {
Console.WriteLine("The problem don't have an optimal solution.");
return;
}
Console.WriteLine("Objective: {0}", solver.ObjectiveValue());
Console.WriteLine("Gas : {0} ReducedCost: {1}",
Gas.SolutionValue(),
Gas.ReducedCost());
Console.WriteLine("Chloride : {0} ReducedCost: {1}",
Chloride.SolutionValue(),
Chloride.ReducedCost());
Google OR Toolsで選言的制約を定義する方法がわかりません。
Microsoft Z3 SolverC#
のAPI を使用すると、次のように実行できます。
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));
}