计算上不可能的业务问题的例子是什么?


17

我有一位同事拒绝接受图灵机(以及扩展的冯·诺伊曼机)无法解决其自身的停机问题这一事实,他指出:

您可以花足够的时间和金钱来做任何事情。

他还不喜欢以下理论问题:

在我们的领域中,我们永远不会遇到这些问题。我们是应用程序开发人员,而不是理论科学家。

是否有一个很好的例子说明我无法用计算机来使他信服的商业问题?


11
您无法通过示例证明某些事情是不可能的。您的同事只会说“这没有用,因为我们没有找到正确的方法”。您能做的最好的就是给他看证明。如果他不买,那他要么真是愚蠢,要么是笨蛋,或者两者兼而有之。以下是无法确定的问题的列表:en.wikipedia.org/wiki/List_of_undecidable_problems
Thomas Eding 2014年

18
一位理论家和工程师被告知,他们可以通过反复将女孩和女孩之间的距离移动一半来亲吻一个女孩。理论家立刻放弃了,说“不可能,我永远也不会到达那里”。工程师为此表示:“为了实际目的,我会尽量靠近”。先生,您需要尝试那个吻。
gbjbaanb 2014年

2
@gbjbaanb:这是解决NP难题的许多非最佳解决方案的一个很好的描述,而知道那些问题(实际上)不可能经典地解决,这就是您选择替代方法的原因。如果您不接受某些问题实际上是解决或实际上无法解决的问题,那么您将不会寻找不完美的解决方案,这些解决方案可能会在一段不确定的时间后给出“足够好的”答案。
Phoshi 2014年

3
@Phoshi不,要点是,实际的工程解决方案只需要一个足以解决问题并足以被接受的解决方案。完美地解决它不值得花费时间和金钱。例如。给定多个节点,就不可能解决旅行商问题,但是许多企业仍然需要(并交付)一个不太理想的解决方案。如果我们仅产生完美,那么没有人会拥有这些。
gbjbaanb 2014年

10
@gbjbaanb:是的,但是他们解决这些问题的唯一原因是首先接受您不能“花足够的时间和金钱做任何事情”,并停止追求最佳解决方案。你什么知识不能做的往往是同样重要的是找到一个解决方案,你什么知识可以做到。
Phoshi 2014年

Answers:


11

从技术上来说并不是不可能,但是...

计划资源,目的是找到可以最大程度地利用时隙的理想计划。在我早期的计算时代,我曾经有一个项目具有此要求。在意识到它对NP困难之前,我花了一段时间研究它。

可以找到技术上并非不可能但在技术上很难的其他问题示例。

业务计算中最困难的计算问题并非不可能,只是不切实际。你的朋友是对的。如果您向他们投入足够的资金,则可以解决其中的大多数问题。但是争论是似是而非的。经营一家企业的全部目的是赚钱,而不是赔钱。

在日常实践中,我们以模糊的方式谈论图灵完整性,不是为了说明某些数学原理,而是要举例说明HTML和CSS作为生成功能完整程序的完整工具的不足之处。

同样,停顿问题对理论家也很重要,但与大多数企业没有太大关系。


14
暂停问题出在代码的静态分析中。从中您可以得到一些普通的问题,例如“这里有一些代码,看起来很漂亮”到“这里有一些代码,是恶意软件”-第一个对制作IDE的公司来说是重要的业务(语法突出显示,重构),第二个对防病毒公司和安全专业人员。

12
“类似地,暂停问题对理论家来说很重要,但与大多数企业没有太大关系。”:好吧,如果暂停问题是可计算的,我们可以自动检查某个软件是否要终止/挂起是否输入某些信息。我们可能再也没有BSOD了。由于这是不可能的,因此我们必须使用其他技术来确保软件质量(例如测试),并且没有人会花费时间和金钱来开发通用的“终止检查”程序。因此,我认为这一理论结果具有巨大的现实意义。
Giorgio 2014年

4

其他人对此发表了评论,但是我将尝试给出一个给出我观点的答案。

我喜欢罗伯特·哈维(Robert Harvey)的回答,以及对他的回答的评论,我想在此基础上进行扩展。

我认为您必须以平凡的方式提出这些无法确定的问题(例如终止):例如,一个IDE工具“检查此函数是否总是返回值”。

在教学时,我最喜欢的示例是重构(函数等效,另一个无法确定的问题)。我问:

在很好的重构之后,如何检查功能/程序是否相同?当然,我们对此有单元测试,但它们并不涵盖所有情况。他们很无聊,但是……我们是程序员!我们应该编写一个程序来检查这两个函数是否始终产生相同的结果!你为什么不尝试写呢?

或者,作为一种变化可能更接近您的情况:

我们用一个古老的晦涩的COBOL方言编写了这些遗留代码,没有任何规范和/或编译器。我们只有程序。我们的整个业务都依赖它,因此我们必须100%确保新的Java代码在每种情况下都完全相同。管理层希望有一个程序可以做到这一点,检查所有可能的情况,并估计可以在6到8周内完成。你为什么不尝试写呢?

关键是不要编写这样的程序。还是对需求的足够好的近似。关键是要意识到它不能直接完成,不要浪费我们无数的尝试去弄清楚该怎么做(只是意识到这是不可能的),而是要认识到它。“啊!这是无法确定的!不可能直接做到。我需要找出另一种更聪明的方法,并且要有足够的近似度。”

您必须找出一种以可识别且看似简单的方式呈现问题的方法。您不会相信有多少名CS学生会尝试直接编写这样的程序 ……在参加可计算性课程之前:)


您的第二个引号试图错误地调用暂停问题;但是,如果我们知道COBOL程序可以工作并且可以在测试环境中执行它(可以根据需要vm-clone所有PROD),则可以排除停止问题,我们可以尝试。可能是手工而不是程序,但我们可以做到。如果需要,我们可以将所有可能的输入形式分为两半。因为目标程序停止,所以树二等分。
2014年

2

假设我们暂时可以将道德问题放在一边:

商户A已与您签定了一种在卫星办公室A1和A2之间进行通信的方法,除了A1和A2中的授权人员之外,任何人都无法理解该通信。

企业B已与您签约,可以智能地窃听A1和A2之间的所有通信。

显然,您不能两者都做。

由于数学的计算方式(确切的数学已经经历了100年的持续研究),因此无法满足以下要求之一:

(1):提供一种加密算法,攻击者无法用任意数量的金钱来破解它。

(2):为在合理时间内运行的任意加密算法提供加密破坏算法。


1
(3):在市场发现您甚至都尝试过这两种方法之后都无法找到另一份工作
TruthOf42

1

我最近参加了有关业务流程模型和表示法(BPMN)的课程。在那里,它可以很容易地看到,有许多工作流程过于分裂,联接和循环变得很快不现实(虽然不一定是不可能的,据我所知)了解和控制,(当你使用,而不是异或分裂太多或组)应用。

对于软件行业,我认为代码覆盖率分析中的“多条件覆盖率”类似问题也是如此 。

对于企业而言,解决之道是缩小问题空间,而不是在复杂的问题上投入更多的资源。在我的示例中,向工作流程添加约束(或在代码覆盖率分析中,简化代码),而不是努力寻找所有可能的N条痕迹和结果,其中N是一个难以想象的大数字。

除此之外,我认为网络 / 图形分析中存在许多无法解决的问题(尝试通过遍历所有路径来确定网络拓扑等)。


0

典型的示例是尝试使用正则表达式解析HTML。这可以使用有限的HTML集合,但由于它们具有不同的Chomsky语法(如链接清楚所示),因此通用解决方案是不可能的。

一般来说,有些人(例如您的同事)不喜欢哲学思考,我不确定您是否可以从思维定式中争论自己的出路。他的第一点肯定是错误的,但是他的第二点可能只是一种表达方式,我无需担心这一点,即可为收货的网络表单编写代码。我对此表示同情,但有时知道该理论意味着您不会致力于在工作时间上找到圣杯。


-6

也许答案是您的同事是正确的。也许您对图灵有误解,或者它在这里如何应用?

所有机器都是有限的,因此没有“真正的”图灵机,也没有永不停止的程序。一个执行简单无限循环的琐碎程序可能会运行5分钟或50年,但在有限的机器上它将停止。诸如“精确计算pi”之类的重要问题也将停止,因为最终计算将超出存储更多数字的能力。

图灵结果不能保证对有限机器特别有用,因此您的追求最终将毫无结果。最好专注于多少时间和多少钱,并让数学家无穷无尽。

您可能会认为类似的程序{ while true: print "running"; print "halted"; }是一个反例,但事实并非如此。该程序有副作用,可能会或可能不会导致其停止。忽略副作用,可以设计出正式的证明该程序不会停止。在这个问题中,我们只关心规避无法停止的正式证明的程序。这不是这样的程序。

区分“强”图灵与“弱”图灵可能会有所帮助。强大的图灵机实际上是无限的,并且如果无法停止运行,它们将运行无限的时间。我们不能建立那些。

图灵机数量有限,时间和空间有限,它们是我们唯一可以制造的机型。我们对无法证明在这些限制内停止的程序感兴趣。图灵告诉我们,有这样的程序,但我们无法识别它们。如果极限足够低,我们可以通过编写程序并将其运行到极限来识别它们。

图灵的本质是没有捷径。确定问题在计算上是否可行的唯一方法是编写程序,运行并查找。只要有足够的时间和金钱,您就可以编写所有程序,随着时间的推移永久运行它们,并找到产生结果的程序(挂脖)。其他的仍将运行。您的同事有足够的时间和金钱来做到这一点吗?

严重的是,争议是关于极限的。图灵和NP完全告诉我们,无论预算多少,或时间表有多大,在任何给定的预算内或在给定的时间表内,计算机都无法解决某些类型的问题。这类问题的例子比比皆是:破解密码密钥;优化运送到数百个地址的路线;卡车包装箱;在大型程序中发现错误!

因此,请您的同事提供预算和时间表,并保证您会遇到无法在该预算或时间表内解决的问题。这个承诺将非常容易兑现。


2
停止问题的本质是,即使有无限的时间和金钱,也存在无法计算的问题类别。这就是我的同事拒绝接受的。
Jesan Fafon 2014年

然后我们不同意。我已经编辑了答案,但本质上消息是一样的。您提出的问题没有答案(或者您不会希望得到答案),但是作为基础的问题是一个实际的问题,也是要提出的真正观点。如果您想赢得这场辩论,您将不得不有所改变,而我在此方面已经提供了一些帮助。[提醒我不要尝试再次回答这样的问题-否决票是不受欢迎的。]
david.pfx 2014年

2
@simon:冒着重复自己的风险,没有程序会花费无穷的时间来完成,因为没有图灵完整的计算机,只是它们的有限近似值。您无法通过任何比实际运行程序更快的方法来证明任意程序将在任何特定的时间内完成。在实践中,任何带有“无限”一词的句子都有没有意义的风险。
david.pfx 2014年

3
while True: print "doing stuff"; print "Finished"; 这是一个程序的示例,它需要无限的时间才能完成。还有无数其他程序,它们也需要无数时间才能完成。我们定期创建需要无限时间才能完成的程序。它们被称为“长期运行的过程”。大多数动态网站就是其中的一个例子。
2014年

2
关键是肯定有一些计算机程序实际上是无限的,它们永远不会在自己的蒸汽下停止(我们将按断点,最终拔出电源等),如果我们将它们编程到图灵机中,它将运行不停。暂停问题的实质是,从实践上或理论上都无法从算法上确定非暂停程序。
Alistair Mackenzie 2014年
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.