package strategies;
/***
*
* Strategy for Agent {strategy for choosing tasks}
*
* @author Oskar Jarczyk
* @since 1.0
* @version 1.2
*
*/
public class Strategy {
public TaskChoice taskChoice;
public TaskMinMaxChoice taskMinMaxChoice;
public SkillChoice skillChoice;
public Strategy(TaskChoice taskChoice, TaskMinMaxChoice taskMinMaxChoice, SkillChoice skillChoice){
this.taskChoice = taskChoice;
this.taskMinMaxChoice = taskMinMaxChoice;
this.skillChoice = skillChoice;
}
public enum TaskChoice {
/**
* Homofilia - milosc do tego samego - szukamy takiego taska maksymalnie
* podobnego nad ktorym ju� pracowalismy. Jezeli jeszcze nie pracowalismy
* nad zadnym to szukamy pierwszego mozliwie odpowiadajacego naszej
* macierzy umiejetnosci. Wtedy budowanie doswiadczenia bedzie w miare
* odpowiadalo elementom w naszej macierzy. I agent caly czas stara sie
* szukac podobnych taskow.
*/
HOMOPHYLY_EXP_BASED,
/**
* Tutaj przeciwienstwo tego co wyzej, agent stara sie znalezc zupelnie
* inne taski niz te nad ktorym dotychczas pracowal. Jest to strategia
* tworzaca doswiadczenie. Jezeli agent nie pracowal jeszcze nad zadnym taskiem,
* to szuka takiego taska ktory zupelnie nie odpowiada macierzy jego
* umiejetnosci.
*/
HETEROPHYLY_EXP_BASED,
/**
* Social vector - znajdowanie mozliwie najblizszego wektora umiejetnosci.
* Umiejetnosci niesie ze soba dodatkowe informacje - kategoria umiejetnosci
* - np. programowanie niskopoziomowe, frontend, itp. Wiec mimo ze nie posiadamy
* takich umiejetnosci jakie maja taski w puli, to szukamy najblizej pasujacego
* wektora i bierzemy ten task
*/
SOCIAL_VECTOR,
/**
* Losowanie taska z puli dostepnych - tylko pod warunkiem ze ma choc jeden skill
* nad ktorym jest mozliwe pracowanie. Generalnie stosujemy Random, ale mozna
* rowniez uruchomic jakis rozklad normalny.
*/
RANDOM,
/**
* Ta strategia polega na porownywaniu siebie do innych uzytownikow, agent A
* stara sie nasladowac innego mozliwie podobnego do siebie uzytkownika (agent B)
* sprawdza gdzie pracuje agent B, i pracuje nad tym samym. Jezeli podobny do niego
* uzytkownik jeszcze nad niczym nie pracowal, to sprawdza co on potrafi
* najbardziej (to tez nasz skill - agenta A) i pracuje nad takim taskiem
* co kt�ry owego skilla wymaga
*/
COMPARISION,
/**
* TO DO: uzupelnic opis
*/
MACHINE_LEARNED,
/**
* Algorytm segreguje pierw skilly wewnatz kazdego taska (max lub min) pod wzglede zaawansowania,
* nastepnie algorytm segreguje taski wg wartosci max inside skill (lub min inside skill)
*/
ARG_MIN_MAX,
/**
* Celem jest wyb�r najbardziej zaawansowanego taska
* liczymy to w ten sposob - avg(sigma(W/G)) czyli
* srednia arytmetyczna zaawansowania wszystkich skilli
*/
PREFERENTIAL,
/**
*
*/
HOMOPHYLY_CLASSIC,
/**
* In this strategy we take first task top from the sort result of intersection.
* For agent $A_{i}$, let's consider his skills $\{S_{1}^{A_{i}},...,S_{i}^{A_{i}}\}$.
* Algorithm iterates through all available tasks and searches for intersection.
* It means, that if there is such task $T_{i}$ having skills $\{S_{1}^{T_{i}},...,S_{i}^{T_{i}}\}$
* which satisfies $\exists\{S_{j}^{A}\}\cap\{S_{j}^{T}\}$ and $\{S_{j}^{A}\}\cap\{S_{j}^{T}\}$
* is \textsl{not null}, than take this task into consideration and calculate sum of progress.
* If there are no tasks which have a common skill with agent's skills, than agent chooses a random task.
*/
HETEROPHYLY_CLASSIC,
/**
* In this strategy we take first task bottom from the sort result of intersection.
*/
CENTRAL_ASSIGNMENT
}
public enum TaskMinMaxChoice {
ARGMAX_ARGMAX,
ARGMIN_ARGMAX,
ARGMAX_ARGMIN,
ARGMIN_ARGMIN
}
public enum SkillChoice {
/**
* Dla kazdego Sn pracuj rowno po czesci 1/n
* jezeli parametr allowRookie wlaczony, to omijaj intersekcje
* i pracuj nad wszystkim w danym tasku
*/
PROPORTIONAL_TIME_DIVISION,
/**
* Pracuj dla wybranego Sn. Je�eli postepy puste w kazdym ze skilli w tasku
* to wybierz losowy. W przeciwnym razie pracuj tylko nad tym taskiem, ktory
* jest najbardziej zaczety (najmniej mu do zamkniecia)
*/
GREEDY_ASSIGNMENT_BY_TASK,
/**
* Pracuj wylacznie nad tym skillem, w ktory agent ma najwiecej doswiadczenia
*/
CHOICE_OF_AGENT,
/**
* Pracuj zawsze nad losowo wybranym skillem
*/
RANDOM
}
@Override
public String toString(){
return this.taskChoice.name() + "," + this.skillChoice.name();
}
}