• ベストアンサー

評価関数の作成について

アルゴリズムの優劣を評価する評価関数を定義したいのですが、係数の決め方や、具体的な評価関数の作成方法が分からず、根本で詰まってしまっています。 評価関数に関する、分かり易い書籍やサイト等をお知りでしたら、教えて頂きたいです。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • stomachman
  • ベストアンサー率57% (1014/1775)
回答No.1

 評価の対象がアルゴリズムであれ、関数であれ、人であれ、…何でも同じ事なんですが、「優劣」を主観的・定性的に語っていてもしょうがないんで得点として数値化する、というのが評価関数です。どういうものを優れていると言い、どういうものは劣っていると言うのか、それを言う人の価値観を表現する手段が評価関数であって、これによってこそ「優劣」の意味、定義が定まることになります。従って、決まった作り方なんてものはありません。とにかく評価する人の価値観をうまく反映するように工夫するしかないのです。  そのためには、価値観の中身を徹底的に突き詰めて、「評価を行う目的に照らして、本当に評価すべき性質は何か」をぎりぎりまで煮詰めてみるのが定石でしょう。  例えば「速くて使うメモリが少なくて分かりやすいアルゴリズムがいい」なんて曖昧な価値観の場合、 ●「速い」とはどんな規模の入力に対しての話なのか、どの程度なら「速い」うちなのか。測り方を決める必要がある。 ●どの程度なら「短い」うちなのか。測り方を決める必要がある。 ●「分かりやすい」を客観的に表すための測り方を決める必要がある。 ●どの性質をどの程度優先するのか、たとえば「速くて使うメモリが多くて分かりやすいアルゴリズム」と「速くて使うメモリが少なくてうんと分かりにくいアルゴリズム」とではどっちを優れていると見るのか。 などの課題があります。  たとえば、もしそのアルゴリズムが「機器に組み込まれるプログラム用であって、そのプログラムはある一定の範囲に収まる数値を入力してリアルタイムで答を出さねばならない。プログラムは安いマイコン(機種限定。メモリはxxバイト)上で動く必要がある」というような、具体的な状況があれば、評価の仕方が必然的に絞られてきて、「速い」「使うメモリが少ない」をどう評価すれば良いかがはっきりしてきます。(この例の場合なら、アルゴリズムそのものを評価しようとするよりも、プログラムを作って性能を測って評価すべきであるし、「分かりやすい」は評価する必要がない。)  評価関数によってアルゴリズムの評価をすることとはまた別に、評価関数そのものについても、その評価関数が「容易に計算できる」という性質を持つかどうかを問う必要があります(評価関数を評価する評価関数を作る必要はありませんが)。なぜなら、評価関数を作ったものの、実際に評価をおこなう(評価関数の値を計算する)ことが簡単ではない場合もしばしばあります。例えば「プログラマの何割が「分かりやすい」と言うか」で分かりやすさを評価する、という形で評価関数を定義したら、こりゃ大変です。  一方、もし、簡単に計算できて、しかも価値観をそこそこうまく反映している評価関数が手に入れば実用的価値が高い訳です。   ともあれ、「係数の決め方」なんてレベルの話ではありません。

minoa_
質問者

お礼

ありがとうございます! 非常に参考になります。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 評価関数に強くなる本

    リバーシだとか将棋だとかの思考アルゴリズムで重要な役割を持っている評価関数を紹介している本を探しています。 評価関数の作り方の考え方だとか、例えば具体例だとか、アルゴリズムの考え方だとか そのような思考アルゴリズムについて分かりやすく詳しく書いている本を教えてください。

  • 二次形式の評価関数とは。。。

    現在大学院でモデル予測制御について学んでいるものです。その中で評価関数というものがよくでてくるのですが、この評価関数というものの適切な理解ができません。。。 例えばモデル予測制御であれば予測された出力と現在の出力との差と、各サンプル間の入力の差を評価関数とし定義しているのですが、この意味は出力を過大に変化させずに尚入力の過大な変化も防ぐためにこのような評価関数にしているということは大体理解できたのですが、いまいちピンときません。 じゃあ例えば「これこれこういう式を最小化する」という問題になったときにどいういうふうにそれを評価関数に生かすことができるのでしょうか?なにか例などあると助かるのですが・・・ 素人の質問で申し訳ありませんがもしよろしければ誰か回答くださると助かります。どんな些細なことでも結構ですのでよろしくお願いします。 最後に評価関数についてこの本を読めばわかるよ、とかこのサイトにアクセスしたらよくわかるよ、というものがあれば是非教えてください。よろしくお願いします。

  • 建設業者の企業評価

    公共工事に際して建設業者の評価が行われると思うのですが、その評価方法・評価基準について教えていただけませんでしょうか。 それらについて記述のあるサイト・書籍でもけっこうですので、よろしくお願いいたします。

  • 総当りの配列を返す関数の作成

    総当りの配列を返す関数の作成が上手くいきません。 関数にしてほしいことは、与えられた配列arrからnum個取り出す組み合わせを配列で返してもらうことです。 下記が例です。関数の名前をtotalHitとします。 ******************************************** var arr = [0,1,2,3,4]; var num = 2; var arr2 = totalHit(arr,num); /* arr2に[[0,1],[0,2],[0,3],[0,4],[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]が 代入されてほしい */ ******************************************** ネットでもずいぶん探しましたが、目的のものは見つかりませんでした。 アルゴリズムが分かる方、ヒントでもかまいませんので、ご教示願います。

  • PHPの関数定義ついて。

    PHPの関数定義ついて。 初歩的な質問かもしれませんが、 define関数での定数定義が、スクリプト実行時に評価されるのはなぜでしょうか。 なぜコンパイル時ではなくスクリプト実行時に評価しなければならないのでしょうか。 また、const文によるクラス定義が、コンパイル時に評価されるのはなぜでしょうか。 なぜクラス定義はコンパイルに評価しても問題ないのでしょうか。

    • ベストアンサー
    • PHP
  • オイラーのベータ関数について

    オイラーのガンマ関数は階乗の一般化だと思うのですが、ベータ関数はどういう意味があるのかわかりません。いろいろ数学史の本を読みましたがオイラー自身がどういう動機でベータ関数を定義したのか調べることができませんでした。二項係数の逆数に似ているのですが、微妙に違います。ご存知の方よろしくお願い致します。

  • Igorでの関数の作り方

    Igorでの関数の作り方 Igor Pro version 6.12を使って、ユーザー定義関数でのフィッティングを試みています。 関数自体は非常に単純なのですが、式の中に独立変数に依存して変化するwaveを読み込む必要があり、そこが上手く読み込めていないようです。 マクロでは“wave N=wave1”と定義し、式中ではN[x]としています。 コンパイルはできているのですが、係数に適切な値を指定しても全くフィットしません。 このようなユーザー定義関数を作ったことがある方がいらっしゃいましたら、教えていただけないでしょうか。

  • C++:ある関数を定義するときに別の関数を用いて定義はできないのですか。

     Visual C++を使っています。  以下のように関数func2において関数func1を使いたいのですがコンパイルするとポインタがどうのこうのと言ってきます。  書き方が間違っているのでしょうか、別にいい方法がありましたら教えてください。参考書はありますので、どの項目を見ればよいと言うアドバイスでも結構です。 const double a=100.0; //グローバル変数aを定義 //関数func1を定義 double func1(double x){ return exp(x); } //関数func2を定義 double func2(double y){ return func1(a)*exp(y);//func(a)は係数。 } 実際はfunc1とfunc2はもっと複雑な形なのでどうしても別々に定義したいです。

  • 導関数

    関数 y=x^2-6xについて、次の問に答えよ。 問1 導関数を求めよ。 問2 関数 y=x^2-6xのグラフの上のx=2に対応する点の接線の傾きを求めよ。 問3 問2の接線の方程式を求めよ。 私の回答 y’(x)=nx(nー1)を使って 問1 2x-1 問2 3 問3 5 これであってますか? 問3は微分係数の定義か導関数の定義を使うのでしょうか? 教えてください。 よろしくお願いします。

  • 関数から関数を呼ぶ

    VC++でDLLを作成しています。 超初心者です。 関数から関数を呼ぼうとしたら、 >関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。 というエラーがでました。 どういうことでしょうか?