79431603

Date: 2025-02-12 00:17:43
Score: 1
Natty:
Report link

Looks like in addAllDifferent you are not allowed to add linear expressions, even though signature of the function allows it.

Source: https://github.com/google/or-tools/blob/6fc19304dfad3f5105da74c898a2aa0f8b450120/ortools/sat/cp_model_checker.cc#L279

So you have to introduce additional variables, mark them as equal to those expressions, and then use these for constraints :(

Posting the explicit code, even though you can simplify this by writing your own addAllDifferent

fun main() {
    Loader.loadNativeLibraries()

    val model = CpModel()

    val x = model.newIntVar(1, 100, "x")
    val y = model.newIntVar(1, 100, "y")
    val z = model.newIntVar(1, 100, "z")
    val a11_var = model.newIntVar(1, 100, "a11")
    val a12_var = model.newIntVar(1, 100, "a12")
    val a13_var = model.newIntVar(1, 100, "a13")
    val a21_var = model.newIntVar(1, 100, "a21")
    val a23_var = model.newIntVar(1, 100, "a23")
    val a31_var = model.newIntVar(1, 100, "a31")
    val a32_var = model.newIntVar(1, 100, "a32")
    val a33_var = model.newIntVar(1, 100, "a33")

    val a11 = LinearExpr.sum(arrayOf(x, y))
    val a12 = LinearExpr.weightedSum(arrayOf(x, y, z), longArrayOf(1, -1, -1))
    val a13 = LinearExpr.sum(arrayOf(x, z))
    val a21 = LinearExpr.weightedSum(arrayOf(x, y, z), longArrayOf(1, -1, 1))
    val a23 = LinearExpr.weightedSum(arrayOf(x, y, z), longArrayOf(1, 1, -1))
    val a31 = LinearExpr.weightedSum(arrayOf(x, z), longArrayOf(1, -1))
    val a32 = LinearExpr.sum(arrayOf(x, y, z))
    val a33 = LinearExpr.weightedSum(arrayOf(x, y), longArrayOf(1, -1))

    model.addEquality(a11_var, a11)
    model.addEquality(a12_var, a12)
    model.addEquality(a13_var, a13)
    model.addEquality(a21_var, a21)
    model.addEquality(a23_var, a23)
    model.addEquality(a31_var, a31)
    model.addEquality(a32_var, a32)
    model.addEquality(a33_var, a33)

    val allVars = arrayOf(
        a11_var, a12_var, a13_var,
        a21_var, x, a23_var,
        a31_var, a32_var, a33_var)

    model.addAllDifferent(allVars)

    model.minimize(a32)

    val solver = CpSolver()
    val status = solver.solve(model)

    if (status == CpSolverStatus.OPTIMAL) {
        val xVal = solver.value(x)
        val yVal = solver.value(y)
        val zVal = solver.value(z)
        println("(x, y, z)=($xVal, $yVal, $zVal)")

        val a11Val = solver.value(a11_var)
        val a12Val = solver.value(a12_var)
        val a13Val = solver.value(a13_var)
        val a21Val = solver.value(a21_var)
        val a23Val = solver.value(a23_var)
        val a31Val = solver.value(a31_var)
        val a32Val = solver.value(a32_var)
        val a33Val = solver.value(a33_var)
        println("$a11Val \t $a12Val \t $a13Val")
        println("$a21Val \t $xVal \t $a23Val")
        println("$a31Val \t $a32Val \t $a33Val")
    } else {
        println(status)
        println(solver.solutionInfo)
    }

}

Output

(x, y, z)=(5, 1, 3)
6    1   8
7    5   3
2    9   4
Reasons:
  • Blacklisted phrase (1): :(
  • Long answer (-1):
  • Has code block (-0.5):
  • Self-answer (0.5):
  • Low reputation (1):
Posted by: Anita