所以我正在实现一个启发式算法,我遇到了这个函数。
我有一个从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:50:03
dmckee实际上是正确的,但我认为我应该更详细地说明,并尝试在这里解释一些混淆。我肯定会失败的。f_s(l),你在上面漂亮的公式中的函数,是概率分布函数。它告诉您,对于0和n之间的给定输入l,l是数据段长度的概率。0和n之间的所有值的和(整数)应等于1。
第7页顶部的图表混淆了这一点。它绘制了l与f_s(l)的对比图,但您必须注意它放在一边的杂乱因素。你会注意到底部的值从0到1,但是边上有一个x n因子,这意味着l的值实际上是从0到n。另外,在y轴上有一个x 1/n,这意味着这些值实际上不是上升到大约3,而是上升到3/n。
那么你现在做什么呢?那么,你需要通过在l上积分概率分布函数来求解累积分布函数,这实际上并不是很糟糕(我用Wolfram Mathematica在线积分器解决了这个问题,对l使用了x,对y,<=,.5只使用了方程)。然而,这是一个不定积分,你实际上是从x到l的积分。如果我们将结果方程设置为某个变量(例如z ),则现在的目标是将l求解为z的函数。z是介于0和1之间的一个随机数。如果您愿意(我愿意),您可以尝试使用符号求解器来求解这一部分。那么,你不仅实现了能够从这个发行版中随机挑选l的目标,而且还实现了涅盘。
完成了更多的工作
我会帮你更多一点。我试着为y <= .5做我所说的事情,但是我使用的符号代数系统不能进行倒置(其他系统也许可以)。然而,然后我决定尝试使用.5 f_s(l)中将l更改为x,我会得到
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一个快速检查是y= 1。在这种情况下,无论z是什么,我们都会得到l = n。到目前一切尚好。现在,您只需生成z(0和1之间的一个随机数),您就会得到一个按照您对.5 l。但是,请稍等,查看第7页上的图表,您会注意到概率分布函数是对称的。这意味着我们可以使用上面的结果来找到0l -> n-l和y -> 1-y并获取
n - l = n * z^(1 / (1 - y) - 1)
l = n * (1 - z^(1 / (1 - y) - 1))      for 0 < y <= .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分布。
就像贾斯汀说的,你可以使用计算机代数系统来计算数学。
发布于 2010-11-05 12:06:14
假设对于上述任意值l,y,n,您调用的术语p1和p2都在[0,1]中,而exp在[1,..]中。在[0,1]中生成pow(p2,exp)因此我不明白如何得到范围为[0,n)的输出
https://stackoverflow.com/questions/4103477
复制相似问题