【发布时间】:2010-11-02 04:47:36
【问题描述】:
我正在编写一个脚本,该脚本从companies 获取元素并将它们与people 的元素配对。目标是优化配对,使所有配对值的总和最大化(预先计算每个单独配对的值并存储在字典ctrPairs 中)。
他们都是1:1配对的,每个公司只有一个人,每个人只属于一个公司,公司的数量等于人数。我使用了一个自上而下的方法和一个记忆表 (memDict) 以避免重新计算已经解决的区域。
我相信我可以大大提高这里发生的事情的速度,但我不确定如何。我担心的区域标有#slow?,任何建议都将不胜感激(该脚本适用于列表 n ~15 它会变得非常慢)
def getMaxCTR(companies, people):
if(memDict.has_key((companies,people))):
return memDict[(companies,people)] #here's where we return the memoized version if it exists
if(not len(companies) or not len(people)):
return 0
maxCTR = None
remainingCompanies = companies[1:len(companies)] #slow?
for p in people:
remainingPeople = list(people) #slow?
remainingPeople.remove(p) #slow?
ctr = ctrPairs[(companies[0],p)] + getMaxCTR(remainingCompanies,tuple(remainingPeople)) #recurse
if(ctr > maxCTR):
maxCTR = ctr
memDict[(companies,people)] = maxCTR
return maxCTR
【问题讨论】:
-
对不起,我猜这很混乱。我认为它遵循背包类型问题的模型,因此我们的想法是提出一个解决方案,将公司的每个元素与人的元素配对,其中所有配对的总和是所有潜在组合的最大可能值(即不会有其他可以产生更高总和的配对排列)
-
@SilentGhost 停止设置实际描述问题的标题?
-
@Marcin:别再纠结于特权了,去回答一些问题吧。
-
@SilentGhost 你是什么意思,“搞乱特权”?你对我刚刚设置的标题有什么异议?
标签: python algorithm optimization dynamic-programming