用于查找用于搜索的良好调整值的算法或公式

时间:2014-10-26 20:33:22

标签: algorithm math

我有一个编程搜索问题,我想知道是否有任何算法,类,公式或程序可以根据过去的结果产生良好的搜索位置。 (我猜是有某个地方。)或者,我扔出去的解决方案会不会很好?

让我试着用一个简单的例子来解释:假设有一个2×2米和3米深的池塘。我基本上可以将鱼饵放在任何x,y,z位置(2 X 2 X 3 = 27个位置)。假设我在每个地方钓鱼一小时(测试池塘),并在27个地点的每个地方都用不同数量的鱼。现在,在我这样做之后,逻辑钓鱼的最佳地点是我捕获最多鱼类的位置但是因为我捕获了最多的鱼并不意味着它是最好的地方。我本来可以幸运的。在那个地方度过我的大部分时间可能会更好,但仍然冒出一定比例的时间来确认这是最好的地方。

一个简单(又不好?)的解决方案就是在每个地方钓鱼10小时,而大多数鱼被捕获的地方可能是一个很好的位置,但这将浪费很多时间(270小时)。如果我在某些x,y,z处完成并且在x2,y2,z2处没有完成,那么我可能不会在x2,y2,z2上花费太多时间。

我想到的第二个解决方案是记录每个地点花费的时间和捕获的总鱼数。然后执行类似的操作:(简单示例)

float catchesByLocation[2,2,3] = {1}; //init all to 1
float totalTimeSpentByLocation[2,2,3] = {1}; //init all to 1

While(true) //never really ends
{
  Do x = 0 to 2 
    Do y = 0 to 2 
      Do z = 0 to 3  //depth
      {
        float timeToSpendAtThisLoc = catchesByLocation[x,y,z] / totalTimeSpentByLocation[x,y,z];
        float catches = GoFishing(x,y,z);
        catchesByLocation[x,y,z] = catchesByLocation[x,y,z] + catches;
        totalTimeSpentByLocation[x,y,z] = totalTimeSpentByLocation[x,y,z] + timeToSpendAtThisLoc;
      }
}

有了这个解决方案,总有一些时间花在坏位置上,但随着时间的推移,不良位置将只占总时间的一小部分。

所以我的问题是 - 有一些合乎逻辑的方法来做到这一点吗?也许有一种确切的正确方法可以用数学解决这个问题?有关如何解决这个问题的任何想法?抱歉标题不好,我想不出如何标题,我愿意接受建议。感谢您阅读我的问题。

1 个答案:

答案 0 :(得分:2)

您的鱼塘问题描述了一类称为 Explore / Exploit 算法或 Multi-Armed Bandit 问题的问题;见例如http://en.wikipedia.org/wiki/Multi-armed_bandit。有大量的数学理论和算法方法,但关键假设大致如下:

  • 在我们看到最多的地方钓鱼 鱼/小时优化预期的短期奖励(如果我们只有一个小时,这就是我们应该做的)。但是,如果我们继续捕鱼一段时间,可能会有更好的地点,但我们没有足够的信息。
  • 为了正式化这个想法,我们引入时间折扣(鱼 今天抓到的比明天抓到的更有价值,比如0.8)。我们的目标是 在一段时间的捕鱼期间,使鱼类的总折扣最大化, 或者在无限的地平线上。
  • 每小时,我们决定是在当前最佳位置捕鱼,还是获取更多新信息。最简单的策略(" epsilon-greedy")将捕获当前最佳位置,例如概率为90%,并在10%的时间内随机选择另一个位置。
  • 更复杂的策略会引入概率估计,即位置可能比我们当前的最佳位置更好(这取决于估计的预期值及其方差;即,花费的总时间和鱼/小时) 。然后,我们根据这个概率作出决定,以获得更明智的选择(首先探索看起来最有希望的地点)。
  • 对于鱼塘问题,合理的概率模型可能会考虑邻域(位置(x,y,z)可能类似于位置(x-1,y,z),(x,y-1,z )等。)。