[WIP] Improve routine suggestion.
This commit is contained in:
parent
dae1c8648d
commit
1afadfbe97
|
@ -1,3 +1,6 @@
|
|||
# IDE
|
||||
.vscode/
|
||||
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
|
|
|
@ -0,0 +1,86 @@
|
|||
import math
|
||||
|
||||
from people.models import Gymnast
|
||||
from objectives.models import Skill
|
||||
|
||||
def suggest_routine(
|
||||
request,
|
||||
routine_length,
|
||||
total_difficulty_score = None,
|
||||
competition = True,
|
||||
logic = True,
|
||||
gymnast = None,
|
||||
last_jump = None
|
||||
):
|
||||
""" Construit et propose des séries.
|
||||
|
||||
Args:
|
||||
routine_length (int): nombre de sauts que doit contenir la série.
|
||||
total_difficulty_score (int): score de difficulté total souhaité de la série.
|
||||
competition (bool): indique si la série doit pouvoir être utilisée en compétition.
|
||||
logic (bool): indique si la série doit suivre certaines règles de logique (sportive).
|
||||
gymnast (gymnast): gymnaste.
|
||||
last_jump (skill): dernier saut sélectionné pour la série.
|
||||
|
||||
Returns:
|
||||
??? (list): liste des séries correspondantes aux criètres.
|
||||
"""
|
||||
|
||||
current_routine = []
|
||||
|
||||
if last_jump:
|
||||
skill_list = Skill.objects.filter(departure = last_jump.landing, difficulty__lte = total_difficulty_score)
|
||||
if logic and last_jump.landing == "Debout":
|
||||
skill_list = skill_list.exclude(rotationType = last_jump.rotationType)
|
||||
else:
|
||||
skill_list = Skill.objects.filter(departure__longLabel = "Debout")
|
||||
|
||||
if competition:
|
||||
skill_list = skill_list.filter(is_competitive = True)
|
||||
|
||||
if logic and total_difficulty_score:
|
||||
min_difficulty_score = math.ceil(max(0, ((total_difficulty_score / 10) - 5)))
|
||||
|
||||
if total_difficulty_score <= 65:
|
||||
max_difficulty_score = math.ceil(total_difficulty_score / 5) + 1
|
||||
elif total_difficulty_score <= 120:
|
||||
max_difficulty_score = math.ceil(total_difficulty_score / 10) + 7
|
||||
else:
|
||||
max_difficulty_score = math.ceil(total_difficulty_score / 15) + 11
|
||||
|
||||
skill_list = skill_list.filter(
|
||||
difficulty__gte = min_difficulty_score,
|
||||
difficulty__lte = max_difficulty_score
|
||||
)
|
||||
|
||||
for skill in skill_list:
|
||||
current_routine.append(skill)
|
||||
current_routine.append(
|
||||
self.suggest_routine(
|
||||
request,
|
||||
total_difficulty_score - skill.difficulty,
|
||||
max_difficulty_score,
|
||||
routine_length - 1,
|
||||
competition,
|
||||
logic,
|
||||
gymnast,
|
||||
skill
|
||||
)
|
||||
)
|
||||
current_routine.pop()
|
||||
# def knapSack(W, wt, val, n):
|
||||
# K = [[0 for x in range(W+1)] for x in range(n+1)]
|
||||
# for i in range(n+1):
|
||||
# for w in range(W+1):
|
||||
# if i==0 or w==0:
|
||||
# K[i][w] = 0
|
||||
# elif wt[i-1] <= w:
|
||||
# K[i][w] = max(val[i-1] + K[i-1][w-wt[i-1]], K[i-1][w])
|
||||
# else:
|
||||
# K[i][w] = K[i-1][w]
|
||||
# return K[n][W]
|
||||
# val = [60, 100, 120]
|
||||
# wt = [10, 20, 30]
|
||||
# W = 50
|
||||
# n = len(val)
|
||||
# print(knapSack(W, wt, val, n))
|
|
@ -356,14 +356,33 @@ def __construct_routine(skill_list, routine):
|
|||
# __construct_routine(skill_list, routine)
|
||||
|
||||
|
||||
def suggest_routine(request, difficulty_score, routine_length, max_difficulty_score = None, competition = True, logic = True, gymnast = None, last_jump = None):
|
||||
""" Propose des séries ayant un score de difficulté donné en paramètre.
|
||||
def suggest_routine(
|
||||
request,
|
||||
routine_length,
|
||||
total_difficulty_score = None,
|
||||
competition = True,
|
||||
logic = True,
|
||||
gymnast = None,
|
||||
last_jump = None
|
||||
):
|
||||
""" Construit et propose des séries.
|
||||
|
||||
Args:
|
||||
routine_length (int): nombre de sauts que doit contenir la série.
|
||||
total_difficulty_score (int): score de difficulté total souhaité de la série.
|
||||
competition (bool): indique si la série doit pouvoir être utilisée en compétition.
|
||||
logic (bool): indique si la série doit suivre certaines règles de logique (sportive).
|
||||
gymnast (gymnast): gymnaste.
|
||||
last_jump (skill): dernier saut sélectionné pour la série.
|
||||
|
||||
Returns:
|
||||
??? (list): liste des séries correspondantes aux criètres.
|
||||
"""
|
||||
|
||||
current_routine = []
|
||||
|
||||
if last_jump:
|
||||
skill_list = Skill.objects.filter(departure = last_jump.landing, difficulty__lte = difficulty_score)
|
||||
skill_list = Skill.objects.filter(departure = last_jump.landing, difficulty__lte = total_difficulty_score)
|
||||
if logic and last_jump.landing == "Debout":
|
||||
skill_list = skill_list.exclude(rotationType = last_jump.rotationType)
|
||||
else:
|
||||
|
@ -372,15 +391,15 @@ def suggest_routine(request, difficulty_score, routine_length, max_difficulty_sc
|
|||
if competition:
|
||||
skill_list = skill_list.filter(is_competitive = True)
|
||||
|
||||
if logic and max_difficulty_score:
|
||||
min_difficulty_score = math.ceil(max(0, ((difficulty_score / 10) - 5)))
|
||||
if logic and total_difficulty_score:
|
||||
min_difficulty_score = math.ceil(max(0, ((total_difficulty_score / 10) - 5)))
|
||||
|
||||
if difficulty_score <= 6:
|
||||
max_difficulty_score = math.ceil(difficulty_score / 5) + 1
|
||||
elif difficulty_score <= 12:
|
||||
max_difficulty_score = math.ceil(difficulty_score / 10) + 7
|
||||
if total_difficulty_score <= 65:
|
||||
max_difficulty_score = math.ceil(total_difficulty_score / 5) + 1
|
||||
elif total_difficulty_score <= 120:
|
||||
max_difficulty_score = math.ceil(total_difficulty_score / 10) + 7
|
||||
else:
|
||||
max_difficulty_score = math.ceil(difficulty_score / 15) + 11
|
||||
max_difficulty_score = math.ceil(total_difficulty_score / 15) + 11
|
||||
|
||||
skill_list = skill_list.filter(
|
||||
difficulty__gte = min_difficulty_score,
|
||||
|
@ -392,7 +411,8 @@ def suggest_routine(request, difficulty_score, routine_length, max_difficulty_sc
|
|||
current_routine.append(
|
||||
self.suggest_routine(
|
||||
request,
|
||||
difficulty_score - skill.difficulty,
|
||||
total_difficulty_score - skill.difficulty,
|
||||
max_difficulty_score,
|
||||
routine_length - 1,
|
||||
competition,
|
||||
logic,
|
||||
|
@ -417,12 +437,6 @@ def suggest_routine(request, difficulty_score, routine_length, max_difficulty_sc
|
|||
# W = 50
|
||||
# n = len(val)
|
||||
# print(knapSack(W, wt, val, n))
|
||||
# min_difficulty_score = difficulty_score / 10
|
||||
# min_difficulty_score -= (min_difficulty_score / 3)
|
||||
# max_difficulty_score = difficulty_score / 10
|
||||
# max_difficulty_score += (max_difficulty_score / 2)
|
||||
|
||||
# skill_list = Skill.objects.filter(difficulty__gte = min_difficulty_score, difficulty__lte = max_difficulty_score)
|
||||
|
||||
|
||||
@login_required
|
||||
|
|
Loading…
Reference in New Issue