シミュレーションおよびモデリング用のFP


12

シミュレーション/モデリングプロジェクトを開始しようとしています。OOPがこの種のプロジェクトに使用されていることは既に知っています。しかし、Haskellを勉強することで、コンポーネントのシステムのモデリングにFPパラダイムを使用することを検討しました。詳しく説明します。

データセット(温度や圧力、PDE、境界条件などのパラメーター)で特徴付けられるタイプAのコンポーネントと、異なるデータセット(異なるまたは同じパラメーター、異なるPDEおよび境界条件)。また、各コンポーネントに適用される関数/メソッドが同じであると仮定しましょう(たとえば、Galerkinメソッド)。オブジェクトの可変状態は、定数でないパラメーターに使用されます。

OOPアプローチを使用する場合、各タイプのデータをカプセル化する2つのオブジェクト、PDEを解決するメソッド(ここではコードの再利用に継承が使用されます)、およびPDEのソリューションを作成します。

一方、FPアプローチを使用する場合、各コンポーネントは、PDEのソリューションを取得するためにデータパーツとデータに作用する関数に分割されます。非定数パラメーターは、他の何かの関数として渡されるか(たとえば、時間)、ある種の可変性(可変性のエミュレーションなど)で表現されます。

結論として、FPアプローチの実装は、OOPアプローチと比較して、実際にはシンプルで管理しやすい(pdeを解決するために異なるタイプのコンポーネントまたは新しいメソッドを追加する)でしょうか?

私はC ++ / Fortranのバックグラウンドを持っていますが、プロのプログラマーではないので、間違いがあれば修正してください。

回答:


7

いい質問だ。私は似たような考えに沿って考えてきた。歴史的に、オブジェクト指向のパラダイムはコンピューターシミュレーションの必要性から生じました-Simulaの歴史をご覧ください-そして、Smalltalkのような初期のオブジェクト指向言語は彼らがやっていることを知っている人々(すなわち、Alan Kay)偶然の複雑さをもたらしすぎます

一般に、FPスタイルのプログラムは、OOプログラムよりも短く、テストしやすく、変更しやすいでしょう。ロブハロップが彼の講演で述べたように、未来は機能的ですか?、関数やデータよりも単純になることはありません。この2つは無限に構成され、必要な抽象化を構築します。したがって、あなたの質問に答える1つの方法(または私はそれを言い換えているだけですか?:)は、最高レベルの機能と最高レベルの入力データは何ですか?>出力データはどのように見えますか?次に、これらの「アルファ」関数とデータ型を次の抽象化レイヤーに分解し始め、必要に応じて繰り返します。

あなたの質問に対する別の視点(完全な答えではありません)は、StackOverflowのこのスレッド(免責事項、私がそれを始めました)を見ることです、答えのいくつかは非常に興味深いです:https : //stackoverflow.com/questions/3431654/how-does-機能的プログラミングを適用してシミュレーション

この時点での私自身の意見は、明確な方法でのみ相互作用する個別のオブジェクト(コンピューターネットワークのモデルなど)が実際に存在する状況をモデル化している場合を除きます。したがって、クリーンなメッセージの機能に直接マップします。通過パラダイムOO言語-FPを使用する方が簡単です。シミュレーションが非常に普及しており、パフォーマンス要件が最重要であるゲームプログラミングコミュニティでさえ、経験豊富な開発者はオブジェクト指向のパラダイムから遠ざかり、FPを使用しています。たとえば、このHNディスカッションまたはFPに関するJohn Carmackのコメントを参照してください。


シミュレーションでOOPについて疑問を抱いているのは私だけではないことを知っているのは良いことです。私の質問に答えてくれてありがとう!FPに関するJohn Carmackのコメントを読んで、C ++でFPのいくつかの側面を実装すること(オブジェクトをコピーするか、入力を収集して関数に渡す)を考えましたが、C ++でプロジェクトを開始する必要があるかどうかわかりませんHaskellのようなFP言語の代わりに、FPアスペクトが組み込まれているため、必要な場合にのみ可変性を表現します。同様の問題/質問があることを考慮して、ClojureまたはFPを一般的に使用し続けましたか?
-heaptobesquare

@heaptobesquare-はい、Clojure-fuを着実に立ち上げて、その中にシミュレーションを書くことを目標にしています。まだ表示する準備ができていませんが、ショーストッパーはありません。Clojureのデザインは美しく実用的です。たとえば、必要に応じてトランジェント/突然変異を使用でき、そのエージェントは非同期の側面に適しています。ある時点で(約束はありません)、このトピックに関する記事を書きます
...-limist

Clojureを見てみましたが、S式が好きだとは言えません。私はそれが実用的であることを知っています(Lispコードはデータです)が、慣れるのは簡単ですか?
-heaptobesquare

@heaptobesquare-s-expressions / Lisp構文は、実際には非常に簡単に慣れることができます。最初に、Clojureのモードを備えた優れたエディター(Emacsまたはvim、私の投票はEmacsのものです。dev.clojure.org/ display / doc / Getting + Started + with + Emacsを参照)を選び、良い本(例:Programming Clojure )、ハッキングを開始します。せいぜい数週間後、構文は本来のようにバックグラウンドにフェードインします-完全に一貫しているので、指数関数的に頻度を減らして、より重要なことのために精神サイクルを解放します。:)
リミスト

私は間違いなくそれを試してみます。結局、Lispの同質性は興味深いものです。
-heaptobesquare

2

私見では、合理的な複雑さのほぼすべてのタスクについて、「FPスタイルまたはOOPスタイルがより良い選択である」という質問に客観的に答えることはできません。通常、このような状況では、問題は「FPまたはOOP」ではなく、問題を解決するために両方のパラダイムの最良の部分を組み合わせる方法です。

上記で取り上げた問題は非常に数学的なもののようであり、行列演算が必要になると思い込んでいます。OOPは、抽象データ型のモデリングに非常に適しています。また、行列計算は、行列を操作する「行列オブジェクト」として簡単に実装できます。すべての行列演算が行列クラスの一部である方法でこれを実装すると、一緒に属するものをまとめることができ、全体的な構造を良好に保つことができます。

一方、PDEは関数の方程式であり、解は再び関数になる可能性があります。そのため、このタイプの「コンポーネント」に機能的なアプローチを使用することは、ここでは自然に見えるかもしれません。これらの関数には、OOPとFPを組み合わせる方法の一例を示すマトリックスパラメーターがあります。別の例は、マトリックスクラスの実装です。これは、機能ツールを使用して、特定の操作をマトリックスのすべての要素にマップします。したがって、ここでも、「OOP対FP」ではなく、「OOPとFPの組み合わせ」が最良の結果をもたらします。


ご回答ありがとうございます!したがって、C ++を使用する場所で、コンポーネントのデータ(つまり、マトリックス形式のパラメーター、境界条件、およびPDE)のみをオブジェクトにカプセル化し、関数を定義します(一部の高次のものでも)パラメータは他の何かの関数です)、オブジェクトのスコープ外で、オブジェクトのデータを操作するのは効率的ですか?
-heaptobesquare

@heaptobesquare:正直なところ、それがあなたの場合に効率的かどうかはわかりません。試してみて、大きく考え、小さく始めましょう。「トレーサーコード」(artima.com/intv/tracer.html)のプログラミングを開始して、最適なものとそうでないものを見つけます。そして、何かが適切に機能しないことに気付いた場合は、リファクタリングしてください。
ドックブラウン

HaskellにはBmat / LAPACKライ​​ブラリのバインディングであるHmatrixライブラリと、OOPアプローチよりも個人的に選択するための非常に優れた構文があります。
ポール

@paul:ありがとう、間違いなく見てみよう!Haskellライブラリは一般的に一貫性があり、コンテンツが豊富ですか?ウィキはそう言っていますが、これは事実ですか?
-heaptobesquare

@heaptobesquare:私がある程度使ったHaskellライブラリはParsec(アセンブラーを書くために使った)だけですが、私はそれを使うのが大好きでした。HmatrixとHaskell OpenGLバインディングのGHCI探索を行っただけですが、それらは非常に良いようです。Hmatrixは、MATLAB(私はかなり多く使用しました)とほぼ同じくらい簡潔に見えます-これはそのようなことのために特別に作られました。私の限られた経験から、ライブラリは一貫性があります-これはHaskellが少数のシンプルなビルディングブロックで構築されているためです-また、Haskellerが平凡なことをしたくないので豊かです:)
paul
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.