算法问题最大化函数的平均值

时间:2010-03-28 20:00:26

标签: algorithm

我有一组N个非递减函数,每个函数用F i (h)表示,其中h是整数。这些函数有数值。

我正试图找出一种方法来最大化给定总H值的所有函数的平均值。

例如,假设每个函数代表作业的等级。如果我花了一个小时完成作业,我会得到g = F i (h)作为我的成绩。我有H小时完成所有作业。我想最大化所有作业的平均成绩。

有人能指出我正确的方向来解决这个问题吗?我只需要伪代码中的通用算法,然后我就可以从中快速适应。

编辑:我认为动态编程可以用来解决这个问题,但我并不是100%确定。

编辑2:我在算法书中找到了一个例子,从我上大学时就是几乎完全相同的问题take a look here on Google Books

6 个答案:

答案 0 :(得分:3)

我不知道编程,但在数学函数中函数被称为函数,相关的数学是变量的微积分。

答案 1 :(得分:1)

查看线性编程,integer programming

部分

答案 2 :(得分:0)

遗传算法有时会用于此类事物,但您获得的结果不是最佳的,而是接近它。
如果我们可以确定函数的一些属性(函数X是否上升?它们中的任何一个都有渐近线,我们可以滥用吗?等),那么你需要设计一个“真正的”解决方案(我总觉得遗传有点作弊)每个功能的一些分析机制,并从那里采取它。如果我们没有任何属性,它们可以是任何东西。我的数学不是很好,但是那些可能的函数是疯狂的因子^ 99除非你的h是42或者其他什么就是零。
没有进一步的信息,或知道您的程序可以分析并获得一些信息。我会去遗传学。 (在它上面应用一些分析功能是有意义的,如果你找到一些可以使用的属性,使用它们,否则转向遗传算法)

答案 3 :(得分:0)

如果F中的函数在其域中单调递增,则参数搜索适用(搜索Meggido)。

答案 4 :(得分:0)

查看The bounded knapsack problem和给定的动态编程算法。

答案 5 :(得分:0)

我有一个问题:你有多少功能和几个小时?

在我看来,如果没有太高的话,那么详尽的搜索会非常合适。

动态编程应用程序非常简单,首先要考虑:

F1 = [0, 1, 1, 5] # ie F1[0] == 0, F1[1] == 1
F2 = [0, 2, 2, 2]

然后,如果我有2个小时,我最好的方法是:

F1[1] + F2[1] == 3

如果我有3个小时,我最好这样做:

F1[3] + F2[0] == 5

因此,在给定小时数的情况下,配置文件是无政府状态,这意味着如果存在解决方案,则包含操纵函数的数量。

因此,我们可以一次引入一种方法:

R1 = [0, 1, 1, 5] # ie maximum achievable (for each amount) if I only have F1
R2 = [0, 2, 3, 5] # ie maximum achievable (for each amount) if I have F1 and F2

引入新功能需要O(N)时间,其中N是总小时数(当然我必须存储确切的重新分区...)

因此,如果您有M个函数,则根据函数执行次数,算法为O(M*N)

有些函数可能不是很简单,但是这个算法隐式执行缓存:即我们只在给定点评估给定函数一次!

我想如果我们能够考虑使用increasing属性我们会更好,但我敢说我不确定具体细节。等待一个聪明的家伙!

既然是家庭作业,我就不会发布代码了。我要注意,如果R表由成对(score,nb)组成,nb表示引入最新方法所用的小时数,则可以“存储”重新分区。