我有一组N个非递减函数,每个函数用F i (h)表示,其中h是整数。这些函数有数值。
我正试图找出一种方法来最大化给定总H值的所有函数的平均值。
例如,假设每个函数代表作业的等级。如果我花了一个小时完成作业,我会得到g = F i (h)作为我的成绩。我有H小时完成所有作业。我想最大化所有作业的平均成绩。
有人能指出我正确的方向来解决这个问题吗?我只需要伪代码中的通用算法,然后我就可以从中快速适应。
编辑:我认为动态编程可以用来解决这个问题,但我并不是100%确定。
编辑2:我在算法书中找到了一个例子,从我上大学时就是几乎完全相同的问题take a look here on Google Books。
答案 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
表示引入最新方法所用的小时数,则可以“存储”重新分区。