所以我正在实现一个启发式算法,我遇到了这个函数。
我有一个 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 篇论文描述了相同的功能。
我所有的互联网给任何帮助我的人。这对我的工作很重要。
谢谢 :)