Algorithm 什么';最小列和差是多少?

Algorithm 什么';最小列和差是多少?,algorithm,math,matrix,sum,Algorithm,Math,Matrix,Sum,假设您得到一个正整数矩阵(最大值为25*15,数值不超过3000000)。进行列求和并选择最小和最大列时,它们之间的差值必须尽可能小 您可以交换每行(排列行)中的数字,而不是列中的数字,交换次数是您想要的 您将如何解决此任务 我不是要你的代码而是你的想法 提前感谢我将尝试使用模拟退火来解决这个问题。以下是该计划的草图: 让距离优化最大和最小列和之间的差异 将目标设置为0(即,尽量接近矩阵,且总和之间没有差异) 通过将所有列的和数组计算为其当前值来初始化问题 让当前矩阵的一个邻居是交换矩阵同一行中

假设您得到一个正整数矩阵(最大值为25*15,数值不超过3000000)。进行列求和并选择最小和最大列时,它们之间的差值必须尽可能小

您可以交换每行(排列行)中的数字,而不是列中的数字,交换次数是您想要的

您将如何解决此任务

我不是要你的代码而是你的想法


提前感谢

我将尝试使用模拟退火来解决这个问题。以下是该计划的草图:

  • 让距离优化最大和最小列和之间的差异
  • 将目标设置为0(即,尽量接近矩阵,且总和之间没有差异)
  • 通过将所有列的和数组计算为其当前值来初始化问题
  • 让当前矩阵的一个邻居是交换矩阵同一行中的两个条目后得到的矩阵
  • 通过行索引和两个交换列索引表示邻居
  • 接受邻居时,不要再次计算所有总和。只需调整已交换的列中的和数组,并根据交换的差异(可以从交换的行索引中推断出)进行调整

  • 第6步对于性能(大型矩阵)至关重要。

    坏消息是,这个没有限制的问题是NP难问题,精确的大规模动态规划似乎是不可能的。我认为我的第一种方法是大邻域局部搜索:反复选择一个足够小的随机子矩阵(行和列),使其能够承受暴力,并在保持矩阵其余部分不受干扰的情况下选择最佳排列。

    那么,你到底需要找到什么呢?发生这种情况的行的排列,或最小的区别?最小的区别是这与编程竞赛?假设是,职业训练局的范围太广。它不是-它是学校的家庭作业。但是我们找不到足够快的算法来在几秒钟内解决输入问题,但我认为应该有一个更好的解决方案——我怀疑这在实践中会做得很好。@IVlad原因是…?因为有很多州,你无法在合理的时间内探索所有州,甚至大部分州。因此,您必须尽早停止搜索,这意味着您可能无法找到最佳解决方案。我不确定你是否能估计出这会使你达到最佳状态。但这正是模拟退火的强度!众所周知,通过分析所有可能解的巨大空间中的一小部分来找到(全局)最优解是非常好的。这些限制建议使用智能暴力或DP方法,可能使用的事实是列少于行,因此类似
    O(rows*2^num\u columns)
    的方法肯定会奏效。我希望有比猜测和检查更好的东西。。。你有什么想法?