6

だから私はヒューリスティックアルゴリズムを実装しています、そして私はこの関数に出くわしました。

私は1からnの配列を持っています(Cでは0からn-1、w / e)。別の配列にコピーする要素の数を選択したいと思います。パラメータy(0 <y <= 1)が与えられた場合、平均が(y * n)である数の分布が必要です。つまり、この関数を呼び出すと、0からnまでの数値が返され、これらの数値の平均はy*nになります。

著者によると、「l」は乱数です:0<l<n。私のテストコードでは、現在生成されている0 <= l<=nです。そして、私は正しいコードを持っていました、しかし私は今何時間もこれをいじっています、そして私はそれを元に戻すのが面倒です。

そこで、関数の最初の部分をコーディングしました。y<= 0.5の場合、yを0.2に設定し、nを100に設定しました。つまり、0から99までの数値、平均20を返す必要がありました。結果はその間にありません。 0とnですが、一部は変動します。そして、nが大きいほど、このフロートは小さくなります。

これはCテストコードです。「x」は「l」パラメータです。

//hate how code tag works, it's not even working now  
int n = 100;  
float y = 0.2;  
float n_copy;  

for(int i = 0 ; i < 20 ; i++)  
{  
    float x = (float) (rand()/(float)RAND_MAX);  // 0 <= x <= 1  
    x = x * n;                                // 0 <= x <= n  
    float p1 = (1 - y) / (n*y);  
    float p2 = (1 - ( x / n ));  
    float exp = (1 - (2*y)) / y;  
    p2 = pow(p2, exp);  
    n_copy = p1 * p2;  
    printf("%.5f\n", n_copy);  
}  

そして、ここにいくつかの結果があります(小数点以下5桁が切り捨てられます):

0.03354  
0.00484  
0.00003  
0.00029  
0.00020  
0.00028  
0.00263  
0.01619  
0.00032  
0.00000  
0.03598  
0.03975    
0.00704  
0.00176  
0.00001  
0.01333  
0.03396   
0.02795  
0.00005  
0.00860 

記事は次のとおりです。

http://www.scribd.com/doc/3097936/cAS-The-Cunning-Ant-System

6ページと7ページ。

またはグーグルで「cAS:狡猾なアリシステム」を検索してください。

だから私は何が間違っているのですか?これと同じ機能を説明している論文が5つ以上あるので、著者が間違っているとは思いません。

私を助けてくれる人への私のすべてのインターネット。これは私の仕事にとって重要です。

ありがとう :)

4

3 に答える 3

6

あなたは自分に期待されていることを誤解しているかもしれません。

(適切に正規化された) PDF が与えられ、それに一致するランダム分布をスローしたい場合は、PDF を統合して累積確率分布 (CDF) を形成し、CDF を逆にして、逆の引数として一様ランダム述語を使用します。関数。


もう少し詳しく。

f_s(l)は PDF で、 で正規化されてい[0,n)ます。

これを統合して CDF を形成します。

g_s(l') = \int_0^{l'} dl f_s(l)

これは、私が呼び出した未指定のエンドポイントに明確に組み込まれていることに注意してくださいl'。したがって、CDF は の関数ですl'。正規化の権利があると仮定すると、g_s(N) = 1.0. そうでない場合は、単純な係数を適用して修正します。

次に CDF を反転し、結果を呼び出しますG^{-1}(x)。このために、おそらくガンマの特定の値を選択したいと思うでしょう。

に一様乱数を投げて[0,n)、それを引数 , xtoとして使うG^{-1}。結果は の間[0,1)にあり、 に従って分配される必要がありますf_s

ジャスティンが言ったように、数学にはコンピューター代数システムを使用できます。

于 2010-11-05T04:14:38.313 に答える
4

dmckee は実際には正しいのですが、ここでさらに詳しく説明して、混乱の一部を説明しようと思いました。私は間違いなく失敗する可能性がありました。f_s(l)、上記のきれいな式にある関数は、確率分布関数です。lこれは、0 から n の間の特定の入力についてl、セグメントの長さである確率を示します。0 から n までのすべての値の合計 (積分) は 1 に等しくなければなりません。

7 ページの上部にあるグラフは、この点を混乱させています。l対をプロットf_s(l)しますが、横に置いた浮遊要因に注意する必要があります。一番下の値は 0 から 1 に変化しますがx n、横に係数があります。これは、l値が実際には 0 から n に変化することを意味します。また、y 軸には、x 1/nこれらの値が実際には約 3 にはならず、3/n になることを意味する a があります。

それで、あなたは今何をしますか?さて、確率分布関数を積分して累積分布関数を解く必要がありますが、l実際にはそれほど悪くないことがわかります (私は Wolfram Mathematica Online Integrator で x をl使用し、y <= の方程式のみを使用してそれを行いました.5)。ただし、それは不定積分を使用しており、実際には x に沿って 0 から まで積分していますl。結果の方程式を変数 (たとえば z) に等しく設定すると、目標lは z の関数として解くことになります。z は 0 から 1 の間の乱数です。必要に応じて、この部分にシンボリック ソルバーを使用することもできます (そうします)。次に、この分布からランダムな s を選択できるという目標を達成しただけでなくl、涅槃も達成しました。

もう少し仕事が終わった

もう少しお手伝いします。y <= .5 について説明したことを実行しようとしましたが、使用していた記号代数システムでは反転を実行できませんでした (他のシステムでは実行できる可能性があります)。しかし、その後、.5 < y <= 1 の方程式を使用してみることにしました。これははるかに簡単であることがわかりました。lxに変更するf_s(l)と、

y / n / (1 - y) * (x / n)^((2 * y - 1) / (1 - y))

これを x から 0 まで積分するlと (Mathematica のオンライン インテグレーターを使用)、次のようになりました。

(l / n)^(y / (1 - y))

この種のことで、それ以上に良くなることはありません。これを z に等しく設定して解くと、次のlようになります。

l = n * z^(1 / y - 1)      for .5 < y <= 1

1 つの簡単なチェックは y = 1 です。この場合、l = nz が何であっても得られます。ここまでは順調ですね。ここで、z (0 と 1 の間の乱数) を生成するだけでl、.5 < y <= 1 に対して希望どおりに分布する an が得られます。しかし、7 ページのグラフを見ると、確率分布が関数は対称です。つまり、上記の結果を使用して、0 < y <= .5 の値を見つけることができます。l->n-ly->を変更1-yして get

n - l = n * z^(1 / (1 - y) - 1)

l = n * (1 - z^(1 / (1 - y) - 1))      for 0 < y <= .5

とにかく、どこかでエラーが発生しない限り、問題は解決するはずです。幸運を。

于 2010-11-05T04:50:02.773 に答える
0

説明したように、任意の値 l、y、n に対して、p1 と p2 を呼び出す項は両方とも [0,1) にあり、exp は [1,..) にあり、pow(p2, exp) も [0, 1) したがって、[0,n) の範囲の出力を取得する方法がわかりません。

于 2010-11-05T04:06:13.623 に答える