我即将优化由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)相同。
答案 0 :(得分:1)
如果您正在处理实值变量,则使用两个变得相同的样本到达是不太可能的。但是,您确实存在样品不均匀的问题。你更有可能选择(0.5,0.5)而不是(1.0,0)。解决这个问题的方法就是二次抽样。基本上你所做的是,当你在某个点上缩小空间时,你会减少选择它的可能性。
所以基本上你正在做的是映射单位立方体内满足相同方向的所有点,映射到单个点。这些点在同一方向上形成一条线。线越长,选择投影点的概率就越大。因此,您希望通过该行长度的倒数来偏置选择点的概率。
以下是可以执行此操作的代码(假设您正在寻找x_is总计为1):
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;
}
答案 1 :(得分:0)
以前是provided之前的Amit Prakash函数,转换为python
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 x