所以我正在实现一个启发式算法,我遇到了这个函数。
我有一个从1到n的数组( C上的0到n-1,w/e)。我想选择一些要复制到另一个数组中的元素。给定一个参数y (0
根据作者的说法,"l“是一个随机数:0
所以我编写了函数的第一部分,对于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: cunning ant system“。
那么我到底做错了什么呢?我不相信作者是错的,因为有超过5篇论文描述了这个函数。
把我所有的互联网都交给帮助我的人。这对我的工作很重要。
谢谢:)
发布于 2010-11-05 12:14:38
你可能会误解别人对你的期望。
给定一个(适当标准化的) 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)。为此,您可能希望选择一个特定的gamma值。
然后在[0,n)上抛出均匀随机数,并将这些随机数用作G^{-1}的参数x。结果应该在[0,1)之间,并且应该根据f_s分布。
就像贾斯汀说的,你可以使用计算机代数系统来计算数学。
https://stackoverflow.com/questions/4103477
复制相似问题