- ベストアンサー
最適化を目的とするプログラム言語はやはりCでしょうか?
こんにちは。 私は現在、cで組み合わせ最適化問題を扱う仕事をしているのですが、 どうも手詰まりで、Javaだったら楽にコーディングできるかと思い、 Javaについて勉強しましたが、あれは別の産物用だと思うのです。 そのため、この言語はこの目的で使うという指標を教えてください。 (c,java,php,vba...などです)
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 言語によって得意・不得意とする分野はありますが、C言語は汎用性に優れているのでそれほど困らないと思います。 組み合わせ最適化に使われる言語というと、PrologやLISPなどが思いつきますが…C言語よりリスト処理に向いているだけで、C言語でリスト処理を実装すれば、やることは同じです。 Javaは仮想マシン(VM)を使うことで、他のプラットフォームでも(Windows,Linux,MacOSといったOSの垣根を越えて)同じコードを実行可能という利点があります。 またオブジェクト指向なので、さまざまな事象をオブジェクトとして捉えることができ、理解しやすいと思います。 ただ、中間コードをVMが実行するのが遅いので、いろんな環境で実行することを想定したソフトでない限り、Javaを選択する意味はそんなにないように思います。 C言語は手続き指向(C++やC#はオブジェクト指向の概念を取り入れていますが)なので、多少理解に時間がかかるかもしれませんが、汎用性に優れているのでほとんどどんなプログラムも同じようにコーディングできます。構文から勉強するのだとしたら、お勧めなんですが。 PHPやVBAは厳密に言うとプログラミング言語じゃありませんが…。目的を達成できるのならなんでもいいですけどね。 PHPはサーバサイドのスクリプト言語です。主に動的に変化するWebページなどを生成するために使用します。 perlも同様ですが、リストの処理にはそこそこ適しています。 ただそんなに実行速度は速くないので、スピードを期待しても無理です。 VBAはVisual Basic for Applicationsのことで、これもスクリプト言語です。Microsoft Officeなどの製品上で動作します。動作させるアプリケーション(Excel、PowerPointなど)の違いによってコードが多少変わります。また同じExcelであってもXP/2003などの違いでコードに影響が出ます。 リストはExcel上で処理すれば扱えないこともありませんが、Excelの制約がいろいろとありますので、本格的にやろうと思うと性能が不足すると思います。また速度は非常に遅いです。 参考になりますでしょうか?
その他の回答 (3)
- Tasuke22
- ベストアンサー率33% (1799/5383)
> 10の30乗までの大きな数は扱いません。 そうでしたか。それなら私なら多分C++ですね。 問題のルールをなるべく沢山集めて(自分で発見 しないといけないかもしれませんが)、場合の数 を極力少なくして、全てのケースを計算して比較 する方法をとってみたいです。 それで計算時間が許される範囲かそうでないかで また考え直すことになるでしょう。 データをList構造にするのは、データの構造に柔 軟性を与えるので、修正に有利だと思います。
お礼
ご回答追加していただき、誠にありがとうございます。 言語はC++ですね。今後の参考にさせていただきます。 また、データをリスト構造にするのは若干難しいですが、 ポインタを使っていた時にリスト構造は便利だと思いました。
- Tasuke22
- ベストアンサー率33% (1799/5383)
組合せの最適を求めるなら、組合せの場合の数によって 使う言語が変わるように思います。 私が思うに場合の数が10の30乗を越えたあたりから「最適」 という言葉が使えない世界ではないかと思っています。 結論から書きますと、10の30乗以下ではC++でリスト処理を クラス化にして処理を行えば良いと思います。 シミュレーション的に解くならFortranも可能性はあるでし ょう。 10の30乗を越えるあたりからはLispがいいと思います。 Lisp言語に慣れる必要はあります。Lispを使えば解ける、と いう問題ではありません。 10の30乗を越えるあたりから、答えを求めるためにプログラ ム修正が凄く多くなると思います。 また、組合せの世界の理解に対する概念の変化まで生じてし まい、C++などの言語では、プログラムの作り直しが多発し 効率的に思えません。 その点、Lispは言語自体もList構造になっていますので、 データ構造を上手く表現できたら、それを処理する構造が データなのかプロセスなのか混沌とし、コンパイラ言語の開 発とは異次元の開発世界を感じます。 組合せ世界の理解に伴う概念の変化に強いプログラムになる と思います。 また、Lispを使う場合、フレーム構造などの定義を行うため のマクロなどが用意されているツールの利用もいいと思いま す。名前にshellという部分があるのではないか、と思います。 ま、別に無くても自分で作ればいいことですが。 なお、10の30乗という閾値はあくまでも私個人の意見です。 ここからはプログラムの処理的効率ではなくて、開発の効率 重視でなければ、ベターの答えも得難いと考えています。
お礼
ご回答いただきまして誠にありがとうございます。 残念ながらさすがに10の30乗までの大きな数は扱いません。 しかし、Lipsというのはどこかで聞いたことのある言語です。 少し参考にしながら、今後大きな数に対応できるよう覚えておきます。 どうもありがとうございました。
- buriburi3
- ベストアンサー率44% (353/792)
実行時間とのトレードオフで考えるのが普通だと思いますが。 JavaがCに比べて遅いといっても10秒が15秒になるのと20時間が30時間になるのでは意味合いが違います。 実用上支障が無い範囲であれば実行速度が落ちるデメリットよりもコーディングが柔軟になるメリットの方が大きくなります。 Cで手詰まりになっている原因がテンプレートやクラスを使えば解決可能であるならC++に変えれば良いのでは? 開発ツールに懸けられる予算でも事情は変わります。 PurifyやPGReliefなどの(高価な)ツールが使えるならC/C++でも開発効率はさほど変わりませんが、この手のツールが使えないとメモリリーク問題に悩まされることになるかもしれません。 C言語は構造化言語です。 手続き型、構造化、オブジェクト指向は違う技術ではなく進歩の過程でしかありません。 オブジェクト思考は構造化の上になりたち、構造化は手続き型の上になりたっています。
お礼
ご回答いただきまして誠にありがとうございます。 構造化言語、手続き型言語、オブジェクト指向の意味合いが、 よくわかってきました。オブジェクト指向を目指して頑張ります。 どうもありがとうございました。
お礼
ご回答いただきまして誠にありがとうございます。 Cは汎用性に優れているのですね。私もそのメリット1つにこだわりがありました。 しかし、javaでオブジェクト指向を学んでから再挑戦してみたいと思います。 まさに井の中の蛙でした。他の解説も大変参考になりました。どうもありがとうございました。