【问题标题】:Optimal Selection in RubyRuby 中的最佳选择
【发布时间】:2016-10-04 08:03:52
【问题描述】:

给定一个值数组,

arr = [8,10,4,5,3,7,6,0,1,9,13,2]

X 是一个值数组,可以同时选择X.length != 0X.length < arr.length

然后将选择的值输入到函数 score() 中,该函数将根据选择值数组返回一个分数。

Example 1: 
X = [8]
score(X) = 71

Example 2:
X = [4]
score(X) = 36

Example 3:
X = [8,10,7]
score(X) = 51

Example 4:
X = [5,9,0]
score(X) = 4

这里的函数 score() 是一个黑盒,我们无法修改函数的工作方式,我们只需提供一个输入,函数就会返回分数输出。

我的问题:如何得到每组数字的最低分?

意思是,如果 X 是一个只有 1 个值的数组,并且我在 arr 中输入所有不同的值,每个值都会返回一个不同的分值,我会找出哪个 arr 值提供最低分。

如果 X 是一个包含 3 个值的数组,我会在 arr 中输入所有不同可能值的组合,每个不同的 3 个值集合返回不同的分数并找到最低分数。

如果我的 arr 很小,这很简单。但是,如果我有一个包含 50 甚至 100 个值的数组,我如何创建一个算法,根据输入值的数量提供最低分数

【问题讨论】:

  • 您是在问如何生成arr 的所有子集,还是在问如何处理计算爆炸?
  • 如何处理计算负载。找到 arr 的组合很容易,例如 arr.combination(3)。但是我会有一个非常大的可枚举,如果我通过 score() 函数运行所有值,这将需要很长时间,尤其是在一个非常大的数组上。
  • "如果我有一个包含 50 个甚至 100 个值的数组..." - 根据您对情况的描述("这里的函数 score()是一个黑盒..."),唯一可能的解决方案是简单地尝试所有可能的子集排列。例如,如果arr 包含50 个元素,那么您必须检查所有(2^50 - 1) == 1,125,899,906,842,623 可能性!!!
  • @d123 购买一台量子计算机。

标签: arrays ruby algorithm


【解决方案1】:

tl;dr:如果您对score 一无所知,那么您将无法加快速度。

为了优化score 本身,您必须知道它是如何工作的。毕竟“优化”只是意味着“做同样的事情更有效率”,但是如果你不知道“同样的事情”是什么,你怎么知道它是否真的做了“同样的事情” ?另外,加速score 无论如何都不会帮助您组合爆炸。组合的数量增长得如此之快,以至于score 的任何加速都将很快被稍大的输入消耗掉。

为了优化您应用score 的方式,您需要再次了解它。如果您对score 有所了解,例如,您可以只生成您知道会产生不同值的组合,或者您知道只会产生更大值的组合。换句话说,您可以利用score 输出中的某些结构来减小输入大小。但是,我们不知道score 的输出结构,事实上,我们甚至都不知道有没有结构!所以我们不能利用它。另外,为了显着减少输入大小,结构中必须有一些极端冗余和规律性。

In his comment, @ndn suggested applying some form of machine learning to discover structure in the output.。这工作的好坏取决于输出的结构类型。当然,这再次假设甚至 有一些我们不知道的结构要发现。再一次,即使有一些结构,它也必须非常冗余和规则,以弥补输入空间的组合爆炸。

真的,蛮力是唯一的方法。我们的最后一根稻草将是并行化。也许,如果我们将问题分布在足够多的 CPU 内核上,我们就可以解决它?不幸的是,输入空间的组合爆炸仍然真的会伤害到你:

如果我们假设我们有一个 10THz 的 CPU(即比目前最快的 CPU 快一千倍),并且我们假设我们可以在单个时钟周期内计算 score,并且我们假设我们有一台具有 1000 万个内核的计算机(同样,这比最大的超级计算机大一千倍),仍然需要 400 多年才能找到输入数组的最佳选择,因为小到 100 个数字。即使我们将 CPU 速度提高 10 亿倍,将计算机提高 10 亿倍,只要将数组大小增加一倍,达到 200 个项目,运行时间就会增加到 500 万亿年。

毕竟,我们将组合爆炸称为“组合爆炸”是有原因的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2012-07-29
    • 2012-10-24
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    相关资源
    最近更新 更多