2010-08-23 5 views
0

Je travaille sur une affectation qui contient un fichier de données en texte brut.Détermination des poids optimaux pour calculer les cotes

Chaque ligne de texte représente une course automobile. Chaque ligne de texte comporte quatre chaînes, délimitées par des virgules.

Les chaînes représentent un nom de coureur. La première chaîne est le coureur qui est venu en premier, le second a obtenu la deuxième place, etc.

La tâche qui nous a été donnée est de lire dans ce fichier et de trier les coureurs en fonction de leur succès. Nous avons donné un algorithme de comparaison à utiliser:

int compareTo(Racer r1, Racer r2) 
{ 
    for (int i = 0; i < r1.positions.length; i++) 
    { 
     int diff = r1.positions[i] - r2.positions[i]; 

     if (diff == 0) 
     { 
      continue; 
     } 

     return diff; 
    } 

    return 0; 
} 

donc essentiellement premières positions de place ont priorité sur les deuxièmes positions de place, deuxième par rapport au troisième, etc.

Mais il y a un problème avec ce code. Ma pensée serait qu'un coureur qui avait 100 secondes places et pas de premières serait mieux classé qu'un coureur avec une seule première place. Cela m'a amené à penser: cela n'aurait-il pas plus de sens d'avoir une pondération pour chaque position?

La pondération serait calculée pour chaque Racer:

int weight = w1*positions[0] 
    + w2*positions[1] 
    + w3*positions[2] 
    + w4*positions[3]; 

Mais je suis tombé sur un problème. Comment puis-je calculer les poids optimaux pour chaque compte de position?

Sûrement je peux regarder les données existantes et calculer les poids de cela? Mon instinct me dit que je devrais essayer de le calculer en fonction du ratio des gagnants uniques par position ou quelque chose de similaire.

Existe-t-il un théorème permettant de calculer les poids? Je pense que je peux obtenir quelques points bonus si je peux montrer un meilleur algorithme;)

Merci d'avance.

Répondre

1

Vous faites quelques hypothèses dans votre argument:

Mes pensées seraient qu'un coureur qui avait 100 deuxièmes places et aucune premières fois serait mieux classé qu'un coureur avec un seul premier lieu.

Cela dépend totalement des règles de la course! Déterminer si 100 2nd est meilleur que 1 1st et 99 4th revient aux règles du tournoi.

En outre, une façon meilleure et plus simple d'appliquer votre méthode de résultats pondérés serait simplement d'avoir des points par course. Par exemple, 1er donne 10 points, 2ème donne 8 etc. Cela dépendrait à nouveau des règles de la course et du tournoi, qui ne sont pas spécifiées, il est donc difficile de continuer.

Si vous voulez impressionner votre tuteur, pensez à implémenter le système de notation comme argument supplémentaire optionnel dans l'entrée, "points".

1

Donc, essentiellement, les positions en première position prennent le pas sur les positions en deuxième position, la deuxième sur la troisième, etc.

Ce n'est pas ce que la fonction compareTo calcule. Si la fonction a été écrit plus clairement ce serait plus évident:

int diff; 
for (int i = 0; i < r1.positions.length; i++) { 
    diff = r1.positions[i] - r2.positions[i]; 
    if (diff != 0) { 
     return diff; 
    } 
} 
return 0; 

Si positions[i] est le classement d'un coureur dans la course i, puis à moins r1 et r2 à égalité dans la première course de cette fonction est équivalente à:

return r1.positions[0] - r2.positions[0]; 

qui ne place que deux coureurs sur leur classement dans la première course seulement. Par conséquent, les poids pour les courses suivantes sont effectivement 0. En effet, s'il y avait un coureur de première place dans la course 0, ce coureur sera toujours mieux classé que tous les autres coureurs, peu importe combien de courses existent.

Je demanderais à votre instructeur de vous parler de cette fonction de comparaison non intuitive avant de continuer.

Questions connexes