所以我正在实现一个启发式算法,并且我遇到了这个函数。
我有一个 1 到 n 的数组(C 上的 0 到 n-1,w/e)。我想选择一些要复制到另一个数组的元素。给定参数 y (0
根据作者的说法,“l”是一个随机数:0
所以我编写了函数的第一部分,对于 y
这是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 http://www.scribd.com/doc/3097936/cAS-The-Cunning-Ant-System
第 6 页和第 7 页。
或者在谷歌上搜索“CAS:狡猾的蚂蚁系统”。
那么我做错了什么?我不相信作者是错的,因为有超过 5 篇论文描述了这个相同的功能。
我所有的互联网给任何帮助我的人。这对我的工作很重要。
谢谢 :)
您可能会误解对您的期望。
给定一个(适当归一化的)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)
,并使用它们作为参数,x
, to G^{-1}
。结果应该介于[0,1)
,并应根据f_s
.
就像贾斯汀说的,你可以使用计算机代数系统来进行数学计算。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)