CPLEX中的数独求解器

3
我正在尝试解决我创建的数独程序。这是目标函数。
IloNumExpr numExpr = cplex.linearNumExpr();
cplex.addMaximize(numExpr);

我试图做的是在这里添加一个限制条件或新的目标函数,以允许9x9数独矩阵中的四个角点按照5>7>4>6>8>2>3>9>1的顺序具有特殊的优先级。
你有什么关于完成这个问题所需的数学公式的想法吗?
1个回答

1

你可以通过将元素加入目标函数来确定偏好顺序。

假设你有以下类型的变量:

choose[row][col][digit]

如果choose[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求解器试图最大化obj函数的值。其他条件相同的情况下,它会首先尝试将choose[1][1][5]设置为1,然后尝试将其设置为7等等。


非常感谢您的帮助。我作为一名初级程序员,正在尝试编写数独游戏中的不同功能。 - user3055708

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接