計算上不可能なビジネス上の問題の例は何ですか?


17

私は、チューリングマシン(および拡張によりフォンノイマンマシン)が、次のような停止問題を解決できないという現実を受け入れることを拒否する同僚がいます。

あなたは十分な時間とお金で何でもできます。

彼はまた、次のことを主張する理論的な問題を嫌います。

私たちの分野では、これらの質問に出くわすことは決してありません。私たちは理論科学者ではなく、アプリケーション開発者です。

彼にこのことを納得させるために使用できる計算上不可能なビジネス上の問題の良い例はありますか?


11
何かが不可能であることを例で示すことはできません。あなたの同僚は、「正しいアプローチを見つけられていないため、機能していません」と言うだけです。あなたができる最善のことは、彼に証拠を見せることです。彼がそれを買わないなら、彼は本当に愚かかバカか両方です。ここでは決定不能な問題のリストです:en.wikipedia.org/wiki/List_of_undecidable_problems
トーマスEding

18
理論家とエンジニアは、彼女と彼女の間の距離を半分ずつ繰り返し移動することで、女の子にキスをすることができると言われました。理論家はすぐに「それは不可能だ、私は決してそこに着かない」と言って断念した。エンジニアは、「私は実際的な目的のために十分に近づきます」と言いました。あなたは、そのキスに挑戦する必要があります。
gbjbaanb

2
@gbjbaanb:これはNP困難問題に対する多くの最適でない解決策の優れた記述子であり、それらの問題が古典的に解決することは(実際には)不可能であることを知ることが代替方法を選ぶ理由です。一部の問題が実際的または文字通り解決できないことを受け入れない場合、不確定な期間の後に「十分な」答えを与える可能性のある不完全な解決策を探しません。
Phoshi

3
@Phoshiいや、ポイントは、現実のエンジニアリングソリューションは、問題を受け入れて十分に解決するのに十分なソリューションのみを必要とするということです。それを完全に解決することは、時間と費用の価値がありません。例えば。巡回セールスマンの問題は、数個以上のノードを考えると不可能ですが、多くの企業では依然として最適ではないソリューションが必要です(そして提供されています)。私たちが完璧を生み出しただけなら、誰もこれらを持っていません。
gbjbaanb 14年

10
@gbjbaanb:確かに、彼らがこれらの問題を解決した唯一の理由は、「十分な時間とお金で何もできない」ことを最初に受け入れ、最適なソリューションを追いかけるのをやめることです。できないことの知識は、解決策を見つけるために、できることの知識と同じくらい重要であることがよくあります。
Phoshi

回答:


11

技術的に不可能ではありませんが、...

タイムスロットの使用を最大化する理想的なスケジュールを見つけることを目的としたリソースのスケジューリング。以前のコンピューティング時代に、この要件のあるプロジェクトに一度参加しました。それがNP困難であることに気づく前に、私はしばらくそれを手がけました。

技術的に不可能ではないが、技術的に困難な問題の他の例は、ここにあります

ビジネスコンピューティングで最も難しい計算上の問題は不可能ではなく、単に非現実的です。あなたの友人は正しいです。十分なお金を投じればほとんどの問題を解決できます。しかし、この議論は驚くべきものです。ビジネスを運営する上でのポイントは、お金を失うことではなく、お金を稼ぐことです。

毎日の練習では、チューリングの完全性について漠然と話します。数学の原理を示すのではなく、機能の完全なプログラムを作成するための完全な手段としてのHTMLとCSSの不適切さを示します。

同様に、停止問題は理論家にとって重要ですが、ほとんどのビジネスにはあまり関係がありません。


14
停止する問題は、コードの静的分析で発生します。これから、「ここにコードがあり、きれいに見える」から「ここにコードがあり、マルウェアである」などのありふれた問題を得ることができます-最初はIDEを作成する企業にとってビジネス上重要です(構文の強調表示、リファクタリング)、ウイルス対策会社とセキュリティの専門家。

12
「同様に、停止問題は理論家にとって重要ですが、ほとんどのビジネスにはあまり関係がありません。」:停止問題が計算可能であれば、ソフトウェアの一部が終了/ハングするかどうかを自動的にチェックできます。特定の入力かどうか。BSODはもうないでしょう。これは不可能であるため、ソフトウェアの品質(テストなど)を確保するために他の手法を使用する必要があり、一般的な「終了チェック」プログラムを開発するために時間とお金を投資する人はいません。ですから、この理論的な結果は、実際に非常に重要だと思います。
ジョルジオ14年

4

他の人はこれについてコメントしましたが、私は私の視点を与える答えを書き出そうとします。

私はロバート・ハーベイの回答と彼の回答へのコメントが好きで、それらについて詳しく説明したいと思います。

これらの未決定の問題(終了など)をありふれた方法で提示する必要があると思います。たとえば、「この関数が常に値を返すかどうかをチェックする」IDEツールなどです。

教えるとき、私のお気に入りの例はリファクタリング(関数の等価性、もう1つの決定できない問題)でした。私は尋ねた:

あなたの素敵なリファクタリング後に関数/プログラムが同じことをするかどうかをどのように確認しますか?もちろん、そのための単体テストがありますが、すべてのケースをカバーしているわけではありません。そして、彼らは書くのは退屈です...しかし、私たちはプログラマです!これら2つの関数が常に同じ結果を生成するかどうかをチェックするプログラムを作成する必要があります。書いてみませんか?

または、あなたの場合により近いバリエーションとして:

このレガシーコードは、仕様やコンパイラが存在しない古代のあいまいなCOBOL方言で記述されています。プログラムのみがあります。私たちのビジネス全体がこれに依存しているため、新しいJavaコードがすべての状況でまったく同じことを100%保証する必要があります。経営陣は、それを実行し、考えられるすべてのケースをチェックし、6〜8週間で実行できると予測するプログラムを求めています。書いてみませんか?

ポイントは、そのようなプログラムを書くことではありません。または、要件の十分な近似値。ポイントは、それが直接的な方法ではできないことを理解し、それを行う方法を見つけようとする無数の私たちを無駄にしないでください(不可能であることを認識するためだけです)が、それを認識します。「ああ!これは決められない!それを直接行うことは不可能である。私はそれを行うための別のより賢い方法を、十分に近い近似値で見つけ出す必要がある」。

問題を認識できる、明らかに明らかに単純な方法で提示する方法を見つけ出す必要があります。何人のCS学生がすぐにそのようなプログラムを書き込もうとするのか信じられないでしょう ...計算可能性の授業を受ける前に:)


2番目の引用符は、停止問題を誤って呼び出します。ただし、COBOLプログラムが機能し、テスト環境で実行できることがわかっている場合(必要に応じてすべてのPRODをクローンします)、停止の問題は除外され、試行される場合があります。おそらくプログラムではなく手で、おそらく同じことをすることができます。必要に応じて、可能なすべての入力フォームをツリー二等分することができます。ターゲットプログラムが停止するため、ツリー二等分も停止します。
ジョシュア14年

2

道徳的な質問をとりあえず脇に置いておくと仮定します。

ビジネスAは、A1とA2の許可された人以外の誰も通信を理解できない状態で、サテライトオフィスA1とA2の間で通信する方法をお客様と契約しました。

ビジネスBは、A1とA2の間のすべての通信をインテリジェントに盗聴する方法を契約しています。

明らかに両方を行うことはできません。

数学の仕組みにより(正確な数学は100年間継続的に研究されています)、次の要件のいずれかを満たすことはできません。

(1):利用可能な任意の金額で攻撃者が解読できない暗号化アルゴリズムを提供します。

(2):妥当な時間内に実行される任意の暗号化アルゴリズムに暗号解読アルゴリズムを提供します。


1
(3):市場が両方を試みたことが判明した後、別の仕事に就けない
TruthOf42 14年

1

最近、ビジネスプロセスモデルと表記法(BPMN)のクラスを受講しました。あまりにも多くの分割、結合、ループを伴うワークフローは、理解と制御が不可能になるとは限りませんが(XOR分割ではなくOR分割を使用すると)すぐに非現実的になることが容易にわかります。

ソフトウェア業界については、コードカバレッジ分析における「複数の条件カバレッジ」の同様の問題についても同じことが言えると思います 。

ビジネスの場合、進むべき方法は、問題のスペースを縮小することであり、複雑な問題にこれ以上リソースを投入しないことです。私の例では、N個の考えられるすべてのトレースと結果(Nは想像を絶するほど大きな数)を見つけることに一生懸命取り組むのではなく、ワークフローに制約を追加します(またはコードカバレッジ分析でコードを簡素化します)。

それとは別に、ネットワーク / グラフ分析には解決できない多くの問題があると思います(すべてのパスを反復的に歩いてネットワークトポロジを決定しようとするなど)。


0

古典的な例は、正規表現でHTML解析しようとしています。これは限られたHTMLのセットで動作しますが、異なるリンクが明確になるように(リンクが明確になっているため)、一般的な解決策は不可能です。

より一般的には、一部の人々は(同僚のように)哲学的に考えることを好まないため、マインドセットから抜け出す方法について議論できるかどうかはわかりません。彼の最初の点は確かに間違っていますが、彼の2番目の点は、商品を受け取るためのWebフォームをコーディングするためにこれについて心配する必要はないと言う方法であるかもしれません。私はこれにいくらか同情を持っていますが、時々理論を知っていることは、あなたが仕事時間に聖杯を見つけることに自分をコミットしないことを意味します。


-6

おそらく、答えは同僚が正しいということでしょう。おそらく、チューリングを誤解したのでしょうか、それともここでどのように適用されるのでしょうか?

すべてのマシンは有限であるため、「実際の」チューリングマシンや停止することのないプログラムはありません。単純な無限ループを実行する単純なプログラムは、5分または50年実行できますが、有限のマシンでは停止します。「piを正確に計算する」などの自明ではない非停止の問題も停止します。これは、最終的に計算がさらに桁を格納する容量を超えるためです。

チューリングの結果は、有限のマシンで特に有用なものを保証するものではないため、あなたの探求は最終的には無益です。どれだけの時間とどれだけのお金に焦点を合わせ、数学者に無限を任せたほうがよいでしょう。

のようなプログラム{ while true: print "running"; print "halted"; }は反例であると思うかもしれませんが、そうではありません。このプログラムには副作用があり、それによりプログラムが停止する場合と停止しない場合があります。副作用を無視して、このプログラムが停止しないという正式な証拠を考案することが可能です。この質問では、停止の問題が決定できない場合、非停止の正式な証拠を回避するプログラムにのみ関係します。これはそのようなプログラムではありません。

「強い」チューリングと「弱い」チューリングを区別するのに役立つ場合があります。強力なチューリングマシンは実際には無限であり、停止に失敗すると、無限の時間実行されます。それらを構築することはできません。

弱いチューリングマシンは時間とスペースに有限の制限があり、構築できる唯一のマシンです。これらの制限内で停止することが証明できないプログラムに関心があります。チューリングは、そのようなプログラムはあるが、それらを特定することはできないと言っています。制限が十分に低い場合、プログラムを記述し、その制限まで実行することでそれらを識別できます。

チューリングの本質は、ショートカットがないことです。問題が計算上実行可能かどうかを確認する唯一の方法は、プログラムを作成し、実行して調べることです。十分な時間とお金があれば、すべてのプログラムを作成し、それらを永久に、そして時間をかけて実行し、結果を生み出すもの(ホールター)を見つけることができます。他は引き続き実行されます。同僚はそれをするのに十分な時間とお金を持っていますか?

しかし真剣に、論争は限界についてです。チューリングとNPは、特定のクラスの問題は、予算がどれだけ大きくてもスケジュールがどれほど寛大であっても、特定の予算内または特定のスケジュール内のコンピューターでは解決できないことを示しています。この種の問題の例はたくさんあります:暗号キーの破壊。数百のアドレスに配送するためのルートを最適化します。トラックの梱包箱; 大規模なプログラムのバグを見つける!

そのため、同僚に予算とスケジュールを尋ね、その予算やスケジュールでは解決できない問題を生み出すことができると約束します。その約束は守るのが非常に簡単です。


2
停止する問題の本質は、無限の時間とお金があっても計算できない問題のクラスがあることです。それが私の同僚が受け入れることを拒否していることです。
ジェサンファフォン14年

その後、私たちは同意しません。回答を編集しましたが、基本的にメッセージは同じです。提起されたあなたの質問には答えがありません(または、あなたが好むものではありません)が、その根底にあるのは本当の問題であり、真の意味があります。あなたがこの議論に勝ちたいなら、あなたはいくぶん地面を変えなければならないだろう、そして私はそれをするのにいくらかの助けを提供しようとした。[このような質問に再び答えようとしないことを
思い出して

2
@simon:自分自身を繰り返すリスクはありますが、チューリング完全なコンピューターはなく、それらに限りなく近似しているため、完了するのに無限の時間を要するプログラムはありません。任意のプログラムが実際にプログラムを実行するよりも速い方法で特定の時間内に完了することを証明することはできません。実際には、「無限」という単語を含む文には意味がありません。
david.pfx 14年

3
while True: print "doing stuff"; print "Finished"; これは、終了するまでに無限の時間がかかるプログラムの例です。他のプログラムも無限にあり、それらも完了するのに無限の時間がかかります。私たちは定期的にプログラムを作成し、意図的に完了するのに無限の時間がかかります。それらは「長時間実行プロセス」と呼ばれます。ほとんどの動的なWebサイトはその例です。
シングルトン14年

2
重要なのは、事実上無限のコンピュータープログラムのセットがあり、それらがチューリングマシンにプログラムされた場合、彼ら自身の蒸気の下で停止することは決してないということです(ブレークを押したり、最終的に電源を抜きます)。停止せずに実行します。停止問題の本質は、非停止プログラムをアルゴリズム的に決定する方法が実際的または理論的にないことです。
アリステアマッケンジー14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.