「問題を解決する最も簡単なプログラム」に答える理論はありますか?


10

「コンピューティングで解決できる問題」に答えるために、計算可能性の理論を開発しました。計算可能な問題について、「プログラムは私が最も簡単なものにするか」という質問に答える理論はありますか?

計算の複雑さが質問に答えるとは思いません。私たちはどれだけの時間が必要かを考慮していると思います(抽象的に測定されますが)。

アルゴリズム情報理論がこの質問に答えるかどうかはわかりません。理論はサイズについて話しているようですが、最小サイズと最も単純なサイズの同等性は私には明白ではありません(まあ、少なくとも私には違います)。

理論は少なくとも「単純な」または「単純な」関係を定義する必要があると思います。


私は今、コルモゴロフの複雑さを調べる必要があると確信しています。でも、質問をしていたときのことを説明したいと思います。

プログラムを改善するときは、プログラムの異なる部分間の不要な接続を減らすようにします(接続を少なくしたり弱めたりできるように、部分を再分割する場合があります)。接続が減少するため、プログラムは「より単純」に感じられます。したがって、私が質問をするとき、「単純な」という言葉の選択。プログラムのサイズも小さくなる可能性が高いですが、それは主な目的ではなく、良い副作用です。明らかに、改善プロセスは永遠に続くことはできません。やめるべきポイントがあります。「構造」(別の未定義の概念については申し訳ありません)または「関係」を考慮することによってのみ、これ以上何もできないことを自分に納得させることができますか?

ここに私の複雑さの概念のより良い説明が含まれています。

オラフ・スポーンズ(2007)複雑さ学者、2(10):1623



4
あなたはベネッ​​トの論理的深さの概念に興味があるかもしれません。LiとVitanyiは、Kolmogorov Complexityに関する本の中で7.7章を取り上げました。
Martin Schwarz、

2
@YuNing:サイズではないにしても、「最も単純」とはどういう意味ですか?
Rob

1
@Yu Ning:出力を生成するための最小のプログラムである最も単純なものではなく、それは最高の最小記述長を備えたTuringマシンです-したがって、「小ささ」と「構造」のバランスが取れていますか?
ロススナイダー、2011

3
質問は少しあいまいです。また、非常に単純なアルゴリズムもありますが、それらが正しいことを証明することは困難です。そして、単純で明らかに正しいアルゴリズムがありますが、それらが高速であることを証明することは困難です。
Jukka Suomela、2011

回答:


16

この問題は、アルゴリズム情報理論で研究されています。定義しているのは、コルモゴロフチャイティンの複雑度です。

http://en.wikipedia.org/wiki/Kolmogorov_complexity

そして、あなたが必要としている単純さの概念は、Blumの公理によって形式化されている複雑さの尺度の概念によって形式化できるようです。

http://en.wikipedia.org/wiki/Blum_axioms

コルモゴロフの複雑さを一般化して、他の複雑さの尺度を考慮することも可能であるようです。以下の参照を参照してください。(コルモゴロフの複雑さに関するウィキペディアの記事は、この問題を扱っています。)

Burgin1990-一般化されたコルモゴロフの複雑さおよびその他の二重の複雑さの測定Cyber​​netics and Systems Analysis Volume 26、Number 4、481-490


@Jukka Suomelaが言うように、質問は少しあいまいです。したがって、私は質問に対する完全な答えを得ることがほとんどできないのではないかと思います。ただし、この回答は非常に有益であり、質問の重要な部分に当てはまるため、それでも回答としてタグ付けします。
Yuning、

ちなみに、トピックの適用について詳しく教えてもらえますか?具体的には、プログラムの正式な仕様がある場合、仕様から最小サイズを見つけることができますか?
Yuning、

1

最初の質問に対する答えは「はい、理論があります。アルゴリズム情報理論であり、それらはエレガントプログラムと呼ばれます(Gregory Chaitinによる)。

「プログラムは私が最も簡単なものを手に入れるのですか」についての2番目の質問について

答えはありません。これは計算できない質問であるため、プログラムがエレガントなプログラムであることを証明することはできません。

エレガントなプログラムに関する言及を追加するために、回答を掲載しました。


-1

単純なコードとそうでないものを決定するためのアプローチには、さまざまな種類があります。

しかし残念なことに、自動的に決定する方法はありません。たとえば、コルモゴロフの複雑性は再帰関数で失敗します。一部の再帰関数(論理ディープ)は単純ですが、それについての理解はそれほど単純ではありません。

私の経験では、私たちのチームはシステムで作業しており、Oracleで「簡単な」手順を見つけました(50行以内)...そしてそれを理解しようとしましたが、完全に理解するには2か月(および数回の会議)かかりましたそれは、コードの複雑さではなく、すべての変数の背後にあるロジックにあります。

コードがどれほど単純であるかを判断する方法は、「コードを読んで、それを理解するために使用される時間を検討すること」だと思います。

それで、「問題を解決する最も簡単なプログラムは?」に分けることができます:

a)コードの単純さ(明確なコード)、しかし主観的すぎる。

b)関数の複雑さ、Xの問題がある場合、DX(Delta X)タスクを解いて解決する必要があります。DXはXにトレンドする必要があります。

たとえば、私の問題が(1)「リンゴをはがすこと」であり、PHP(および言語)で実行する必要がある場合

私が非常に幸運で、PHPにfunction_peel_apple()関数がある場合、これはこれまでで最も単純なコードで、X = 1 DX = 1です。関数を呼び出すだけです。

逆に、私はそれほど幸運ではないが、function_peel()およびfunction_get_apple()関数が存在する場合、X = 1(1つの問題)およびDX = 2(2つのタスク)です。

最悪の場合、関数が存在しない場合、自分で1つ(または複数)を作成する必要があり、問題を解決する前にいくつかのタスクを追加する必要があります。これが複雑なプログラムです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.