/* * Copyright 2002, 2003, 2004, 2005 - Koalog */ package com.koalog.jcs.examples; import org.apache.log4j.PropertyConfigurator; import com.koalog.jcs.variable.IntegerVariable; import com.koalog.jcs.solver.SplitSolver; import com.koalog.jcs.solver.KeepOrderVariableHeuristic; import com.koalog.jcs.solver.DecreasingOrderDomainHeuristic; import com.koalog.jcs.constraint.BaseProblem; import com.koalog.jcs.constraint.arithmetic.Exactly; import com.koalog.jcs.constraint.arithmetic.Hyperplan; import com.koalog.jcs.constraint.arithmetic.Prod; /** * Find the value of each digit verifying the following multiplication and * such that each digit (0,1,...,9) appears exactly twice: * *
* X1 X2 X3 * * X4 X5 X6 * ----------- * X7 X8 X9 * + X10 X11 X12 * + X13 X14 X15 * = ------------------- * X16 X17 X18 X19 X20 ** * @author Daniel Diaz * @author Yan Georget */ public class UnknownMultiplicationProblem extends BaseProblem { //------------------------------------------------------------------------ // CONSTRUCTORS //------------------------------------------------------------------------ /** * Sole constructor. */ public UnknownMultiplicationProblem() { super(); IntegerVariable[] vars = new IntegerVariable[20]; for (int i=1; i<=20; i++) { vars[i-1] = new IntegerVariable("x"+i, 0, 9); } for (int j=0; j<10; j++) { add(new Exactly(2, vars, j)); } IntegerVariable y = new IntegerVariable(0, 999); add(new Hyperplan(new int[]{100, 10, 1, -1}, new IntegerVariable[] { vars[0], vars[1], vars[2], y }, 0)); IntegerVariable z1 = new IntegerVariable(0, 999); add(new Hyperplan(new int[]{100, 10, 1, -1}, new IntegerVariable[] { vars[6], vars[7], vars[8], z1 }, 0)); IntegerVariable z2 = new IntegerVariable(0, 999); add(new Hyperplan(new int[]{100, 10, 1, -1}, new IntegerVariable[] { vars[9], vars[10], vars[11], z2 }, 0)); IntegerVariable z3 = new IntegerVariable(0, 999); add(new Hyperplan(new int[]{100, 10, 1, -1}, new IntegerVariable[] { vars[12], vars[13], vars[14], z3 }, 0)); add(new Prod(z1, y, vars[5])); add(new Prod(z2, y, vars[4])); add(new Prod(z3, y, vars[3])); add(new Hyperplan(new int[]{100, 10, 1, 1000, 100, 10, 10000, 1000, 100, -10000, -1000, -100, -10, -1}, new IntegerVariable[] {vars[6], vars[7], vars[8], vars[9], vars[10], vars[11], vars[12], vars[13], vars[14], vars[15], vars[16], vars[17], vars[18], vars[19]}, 0)); setVariables(vars); } //------------------------------------------------------------------------ // STATIC METHODS //------------------------------------------------------------------------ /** * Runs the problem. * @param args the command line arguments * args[0] must contain a log4j properties file location */ public static void main(String[] args) { PropertyConfigurator.configure(args[0]); new SplitSolver(new UnknownMultiplicationProblem(), new KeepOrderVariableHeuristic(), new DecreasingOrderDomainHeuristic()).solve(2); } }