我正在尝试解决我创建的Sudoku程序。 这是目标函数
IloNumExpr numExpr = cplex.linearNumExpr();
cplex.addMaximize(numExpr);
我要做的是添加约束或新的目标函数,以允许9x9数独矩阵中的四个角点具有5 > 7 > 4 > 6 > 8 > 2 > 3 > 9 > 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]
//偏好顺序: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,依此类推。