CPLEX中的Sudoku Solver

时间:2013-12-02 00:57:05

标签: java mathematical-optimization sudoku cplex

我正在尝试解决我创建的Sudoku程序。 这是目标函数

IloNumExpr numExpr = cplex.linearNumExpr();
cplex.addMaximize(numExpr);

我要做的是添加约束或新的目标函数,以允许9x9数独矩阵中的四个角点具有5 > 7 > 4 > 6 > 8 > 2 > 3 > 9 > 1

的特殊偏好

有关完成此操作需要什么数学公式的任何想法?

1 个答案:

答案 0 :(得分:1)

您可以通过向目标函数添加元素来强制执行首选项。

假设您有类型

的变量

选择[行] [山口] [位]

如果选择[2] [3] [8] = 1,则表示方形(2,3)的值为8.

四个角是: 1,1; 1,9; 9,1; 9,9-

基本上,您需要将以下内容添加到现有的目标函数中。

9 x choose[1][1][5] + 8 x choose[1][1][7] + 7 x choose[1][1][4] + ... + 2 x choose[1][1][9] + 1 x choose[1][1][1]
9 x choose[1][9][5] + 8 x choose[1][9][7] + 7 x choose[1][9][4] + ... + 2 x choose[1][9][9] + 1 x choose[1][9][1]
9 x choose[9][1][5] + 8 x choose[9][1][7] + 7 x choose[9][1][4] + ... + 2 x choose[9][1][9] + 1 x choose[9][1][1]
9 x choose[9][9][5] + 8 x choose[9][9][7] + 7 x choose[9][9][4] + ... + 2 x choose[9][1][9] + 1 x choose[9][9][1]

在CPLEX中

//偏好顺序:5> 7> 4> 6> 8> 2> 3> 9> 1

  int[]  preferenceOrder;
  preferenceOrder[1] = 9;
  preferenceOrder[2] = 8;  
  preferenceOrder[8] = 2; 
  preferenceOrder[9] = 1;
  cplex.addMaximize(cplex.scalProd(preferenceOrder, choose));

为什么会这样?

CPLEX Solver尝试最大化obj函数的值。在其他条件相同的情况下,它首先会尝试使choose[1][1][5]为1,然后尝试将其设为7,依此类推。