[WIP] Improve routine suggestion.

This commit is contained in:
Trullemans Gregory 2020-03-14 21:38:10 +01:00
parent 9005ed2c09
commit 11e2e56a5f
2 changed files with 65 additions and 71 deletions

View File

@ -352,6 +352,7 @@ def random_skill(request, number=None):
def __construct_routine( def __construct_routine(
current_routine, current_routine,
max_routine_length, max_routine_length,
max_skill_difficulty,
total_difficulty_score=None, total_difficulty_score=None,
competition=True, competition=True,
logic=True, logic=True,
@ -361,85 +362,72 @@ def __construct_routine(
Args: Args:
current_routine (array): la série en cours de création. current_routine (array): la série en cours de création.
routine_length (int): nombre de sauts qui compose la série. max_routine_length (int): nombre de saut souhaités dans la série.
max_skill_difficulty (int): difficulté du saut le plus difficile à considérer.
total_difficulty_score (int): score total de difficulté souhaité de la série EN DIXIEME (/!\). total_difficulty_score (int): score total de difficulté souhaité de la série EN DIXIEME (/!\).
competition (bool): indique si la série doit respecter les règles de compétition. competition (bool): indique si la série doit respecter les règles de compétition.
logic (bool): indique si la série doit suivre les règles de logique (sportive). logic (bool): indique si la série doit suivre les règles de logique (sportive).
gymnast (gymnast): gymnaste. gymnast (gymnast): gymnaste.
Returns: Returns:
??? (list): liste des séries correspondantes aux criètres. ??? (list ?): liste des séries correspondantes aux criètres.
""" """
# print("Il reste " + str(max_routine_length - len(current_routine)) + " sauts à trouver.")
print("Il reste " + str(total_difficulty_score) + " dixièmes à trouver.")
if not total_difficulty_score or total_difficulty_score <= 0:
print("Total score négatif ou None !")
return
if len(current_routine) == max_routine_length: if len(current_routine) == max_routine_length:
print(current_routine) print(current_routine)
return return
# print('1')
if total_difficulty_score / max_skill_difficulty > max_routine_length:
return
if total_difficulty_score <= 0:
return # Total score négatif, on est au dela du total score demandé
if current_routine: if current_routine:
skill_list = Skill.objects.filter( skill_list = Skill.objects.filter(
departure = current_routine[-1].landing departure = current_routine[-1].landing
) # , difficulty__lte = total_difficulty_score ) # , difficulty__lte = total_difficulty_score
if len(current_routine) == (max_routine_length - 1): if len(current_routine) == (max_routine_length - 1):
skill_list = skill_list.filter(landing__longLabel="Debout") skill_list = skill_list.filter(landing__longLabel="Debout")
if logic and current_routine[-1].landing == "Debout": if logic and current_routine[-1].landing.longLabel == "Debout":
skill_list = skill_list.exclude(rotationType = current_routine[-1].rotationType) skill_list = skill_list.exclude(rotationType = current_routine[-1].rotationType)
else: else:
skill_list = Skill.objects.filter(departure__longLabel = "Debout") skill_list = Skill.objects.filter(departure__longLabel="Debout")
# print('2')
if competition: if competition:
skill_list = skill_list.filter(is_competitive = True) skill_list = skill_list.filter(is_competitive=True)
# skill_list = skill_list.exclude(position="L").exclude(position="c")
# print('3')
if logic and total_difficulty_score: if logic and total_difficulty_score:
if gymnast: if len(current_routine) == max_routine_length - 1:
max_skill_difficulty = Educative.objects.filter(cando__gymnast=gymnast).order_by( min_diff_skill = total_difficulty_score
"-difficulty" max_diff_skill = total_difficulty_score + 3
)[:1]
else: else:
max_skill_difficulty = Skill.objects.values('difficulty').order_by("-difficulty")[:1][0]["difficulty"] * 10 if math.ceil(total_difficulty_score / max_routine_length) < max_skill_difficulty:
print("Max Skill diff.: " + str(max_skill_difficulty)) min_diff_skill = math.ceil(max((total_difficulty_score / max_routine_length) - 5, 0))
else:
return
if math.ceil(total_difficulty_score / max_routine_length) < max_skill_difficulty: if (math.ceil(total_difficulty_score / max_routine_length) + 2) <= max_skill_difficulty:
min_diff_skill = math.ceil(max((total_difficulty_score / max_routine_length) - 5, 0)) max_diff_skill = math.ceil(total_difficulty_score / max_routine_length) + 2
print("Min diff.: " + str(min_diff_skill)) else:
else: return
return
if (math.ceil(total_difficulty_score / max_routine_length) + 2) <= max_skill_difficulty:
max_diff_skill = math.ceil(total_difficulty_score / max_routine_length) + 2
print("Max. diff.: " + str(max_diff_skill))
else:
print("Score demandé:" + str(total_difficulty_score))
print("# de sauts:" + str(max_routine_length))
print("Pré-condition:" + str((total_difficulty_score / max_routine_length) + 2))
print("Condition: " + str(math.ceil(total_difficulty_score / max_routine_length) + 2))
print("RETURN…")
return
skill_list = skill_list.filter( skill_list = skill_list.filter(
difficulty__gte = (min_diff_skill / 10), difficulty__gte = (min_diff_skill / 10),
difficulty__lte = (max_diff_skill / 10) difficulty__lte = (max_diff_skill / 10)
) )
# print('4')
# if gymnast:
# skill_list = skill_list.filter(can_do__gymnast = gymnast)
# skill_list = skill_list[0:3] if gymnast:
skill_list = skill_list.filter(cando__gymnast = gymnast)
for skill in skill_list: for skill in skill_list:
print("On sélectionne : " + str(skill))
current_routine.append(skill) current_routine.append(skill)
__construct_routine( __construct_routine(
current_routine, current_routine,
max_routine_length, max_routine_length,
total_difficulty_score - (skill.difficulty * 10) if total_difficulty_score else None, max_skill_difficulty,
total_difficulty_score - (skill.difficulty * 10) if total_difficulty_score is not None else None,
competition, competition,
logic, logic,
gymnast, gymnast,
@ -452,7 +440,7 @@ def __construct_routine(
def suggest_routine( def suggest_routine(
request, request,
max_routine_length = 2, max_routine_length = 3,
total_difficulty_score=None, total_difficulty_score=None,
competition=True, competition=True,
logic=True, logic=True,
@ -473,32 +461,38 @@ def suggest_routine(
>>> http://127.0.0.1:8000/routine/suggest/ >>> http://127.0.0.1:8000/routine/suggest/
""" """
# routines = []
# routines.append(__construct_routine(
# routine_length,
# total_difficulty_score,
# competition,
# logic,
# gymnast,
# None
# )
# )
routine = []
# if not total_difficulty_score:
# total_difficulty_score = 15
difficulty_scores = range(5, 45, 5) routine = []
for total_difficulty_score in difficulty_scores:
print("===============================================================================================") if not gymnast:
print(total_difficulty_score) gymnast = Gymnast.objects.get(pk=14)
__construct_routine( total_difficulty_score = 30
routine,
max_routine_length, if gymnast:
total_difficulty_score, max_skill_difficulty = Educative.objects.values('difficulty').filter(cando__gymnast=gymnast).order_by(
competition, "-difficulty"
logic, )[:1][0]["difficulty"] * 10
gymnast, else:
) max_skill_difficulty = Skill.objects.values('difficulty').order_by("-difficulty")[:1][0]["difficulty"] * 10
# print(max_skill_difficulty)
# if not total_difficulty_score:
# total_difficulty_score = 30
# max_routine_length = 3
# difficulty_scores = range(5, 45, 5)
# for total_difficulty_score in difficulty_scores:
# print("===============================================================================================")
__construct_routine(
routine,
max_routine_length,
max_skill_difficulty,
total_difficulty_score,
competition,
logic,
gymnast,
)
# print(routines) # print(routines)

View File

@ -76,8 +76,8 @@ class GymnastForm(forms.ModelForm):
) )
widgets = { widgets = {
"id": forms.HiddenInput(), "id": forms.HiddenInput(),
"lastname": forms.TextInput(attrs={"class": "form-control"}), "lastname": forms.TextInput(attrs={"class": "form-control", "placeholder":"Lastname"}),
"firstname": forms.TextInput(attrs={"class": "form-control"}), "firstname": forms.TextInput(attrs={"class": "form-control", "placeholder":"Firstname"}),
"birthdate": forms.DateInput(attrs={"class": "form-control datepicker"}), "birthdate": forms.DateInput(attrs={"class": "form-control datepicker"}),
"gender": forms.Select(attrs={"class": "form-control"}), "gender": forms.Select(attrs={"class": "form-control"}),
"address": forms.TextInput(attrs={"class": "form-control"}), "address": forms.TextInput(attrs={"class": "form-control"}),