我要优化一个由n (n>=1,通常是n=4)非负变量定义的问题。这不是一个n维问题,因为所有变量的和都需要1。
最简单的方法是每个x_i扫描整个范围的0<=x_i<1,然后将所有的值标准化为x的总和。然而,这种方法引入了冗余,对于许多依赖解空间随机抽样(遗传算法、禁忌搜索等)的优化算法来说,这是一个问题。是否有其他算法可以执行此任务?
我所说的冗余是什么意思?
以二维情况为例。如果没有约束,这将是一个二维问题,需要优化两个变量。但是,由于需要X1 + X2 == 0,所以只需要优化一个变量,因为X2是由X1决定的,反之亦然。如果一个人决定独立扫描X1和X2,并将它们标准化为1,那么许多解决方案的候选方案就会与问题相同。例如(X1==0.1,X2==0.1)与(X1==0.5,X2==0.5)相同。
发布于 2010-10-21 17:44:29
如果您处理的是实际值变量,那么到达两个样本,变得相同是非常不可能的。然而,你确实有一个问题,你的样品将是不统一的。您更有可能选择(0.5,0.5)而不是(1.0,0)。解决这一问题的方法之一是过采样。基本上,你要做的是,当你沿着某个点缩小空间的时候,你会缩小选择它的可能性。
所以基本上,你所做的是映射所有在单位立方体内满足的点,在相同的方向上,映射到一个点。这些点在同一方向形成一条线。线越长,选择投影点的概率就越大。因此,你想要偏差的概率,选择一个点的倒数,该线的长度。
下面是可以这样做的代码(假设您正在寻找最多可达1的x_is ):
while(true) {
maximum = 0;
norm = 0;
sum = 0;
for (i = 0; i < N; i++) {
x[i] = random(0,1);
maximum = max(x[i], max);
sum += x[i];
norm += x[i] * x[i];
}
norm = sqrt(norm);
length_of_line = norm/maximum;
sample_probability = 1/length_of_line;
if (sum == 0 || random(0,1) > sample_probability) {
continue;
} else {
for (i = 0; i < N; i++) {
x[i] = x[i] /sum;
}
return x;
}发布于 2011-07-12 14:59:12
下面是先前由provided翻译成python的相同的函数Amit Prakash
import numpy as np
def f(N):
while(True):
count += 1
x = np.random.rand(N)
mxm = np.max(x)
theSum = np.sum(x)
nrm = np.sqrt(np.sum(x * x))
length_of_line = nrm / mxm
sample_probability = 1 / length_of_line
if theSum == 0 or rand() > sample_probability:
continue
else:
x = x / theSum
return xhttps://stackoverflow.com/questions/3986886
复制相似问题