我想确定是否有更好的算法可用于下面的问题集,而不是我已经提出的蛮力方法。鉴于最初的循环是n ** n,这很快就会下降。如何确定排名算法标准
该算法的要点是,我有一组排名和与排名项目相关的数据。从这我需要确定什么标准被用来提出排名顺序。例如,如果排名是Ben,Sam,然后是Hal,那么使用的标准将是GPA。
criteria = ['Height', 'Weight', 'GPA']
candidates = {'Ben': (72,205,4.0),'Sam': (65,220,3.8),'Hal': (74,210,3.6)}
def base10toN(num, base):
converted_string, modstring = "", ""
currentnum = num
while currentnum:
mod = currentnum % base
currentnum = currentnum // base
converted_string = chr(48 + mod + 7*(mod > 10)) + converted_string
return converted_string
def get_relevant_criteria(criteria, candidates, ranking):
l = len(criteria)
max_score = 0
max_criteria =()
for x in xrange(1,l**l):
pattern = str(base10toN(x,l)).rjust(3,'0')
prev_score = 0
isvalid = True
for candidate in ranking[::-1]:
new_score = score_criteria(pattern, candidates[candidate])
if new_score < prev_score:
isvalid = False
break
prev_score = new_score
if isvalid:
return [criteria[x] + " (x"+pattern[x]+")" for x in xrange(0,len(pattern)) if pattern[x] != '0']
return None
def score_criteria(pattern, values):
score = 0
for x in xrange(0,len(pattern)):
score += int(pattern[x]) * values[x]
return score
print get_relevant_criteria(criteria, candidates, ('Ben', 'Sam', 'Hal')) # GPA
print get_relevant_criteria(criteria, candidates, ('Sam', 'Hal', 'Ben')) # Weight
print get_relevant_criteria(criteria, candidates, ('Hal', 'Ben', 'Sam')) # Height
如果Ben拥有最高的GPA,那么最高也是最重的,而Sam拥有最低的GPA呢,是最短的,最轻的。没有办法告诉用什么来排名他们。 –
我有一个更强大的应用程序,我已经写了这些细节的帐户,但希望尽可能简化问题的精神。主要问题是,要准确评分,我是否真的必须评估n ** n中的每个组合? –