Algorithm 矩阵上函数的离散优化

Algorithm 矩阵上函数的离散优化,algorithm,optimization,matrix,mathematical-optimization,Algorithm,Optimization,Matrix,Mathematical Optimization,这是一个优化问题,我已经从一个更具体的问题中简化了,但我不确定这个问题具体分类在哪里,或者获得解决方案的方法(蛮力、模拟退火、线性规划?)。感谢您的帮助或推荐 我们有两个MxN矩阵M1和M2,其中每个条目为1或0 我试图在尽可能短的时间内从矩阵M1到矩阵M2 目标是最小化总时间,其中时间定义如下: 0->1转换=1s 1->0转换=0.1s 更改矩阵的唯一方法是选择一组行和列,并将拾取的行和列的交点处的所有元素切换为0/1,整个转换将花费上面指定的时间 例如: M1 1 1 1 1 1 0

这是一个优化问题,我已经从一个更具体的问题中简化了,但我不确定这个问题具体分类在哪里,或者获得解决方案的方法(蛮力、模拟退火、线性规划?)。感谢您的帮助或推荐

我们有两个MxN矩阵M1M2,其中每个条目为1或0

我试图在尽可能短的时间内从矩阵M1到矩阵M2

目标是最小化总时间,其中时间定义如下:

  • 0->1转换=1s
  • 1->0转换=0.1s
更改矩阵的唯一方法是选择一组行和列,并将拾取的行和列的交点处的所有元素切换为0/1,整个转换将花费上面指定的时间

例如:

M1 1 1 1 1 1 0 1 0 0 M2 0 0 1 0 1 1 1 1 1 M1 1 1 1 1 1 0 1 0 0 平方米 0 0 1 0 1 1 1 1 1 第一次迭代:

  • 选择M1的第2行和第3行以及第2列和第3列
  • 将所有相交图元转换为1

    • 需要1秒
  • M1 1 1 1 1 1 1 1 1 1 第二次迭代:

  • 选择M1的第1行、第1列和第2列
  • 将所有相交元素转换为0

    • 需要0.1秒
  • M1 0 0 1 1 1 1 1 1 1 第三次迭代:

  • 选择M1的第2行和第1列
  • 将所选元素转换为0

    • 需要0.1秒
  • M1 0 0 1 0 1 1 1 1 1
    在这里,总时间是1.2秒。

    对于给定的尺寸,这看起来很难估计。无论如何,这里有一些想法

    当一个单元格需要从0更改为1时,我将写入
    +
    ,当它需要在另一个方向上更改时,我将写入
    -
    ,当它需要保持原样时,我将写入0或1(即当前是什么)。例如,OP问题中的问题实例如下

    - - - 1
    - - 1 +
    - 1 + +
    1 + + +
    

    让我们考虑一个更简单的单调版本的问题,我们从不改变一次两次。

    • 通常需要更多的动作,但提供了一个有用的起点和上限
    • 在这个问题的版本中,我们执行移动的顺序并不重要
    • 简单的变化作为启发式可能更有效,例如,执行少量初始0->1移动,其中每个
      +
      单元格都更改为1,其他单元格也可能更改,然后执行一系列1->0移动以更改/修复所有其他单元格
    安全地缩小问题 [编辑2014年11月12日:修复了下面的第三条规则。不幸的是,它可能应用的频率要低得多。]

    以下技巧不会导致解决方案变为次优,并可能简化问题:

    • 删除不包含
      +
      -单元格或
      -
      -单元格的任何行或列:任何移动都不会使用它们
    • 如果有任何相同的行或列,则折叠它们:无论对单个折叠的行或列执行何种操作,都可以分别对所有行或列执行
    • 如果有任何一行只有一个
      +
      -单元格而没有1-单元格,您可以通过一次0->1移动立即修复包含它的整列中的所有
      +
      -单元格,因为在单调问题中,不可能将此单元格与另一列中的任何
      +
      -单元格固定在同一个0->1移动中。同样,交换行和列,并且使用单个
      -
      -单元格,而不使用0-单元格
    多次应用这些规则可以进一步简化

    一种非常简单的启发式方法 您可以在一次移动中更正整行或整列的
    +
    -
    -单元格。因此,总是可以用2*min(宽度、高度)移动来解决问题(2在那里,因为我们可能需要0->1和1->0移动)。一个稍微好一点的方法是贪婪地找到需要更正的单元格最多的行或列,并在一次移动中更正它,在行和列之间自由切换

    最好的办法 假设我们有两个
    +
    -单元(i,j)和(k,l),i移动1。为了找到最好的移动方式——也就是说,将最有可能的0变为1的移动方式——我们不太希望图中的最大团大小;我们真正想要的是包含最多
    +
    -单元顶点的小集团。我们可以用一个0/1变量x_i_j来表示顶点(i,j)是否在团中,从而得出一个公式:

    Maximise the sum over all variables x_i_j such that (i, j) is a `+`-cell
    Subject to
        x_i_j + x_k_l <= 1 for all i, j, k, l s.t. there is no edge (i, j)-(k, l)
        x_i_j in {0, 1} for all i, j
    

    问题的所有变化是“无边”变为“边”。现在可以找到(可能不止一个)最大大小的
    +
    -单元顶点集,这些顶点之间不共享边。没有任何一对这样的单元格可以通过相同的0->1移动来改变(也不需要将0单元格或
    -
    -单元格更改为1,这在单调版本的问题中是禁止的,因为它将需要第二次更改),因此无论返回多少顶点,至少需要许多单独的0->1移动。因为我们要求最大独立集,所以不需要更多的移动(如果需要更多的移动,将有一个更大的独立集,其中有那么多顶点)。

    感兴趣的M和N有多大?@davidesenstat它们是~1000行(列)集必须由相邻的行(列)组成还是可以稀疏?例如,一组行可以是这样的:{8,78347}@DiegoMazzaro它们可以是稀疏的。例如,从所有1到棋盘的最佳解决方案需要2次迭代。感谢您的详细解释!这确实说明了问题的难度。由于其庞大的规模,我们将不得不坚持启发式。 M1 0 0 1 0 1 1 1 1 1
    - - - 1
    - - 1 +
    - 1 + +
    1 + + +
    
    Maximise the sum over all variables x_i_j such that (i, j) is a `+`-cell
    Subject to
        x_i_j + x_k_l <= 1 for all i, j, k, l s.t. there is no edge (i, j)-(k, l)
        x_i_j in {0, 1} for all i, j
    
    Maximise the sum over all variables x_i_j such that (i, j) is a `+`-cell
    Subject to
        x_i_j + x_k_l <= 1 for all i, j, k, l s.t. there is an edge (i, j)-(k, l)
        x_i_j in {0, 1} for all i, j