给定体积以最小化表面积的算法


22

考虑以下算法任务:

输入:一个正整数n,连同它的因式分解
查找:正整数x,y,z,最大限度地减少xy+yz+xz,受到了限制xyz=n

这个问题的复杂性是什么?有多项式时间算法吗?是NP难吗?


这个问题基本上是在问:在体积为n,尺寸均为整数的所有矩形实体中,表面积最小的是哪一个?

这个问题是由丹·迈耶(Dan Meyer)提出的,题为“ 1,000名数学老师无法解决的数学问题”。到目前为止,与他一起工作的数学老师都没有找到解决这个问题的合理算法。在他的上下文中,“合理”的定义有点不精确,但是作为计算机科学家,我们可以提出一个关于此问题的复杂性的更精确的问题。

显而易见的方法是枚举所有可能性x,y,z,但这需要花费指数时间。丹·迈尔(Dan Meyer)博客的评论者提出了许多有效的候选算法,不幸的是,所有这些算法都被证明是不正确的。马丁·斯特劳斯 Martin Strauss)表示,这个问题似乎让人联想到3分区,但我看不到这种减少。


让我也清除一些我在评论/答案中看到的误解:

  • 不能从3分区通过简单地更换每个数字减少q与其功率2q,由于这两个问题的目标函数是不同的。明显的减少根本行不通。

  • 最优解涉及选择x,y,z中的一个作为n3的最接近除数是不正确的n3。我看到多个人都认为情况确实如此,但实际上这是不正确的。Dan Meyer博客文章已对此进行了证实。例如,考虑n=686834和4将68,所以你可能会认为,至少一个x,y,z应为4; 但是,这是不正确的。最佳解是x=2y=2z=17。另一个反是n=22222236,但最佳的解决方案是X=37ÿ=3ž=2。(这可能是真实的,对于所有ñ,最优解决方案涉及制造在至少一个Xÿž等于任一的最小除数ñ大于ñ3 最大除数ñ小于ñ3我现在没有反例-但是如果您认为这句话是正确的,那就需要证明。您绝对不能认为这是真的。)

  • “使的大小相同”似乎并不一定在所有情况下都能产生最佳答案。有关反例,请参见Dan Meyer的博客文章。或者,至少对于短语“使其大小大致相同”的一些合理解释,有一些反例表明该策略实际上并不是最佳的。如果您想尝试某种策略,请确保您准确地声明索赔,然后提供仔细的数学证明。Xÿž

  • 运行时间不是多项式。为了使该问题出现在P中,运行时间必须是输入长度的多项式。输入的长度类似于lg n,而不是n。可以使明显的蛮力算法在O n 3O n 2时间中运行,但是在lg n中是指数式的,因此算作指数时间算法。因此,这没有帮助。Øñ3lgññØñ3Øñ2lgñ


1
有趣。我的幼稚方法是“使大致相同的大小”,推广了这样的想法,即立方体是在给定体积下具有最小表面积的矩形实体。那行得通吗?如果是这样:我看不到如何有效地做到这一点,但是有没有可能更容易实现的减少呢?Xÿž
G. Bach

2
减少将是一场噩梦,因为您需要一种方法来生成合适的质数。您可能希望的最好是随机归约,使用Dirichlet定理之东西来生成合适的素数,但这似乎不太可能。
汤姆·范德赞丹

1
@ G.Bach,我认为博客文章考虑了该静脉的一堆启发式方法(例如,以每一个开头是最接近3的整数Xÿž,然后对其进行一点点调整),并为每个显示明显的反例。但是,也许您有一个他们尚未考虑的算法?ñ3
DW

3
oeis.org/A075777似乎声称拥有一种算法,但似乎并不正确(例如n = 1332生成9,4,37而不是6,6,37)
Scott Farrar

1
这是一个有用的观察。给定,最优y z实际上满足“天真梦想”:它们必须是n / x最接近的一对因素Xÿžñ/X。(这很容易证明。)在最优解xyz∗下,该条件必须同时适用于所有三个变量:xy是与z对应的对,等等。一个含义是:给定z,只有一个可能的对xy,它可以是最佳的。不幸的是,(1)这种情况并不能唯一地确定最佳三元组;(2)我看不出如何快速找到对应的配对。ñ/XXÿžXÿžžXÿ
usul

Answers:


1

这是“选择接近立方根的除数”算法的修改版本。在许多情况下,它仍然必须蛮力行事,因此,我不确定在列举所有情况下,从速度角度来看,它是一项真正的进步。但是,我将其作为对OEIS算法(产生错误结果的算法)的更正,因为我认为它至少应该是准确的。

这是给定体积n的矩形棱镜的(s1,s2,s3)和表面积的算法:

  1. 给定n,找到立方根。
  2. 在该立方根的上限处设置初始值整数s1。
  3. 测试以查看s1是否为n的除数,如果不是,则将s1减1。
  4. 如果找到除数s1,则将初始值s2设置为(n / s1)的平方根的上限。
  5. 然后测试以查看s2是否为n / s1的除数,如果不是,则将s2减1。
  6. 找到除数s2时,将s3设置为n /(s1 * s2)。
  7. 当前表面积通过2 *(s1 * s2 + s1 * s3 + s2 * s3)计算。
  8. 将电流SA与电流最小值进行比较。如果计算出其第一表面积,则将其存储为minSA。在第一个之后,我们测试以查看当前的SA是否小于minSA,如果是,则将其存储在minSA中。

该算法枚举了某些三元组(s1,s2,s3),但只需要测试多维数据集根下的除数。(因为并非所有三个除数都可以在立方根上方)。以类似的方式,s2只需要在n / s1的平方根下测试n / s1的除数,因为不是两个除数都可以在平方根的上方)

关于步骤3的注释:如果立方根是除数,则n是立方,我们可以从框(s1,s1,s1)以最小表面积6 * s1 ^ 2停在那里。

蟒蛇:

import math
def minSArectprism(n):
    s1_0 = int(math.ceil(n ** (1 / 3.0))) 
    minSA=-1
    s1 = s1_0
    while s1>=1:
        while n % s1 > 0:  
            s1 = s1 - 1
        s1quot = int(n/s1) 
        s2_0 = int(math.ceil(math.sqrt(n/s1)))
        s2 = s2_0
        while s2>=1:
            while s1quot % s2 > 0:
                s2 = s2 - 1
            s3 = int(n / (s1 * s2))  
            SA = 2*(s1*s2 + s1*s3 + s2*s3)  
            if minSA==-1:
                minSA=SA
            else:
                if SA<minSA:
                    minSA=SA
            s2 = s2 - 1
        s1 = s1 - 1    
    return minSA

您的算法需要花费指数时间。关于每个环检可能的候选,因此运行时间为ø 3 ñ3,这是指数的,不多项式时间。因此,该算法无法回答问题。(我已经在问题中提到了指数时间算法。)Øñ32=Øñ2/3
DW

嗯,y并不局限于n的立方根,例如n = 1332,我们最终将测试s1 = 2,这意味着s2将位于1332/2〜= 26的平方根下。的确(2,18, 37)用立方根上方的y和z进行测试。
Scott Farrar 2015年

@ScottFarrar,是的,我知道。我没有包括复杂性分析的所有细节。单个评论中没有空格。如果您确实包括血腥细节,我想您会发现您得到了我引用的运行时间。您可以信任我:-),或阅读我们的参考问题以进一步了解这些棘手的细节。在任何情况下,即使你删除了内循环,外循环仍然没有重复,所以你的算法的运行时间至少为Ω ñ 1 / 3 -也就是说,它肯定是指数的。Θñ1个/3Ωñ1个/3
DW

0

如果不给出素数分解,问题当然将与分解复杂性有关。给定这些因素,并取所有主要因素的对数,此问题似乎与最小化分区和的均值偏差相同(锻炼,可能是分析上或实验上,都可以找到这种近似的直觉近似)。问题成立)。ķ

这是三向情况(分区总和为)。的情况下的2路已被广泛研究,并是NP硬的(1个ST REF)。(这2路的情况是不完全一样的已知NP完全2路分区问题,其中分区和相等。注意等于分区求和意味着在分函数和0偏差反之亦然。)2. 第二 REF研究3-行和n行分区,部分是根据经验的,这里没有像2行情况那样多的研究。日志X日志ÿ日志žñ


该答案没有帮助,也无法回答问题。1.我在寻找证据或证据,而不是猜测。没有证据表明最小化偏差会产生最佳解决方案。即使那是真的,它也不会回答这个问题:它不会告诉我们最小化偏差的复杂性。2.第一个参考是关于2分区的。为我提供有关2分区的参考资料没有帮助。我已经在问题中解释了为什么我的问题不只是3分区(或2分区)。我没有问过的关于问题变体的论文没有帮助。
DW

反对您应使与均值的绝对偏差最小化的反例:。然后1 4 17产生的绝对偏差2.85342,这是可能的最低绝对偏差。然而2 2 17是正确的(最优的)溶液中,并且具有更小的表面积。[根据均值的绝对偏差,我特别是指| 日志X - μ | + | 日志Ÿ - μ | + |ñ=681个4172.853422217(其中 μ = log x + log y + log z / 3)。]|日志X-μ|+|日志ÿ-μ|+|日志ž-μ|μ=日志X+日志ÿ+日志ž/3
DW

好!从来没有人断言这个算法是正确的,它是基于对一些示例和评论中其他建议的检查。这只是一个反例(您指出最小偏差方法在修订后的文章中存在缺陷)。这个算法“多久一次”给出正确解决方案的问题很有趣,因为它可以为正确的优化指标提供一些线索。猜想这种算法“经常”给出正确的答案。2向裁判将显示问题的偏离版本,该版本与维基百科等上的典型确切版本有所不同
vzn 2015年

另请参见Lakatos 证明和驳斥
vzn

0

编辑

这是一个非正式的论据,说明为什么不太可能存在快速算法。 这个句子没有改变,但是我已经删除了以前的句子,因为它的结构太像下一节中的正式证明,而且讨论也转移到了它的错误上,我注意到其中一些错误和一个错误DW亲切地向我指出。相反,让我尝试表达其背后的直觉。

ñ

当我们将相同的步骤转换为不同的代数(例如加法和减法而不是乘法和除法)时会发生什么?我们知道(请参阅下面的引理),我们的算法将找到一个乘积相等的3分区(如果存在),或者确定不存在这样的3分区。因此,如果我们可以将相同的技术转换为加性组,则可以找到总和相等的3个分区,或者确定不存在此类分区。换句话说,我们可以在多项式时间内求解3分区。那不是很合理。

那么,为什么这样的算法可以用于乘法却不能加法呢?一个可能的原因是,每个整数在乘法运算下都有唯一的素数分解,而在加法运算下却是循环的。另一个是乘法与加法形成环,因此您可以使用另一组运算。另一个是必须将算法推广为适用于非素数,这可能取决于它们的素数。一个DW指出,特定的翻译方法可能会成倍增加输入的大小。也许毕竟P = NP。

但是,如果这些漏洞使快速算法起作用,我认为仍然有用,因为它暗示了我们应该将精力集中在哪里。如果我们尝试将其应用于NP完全问题,我们应该寻找会破坏的东西。可以推广到其他代数的方法可能是树错了树。不过,我怀疑乘法实际上并没有足够大的差异来起作用,但这只是预感。

引理

=ñ3一种b一种b一种b一种b+1个一种+1个b2一种=b=1个

Xÿž=ñ

一种b+一种一种b+b一种b=一种b2+2b+2一种=一种b+1个一种+1个b2

F一种b=一种b+1个一种+1个bδFδ一种=b-1个一种2δFδb=一种-1个b2一种=b2b=一种2一种b一种=b=1个

我立即证明这一点的动机是,在上面的证明中充斥着一招,如果存在完美多维数据集解决方案,那将是最佳选择。但是,此公式对于修剪搜索树可能很有用。

各种各样的想法

除了x,y和z的互换性之外,我看不到任何明显的对称性,这最多只能给我们恒定系数6。我们确实对2分区有一些加速,基本上说我们希望两个项都尽可能地彼此靠近,但我没有立即看到针对此问题的应用程序。

从我的头顶上,简单地将所有数字的对数立即使用加法就可以将其简化为经典的3分区问题,或者等效地,在任何3分区加法问题中将数字取幂即可将其转化为这样的乘法问题。这意味着这个问题不应该再容易了。我们这里确实有素数分解,而该分解不是素数分解,但这对我们有帮助吗?

在图形上,曲面xyz = 0看起来像xy-,yz-和xz平面的并集,并且对于任何正数n,该方程都看起来像y = n / xz,因此沿着坐标平面的每个切片将是双曲线。通常,我们可以说要最小化的数量在原点处最低,并且沿着x = y = z的线增长最快。如果我们只能沿着这个流形搜索,那么我们也许可以简化为二维问题。


如果x + y + z = n,则2 ^ n = 2 ^(x + y + z)= 2 ^ x * 2 ^ y * 2 ^ z,这是此问题的一个实例,减去了输入为a的限制产品的主要分解。相反,它们都是二的幂。
戴维斯洛

的确,要最小化的权重会有所不同,但是如果在原始问题中x = y = z,则在每个w为的相应问题中,不会将x'y'+ x'z'+ y'z'最小化替换为w'= 2 ^ w,这意味着如果存在对原始问题的解决方案,那么简化将找到它?我们可能从变换后的问题中得到了一个虚假的解决方案,但是当通过验证和进行转换时,我们可以在线性时间内检测到它。
戴维斯洛

Xÿ+ÿž+XžXÿž=ñXÿžñ3

@vzn:我们正在尝试最小化表面积,而不是最大化表面积。如果三分区问题有解决方案,那么它将转化为修正的盒子尺寸问题,其中解决方案是一个理想的立方体。假设的多重时间算法将找到该立方体侧面的因素,然后我们可以将其转换回原始域,同时在线性时间内检查虚假解。这表明,针对轻度松弛问题的算法可以作为针对难题的预言,因此不太可能存在优于指数的算法。
戴维斯洛

我不同意你的看法。阿伦特,我们说同样的话吗?请按计算机科学聊天中的 plz drop 解开/进一步解决。也不能遵循@DWs的说法,对数转换不起作用,可以吗?我正在使用您的某些(似乎是针对性的)分析作为我自己答案的基础。
vzn 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.