受约束的n维空间的有效随机抽样

时间:2010-10-21 11:23:40

标签: algorithm language-agnostic genetic-algorithm

我即将优化由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)相同。

2 个答案:

答案 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