【问题标题】:Sudoku Solver in CPLEXCPLEX 中的数独求解器
【发布时间】:2013-12-02 00:57:04
【问题描述】:

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

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

我想要做的是添加一个约束或新的目标函数,这将允许 9x9 数独矩阵中的四个角点按5 > 7 > 4 > 6 > 8 > 2 > 3 > 9 > 1 的顺序有特殊的偏好

对于完成此操作需要什么数学公式有什么想法吗?

【问题讨论】:

    标签: java mathematical-optimization sudoku cplex


    【解决方案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 求解器尝试最大化 obj 函数的值。在其他条件相同的情况下,它将首先尝试使 choose[1][1][5] 为 1,然后尝试使其为 7,依此类推。

    【讨论】:

    • 非常感谢您的帮助。作为初级程序员,我真的想为数独获得不同的功能。
    猜你喜欢
    • 2018-03-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2014-06-06
    • 2012-11-13
    • 1970-01-01
    相关资源
    最近更新 更多