我有一个编程搜索问题,我想知道是否有任何算法,类,公式或程序可以根据过去的结果产生良好的搜索位置。 (我猜是有某个地方。)或者,我扔出去的解决方案会不会很好?
让我试着用一个简单的例子来解释:假设有一个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;
}
}
有了这个解决方案,总有一些时间花在坏位置上,但随着时间的推移,不良位置将只占总时间的一小部分。
所以我的问题是 - 有一些合乎逻辑的方法来做到这一点吗?也许有一种确切的正确方法可以用数学解决这个问题?有关如何解决这个问题的任何想法?抱歉标题不好,我想不出如何标题,我愿意接受建议。感谢您阅读我的问题。
答案 0 :(得分:2)
您的鱼塘问题描述了一类称为 Explore / Exploit 算法或 Multi-Armed Bandit 问题的问题;见例如http://en.wikipedia.org/wiki/Multi-armed_bandit。有大量的数学理论和算法方法,但关键假设大致如下: