Après cet élagage, et dans chaque jeu successivement, le moteur de simulation ordonne les activités du jeu sur la base d'une fonction d'ordre.
Si une telle fonction d'ordre a été attachée au bloc activités-ressources, elle est exploitée (c'est alors le corps de la méthode LocalCandidateActivitySetSortMethod).
Sinon, et si une a été attachée au système décidionnel (Manager), elle est exploitée (c'est alors le corps de la méthode CandidateActivitySetSortMethod).
Sinon encore, c'est une fonction prédéfinie qui est exploitée. Celle-ci range les activités par degrés décroissants (de 0 à 99) de priorité d'allocation (descripteur AllocationPriorityDegree), puis repouse en fin de liste, en conservant leur ordre, les activités dont une des spécifications repose sur l'opérateur MAX.
(A B C) (D E F) (A B F)avec dans le même ordre, les priorités suivantes pour les opérations :
10 40 30 60 30 70 10 40 70alors, l'ensemble de jeux renvoyé sera :
(A B C) (A B F)
Voici un exemple de mise en oeuvre de ce service :
BasicEntity* monManager_bestActivitySetSelector_Body(EntityMethod* pM) {
Entity* pManager = pM->DescribedEntity();
Entity* canditateSetsDisjunction
= pM->GetEntityArgValue(ACTIVITY_SETS_ARGUMENT);
BasicEntity* result = NULL;
InstructionSetDisjunction* currentResult = NULL;
regle 1 : priorite au jeu qui contient l'activite de plus forte priorite
-----------------------------------------------------------------------
Entity* pPS = pManager->GetSuperEntity();
OperatingSystem* pOS = (OperatingSystem*)pPS->GetComponent(OPERATING_SYSTEM);
InstructionSetDisjunction* pISD
= (InstructionSetDisjunction*)canditateSetsDisjunction;
currentResult = pOS->SelectAlternativesOnMaxOperationPriority(pISD);
regle 2 :
---------
...
currentResult = ...
on tire aleatoirement un jeu parmi les restants ex-aequo
---------------------------------------------------------
int nbSets = currentResult->GetNumberOfElements();
int randomIndex = RandomInteger(nbSets);
result = currentResult->GetElement(randomIndex);
return result;
};