私は、チューリングマシン(および拡張によりフォンノイマンマシン)が、次のような停止問題を解決できないという現実を受け入れることを拒否する同僚がいます。
あなたは十分な時間とお金で何でもできます。
彼はまた、次のことを主張する理論的な問題を嫌います。
私たちの分野では、これらの質問に出くわすことは決してありません。私たちは理論科学者ではなく、アプリケーション開発者です。
彼にこのことを納得させるために使用できる計算上不可能なビジネス上の問題の良い例はありますか?
私は、チューリングマシン(および拡張によりフォンノイマンマシン)が、次のような停止問題を解決できないという現実を受け入れることを拒否する同僚がいます。
あなたは十分な時間とお金で何でもできます。
彼はまた、次のことを主張する理論的な問題を嫌います。
私たちの分野では、これらの質問に出くわすことは決してありません。私たちは理論科学者ではなく、アプリケーション開発者です。
彼にこのことを納得させるために使用できる計算上不可能なビジネス上の問題の良い例はありますか?
回答:
技術的に不可能ではありませんが、...
タイムスロットの使用を最大化する理想的なスケジュールを見つけることを目的としたリソースのスケジューリング。以前のコンピューティング時代に、この要件のあるプロジェクトに一度参加しました。それがNP困難であることに気づく前に、私はしばらくそれを手がけました。
技術的に不可能ではないが、技術的に困難な問題の他の例は、ここにあります。
ビジネスコンピューティングで最も難しい計算上の問題は不可能ではなく、単に非現実的です。あなたの友人は正しいです。十分なお金を投じればほとんどの問題を解決できます。しかし、この議論は驚くべきものです。ビジネスを運営する上でのポイントは、お金を失うことではなく、お金を稼ぐことです。
毎日の練習では、チューリングの完全性について漠然と話します。数学の原理を示すのではなく、機能の完全なプログラムを作成するための完全な手段としてのHTMLとCSSの不適切さを示します。
同様に、停止問題は理論家にとって重要ですが、ほとんどのビジネスにはあまり関係がありません。
他の人はこれについてコメントしましたが、私は私の視点を与える答えを書き出そうとします。
私はロバート・ハーベイの回答と彼の回答へのコメントが好きで、それらについて詳しく説明したいと思います。
これらの未決定の問題(終了など)をありふれた方法で提示する必要があると思います。たとえば、「この関数が常に値を返すかどうかをチェックする」IDEツールなどです。
教えるとき、私のお気に入りの例はリファクタリング(関数の等価性、もう1つの決定できない問題)でした。私は尋ねた:
あなたの素敵なリファクタリング後に関数/プログラムが同じことをするかどうかをどのように確認しますか?もちろん、そのための単体テストがありますが、すべてのケースをカバーしているわけではありません。そして、彼らは書くのは退屈です...しかし、私たちはプログラマです!これら2つの関数が常に同じ結果を生成するかどうかをチェックするプログラムを作成する必要があります。書いてみませんか?
または、あなたの場合により近いバリエーションとして:
このレガシーコードは、仕様やコンパイラが存在しない古代のあいまいなCOBOL方言で記述されています。プログラムのみがあります。私たちのビジネス全体がこれに依存しているため、新しいJavaコードがすべての状況でまったく同じことを100%保証する必要があります。経営陣は、それを実行し、考えられるすべてのケースをチェックし、6〜8週間で実行できると予測するプログラムを求めています。書いてみませんか?
ポイントは、そのようなプログラムを書くことではありません。または、要件の十分な近似値。ポイントは、それが直接的な方法ではできないことを理解し、それを行う方法を見つけようとする無数の私たちを無駄にしないでください(不可能であることを認識するためだけです)が、それを認識します。「ああ!これは決められない!それを直接行うことは不可能である。私はそれを行うための別のより賢い方法を、十分に近い近似値で見つけ出す必要がある」。
問題を認識できる、明らかに明らかに単純な方法で提示する方法を見つけ出す必要があります。何人のCS学生がすぐにそのようなプログラムを書き込もうとするのか信じられないでしょう ...計算可能性の授業を受ける前に:)
道徳的な質問をとりあえず脇に置いておくと仮定します。
ビジネスAは、A1とA2の許可された人以外の誰も通信を理解できない状態で、サテライトオフィスA1とA2の間で通信する方法をお客様と契約しました。
ビジネスBは、A1とA2の間のすべての通信をインテリジェントに盗聴する方法を契約しています。
明らかに両方を行うことはできません。
数学の仕組みにより(正確な数学は100年間継続的に研究されています)、次の要件のいずれかを満たすことはできません。
(1):利用可能な任意の金額で攻撃者が解読できない暗号化アルゴリズムを提供します。
(2):妥当な時間内に実行される任意の暗号化アルゴリズムに暗号解読アルゴリズムを提供します。
最近、ビジネスプロセスモデルと表記法(BPMN)のクラスを受講しました。あまりにも多くの分割、結合、ループを伴うワークフローは、理解と制御が不可能になるとは限りませんが(XOR分割ではなくOR分割を使用すると)すぐに非現実的になることが容易にわかります。
ソフトウェア業界については、コードカバレッジ分析における「複数の条件カバレッジ」の同様の問題についても同じことが言えると思います 。
ビジネスの場合、進むべき方法は、問題のスペースを縮小することであり、複雑な問題にこれ以上リソースを投入しないことです。私の例では、N個の考えられるすべてのトレースと結果(Nは想像を絶するほど大きな数)を見つけることに一生懸命取り組むのではなく、ワークフローに制約を追加します(またはコードカバレッジ分析でコードを簡素化します)。
それとは別に、ネットワーク / グラフ分析には解決できない多くの問題があると思います(すべてのパスを反復的に歩いてネットワークトポロジを決定しようとするなど)。
古典的な例は、正規表現でHTMLを解析しようとしています。これは限られたHTMLのセットで動作しますが、異なるリンクが明確になるように(リンクが明確になっているため)、一般的な解決策は不可能です。
より一般的には、一部の人々は(同僚のように)哲学的に考えることを好まないため、マインドセットから抜け出す方法について議論できるかどうかはわかりません。彼の最初の点は確かに間違っていますが、彼の2番目の点は、商品を受け取るためのWebフォームをコーディングするためにこれについて心配する必要はないと言う方法であるかもしれません。私はこれにいくらか同情を持っていますが、時々理論を知っていることは、あなたが仕事時間に聖杯を見つけることに自分をコミットしないことを意味します。
おそらく、答えは同僚が正しいということでしょう。おそらく、チューリングを誤解したのでしょうか、それともここでどのように適用されるのでしょうか?
すべてのマシンは有限であるため、「実際の」チューリングマシンや停止することのないプログラムはありません。単純な無限ループを実行する単純なプログラムは、5分または50年実行できますが、有限のマシンでは停止します。「piを正確に計算する」などの自明ではない非停止の問題も停止します。これは、最終的に計算がさらに桁を格納する容量を超えるためです。
チューリングの結果は、有限のマシンで特に有用なものを保証するものではないため、あなたの探求は最終的には無益です。どれだけの時間とどれだけのお金に焦点を合わせ、数学者に無限を任せたほうがよいでしょう。
のようなプログラム{ while true: print "running"; print "halted"; }
は反例であると思うかもしれませんが、そうではありません。このプログラムには副作用があり、それによりプログラムが停止する場合と停止しない場合があります。副作用を無視して、このプログラムが停止しないという正式な証拠を考案することが可能です。この質問では、停止の問題が決定できない場合、非停止の正式な証拠を回避するプログラムにのみ関係します。これはそのようなプログラムではありません。
「強い」チューリングと「弱い」チューリングを区別するのに役立つ場合があります。強力なチューリングマシンは実際には無限であり、停止に失敗すると、無限の時間実行されます。それらを構築することはできません。
弱いチューリングマシンは時間とスペースに有限の制限があり、構築できる唯一のマシンです。これらの制限内で停止することが証明できないプログラムに関心があります。チューリングは、そのようなプログラムはあるが、それらを特定することはできないと言っています。制限が十分に低い場合、プログラムを記述し、その制限まで実行することでそれらを識別できます。
チューリングの本質は、ショートカットがないことです。問題が計算上実行可能かどうかを確認する唯一の方法は、プログラムを作成し、実行して調べることです。十分な時間とお金があれば、すべてのプログラムを作成し、それらを永久に、そして時間をかけて実行し、結果を生み出すもの(ホールター)を見つけることができます。他は引き続き実行されます。同僚はそれをするのに十分な時間とお金を持っていますか?
しかし真剣に、論争は限界についてです。チューリングとNPは、特定のクラスの問題は、予算がどれだけ大きくてもスケジュールがどれほど寛大であっても、特定の予算内または特定のスケジュール内のコンピューターでは解決できないことを示しています。この種の問題の例はたくさんあります:暗号キーの破壊。数百のアドレスに配送するためのルートを最適化します。トラックの梱包箱; 大規模なプログラムのバグを見つける!
そのため、同僚に予算とスケジュールを尋ね、その予算やスケジュールでは解決できない問題を生み出すことができると約束します。その約束は守るのが非常に簡単です。
while True: print "doing stuff"; print "Finished";
これは、終了するまでに無限の時間がかかるプログラムの例です。他のプログラムも無限にあり、それらも完了するのに無限の時間がかかります。私たちは定期的にプログラムを作成し、意図的に完了するのに無限の時間がかかります。それらは「長時間実行プロセス」と呼ばれます。ほとんどの動的なWebサイトはその例です。