diff --git a/Back/pom.xml b/Back/pom.xml index 82b8c8d..6431a08 100644 --- a/Back/pom.xml +++ b/Back/pom.xml @@ -33,6 +33,10 @@ springfox-swagger2 2.9.2 + + net.sourceforge.jFuzzyLogic + jFuzzyLogic + io.springfox diff --git a/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/Prediction.fcl b/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/Prediction.fcl new file mode 100644 index 0000000..25666f7 --- /dev/null +++ b/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/Prediction.fcl @@ -0,0 +1,171 @@ +FUNCTION_BLOCK prediction // Definicja bloku (moze byc wiecej blokow w pliku) + +VAR_INPUT // Definiuje zmienne wejsciowe + goalkeeperForm1 : REAL; + formationAgainstForm1 : REAL; + shootsOnTargetAverage1 : REAL; + possessionAverage1 : REAL; + goalsAverage1 : REAL; + goalsLostAverage1 : REAL; + redCardsAverage1 : REAL; + penaltyAreaEntriesAverage1 : REAL; + penaltiesAverage1 : REAL; + lastMatchesResultAverage1 : REAL; + lastMatchesResultBetweenAverage1 : REAL; + + goalkeeperForm2 : REAL; + formationAgainstForm2 : REAL; + shootsOnTargetAverage2 : REAL; + possessionAverage2 : REAL; + goalsAverage2 : REAL; + goalsLostAverage2 : REAL; + redCardsAverage2 : REAL; + penaltyAreaEntriesAverage2 : REAL; + penaltiesAverage2 : REAL; + lastMatchesResultAverage2 : REAL; + lastMatchesResultBetweenAverage2 : REAL; +END_VAR + +VAR_OUTPUT // Definiuje zmienne wyjsciowe + prediction : REAL; +END_VAR + +FUZZIFY goalkeeperForm1 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY +FUZZIFY goalkeeperForm2 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY + +FUZZIFY formationAgainstForm1 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY +FUZZIFY formationAgainstForm2 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY + +FUZZIFY shootsOnTargetAverage1 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY +FUZZIFY shootsOnTargetAverage2 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY + +FUZZIFY possessionAverage1 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY +FUZZIFY possessionAverage2 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY + +FUZZIFY goalsAverage1 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY +FUZZIFY goalsAverage2 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY + +FUZZIFY goalsLostAverage1 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY +FUZZIFY goalsLostAverage2 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY + +FUZZIFY redCardsAverage1 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY +FUZZIFY redCardsAverage2 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY + +FUZZIFY penaltyAreaEntriesAverage1 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY +FUZZIFY penaltyAreaEntriesAverage2 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY + +FUZZIFY penaltiesAverage1 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY +FUZZIFY penaltiesAverage2 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY + +FUZZIFY lastMatchesResultAverage1 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY +FUZZIFY lastMatchesResultAverage2 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY + +FUZZIFY lastMatchesResultBetweenAverage1 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY +FUZZIFY lastMatchesResultBetweenAverage2 + TERM zla := (0, 1) (4, 0) ; + TERM dobra := (1, 0) (4,1) (6,1) (9,0); + TERM znakomita := (6, 0) (9, 1); +END_FUZZIFY + +DEFUZZIFY prediction // Zmienna wyjsciowa 'prediction' : {'skromny', 'sredni', 'hojny' } + TERM skromny := (0,0) (5,1) (11,0); + TERM sredni := (9,0) (15,1) (21,0); + TERM hojny := (19,0) (25,1) (30,0); + METHOD : COG; // Metoda defuzyfikacji - 'Center Of Gravity' - 'Sreodka ciezkosci' + DEFAULT := 0; +END_DEFUZZIFY + +RULEBLOCK No1 + AND : MIN; // Uzycie 'min' jako 'and' (implikuje uzycie 'max' jako 'or' dla zapewnienia praw DeMorgan'a) + ACT : MIN; // Uzycie 'min' jako metody aktywacji + ACCU : MAX; // Metoda agregacji - 'max' + + RULE 1 : IF goalkeeperForm1 IS zla OR goalkeeperForm2 is zla THEN prediction IS skromny; +END_RULEBLOCK + +END_FUNCTION_BLOCK + diff --git a/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/Prediction.java b/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/Prediction.java new file mode 100644 index 0000000..bd15fca --- /dev/null +++ b/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/Prediction.java @@ -0,0 +1,78 @@ +package com.resultprediction.polishekstraklasa.Predictions; + +import lombok.Getter; +import lombok.Setter; +import net.sourceforge.jFuzzyLogic.FIS; +import net.sourceforge.jFuzzyLogic.FunctionBlock; + +import net.sourceforge.jFuzzyLogic.plot.JFuzzyChart; + +import net.sourceforge.jFuzzyLogic.rule.Variable; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + + +public class Prediction { + + @Getter + @Setter + private static List variables = new ArrayList<>(); + + public static void addToList(com.resultprediction.polishekstraklasa.Predictions.Variable variable){ + variables.add(variable); + } + + + public static void make() { + // Load from 'FCL' file + String fileName = "C:\\Users\\Adrian\\Desktop\\Systemy rozmyte\\Back\\src\\main\\java\\com\\resultprediction\\polishekstraklasa\\Predictions\\Prediction.fcl"; + FIS fis = FIS.load(fileName, true); + if( fis == null ) { + System.err.println("Nie moge zaladowc pliku: '" + fileName + "'"); + return; + } + + // Pokazuje reguly + FunctionBlock functionBlock = fis.getFunctionBlock(null); + JFuzzyChart.get().chart(functionBlock); + + // Ustawia wejscia + for (com.resultprediction.polishekstraklasa.Predictions.Variable variable : variables){ + fis.setVariable(variable.getName(), variable.getValue()); + } + /* + fis.setVariable("obsluga", 3); + fis.setVariable("jedzenie", 8);*/ + + // Wylicza zbiory rozmyte + fis.evaluate(); + + // Ustawia wyjscia + Variable prediction = functionBlock.getVariable("prediction"); + + // Pokazuje wykres zmiennych wyjsciowych + + JFuzzyChart.get().chart(prediction, prediction.getDefuzzifier(), true); + + // Drukuje reguly + System.out.println(fis); + System.out.println("Prediction:" + fis.getVariable("prediction").getValue()); + Process proc = null; + try { + proc = Runtime.getRuntime().exec("javac -cp jFuzzyLogic.jar Prediction.java"); + } catch (IOException e) { + e.printStackTrace(); + } + try { + proc = Runtime.getRuntime().exec("java -cp jFuzzyLogic.jar;. Prediction"); + } catch (IOException e) { + e.printStackTrace(); + } + InputStream in = proc.getInputStream(); + InputStream err = proc.getErrorStream(); + variables.clear(); + } +} \ No newline at end of file diff --git a/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/PredictionsApplication.java b/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/PredictionsApplication.java index 18b8124..23176bd 100644 --- a/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/PredictionsApplication.java +++ b/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/PredictionsApplication.java @@ -4,6 +4,8 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @@ -19,7 +21,12 @@ import java.util.Map; public class PredictionsApplication { public static void main(String[] args) { - SpringApplication.run(PredictionsApplication.class, args); + SpringApplicationBuilder builder = new SpringApplicationBuilder(PredictionsApplication.class); + //SpringApplication.run(PredictionsApplication.class, args); + + builder.headless(false); + + ConfigurableApplicationContext context = builder.run(args); } } diff --git a/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/Variable.java b/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/Variable.java new file mode 100644 index 0000000..1a2d056 --- /dev/null +++ b/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/Variable.java @@ -0,0 +1,21 @@ +package com.resultprediction.polishekstraklasa.Predictions; + + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@AllArgsConstructor +@NoArgsConstructor +public class Variable { + + @Getter + @Setter + private String name; + + + @Getter + @Setter + private Integer value; +} diff --git a/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/jFuzzyLogic.jar b/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/jFuzzyLogic.jar new file mode 100644 index 0000000..c649983 Binary files /dev/null and b/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/jFuzzyLogic.jar differ diff --git a/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/model/match/Match.java b/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/model/match/Match.java index 8c770e8..56ca8c7 100644 --- a/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/model/match/Match.java +++ b/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/model/match/Match.java @@ -6,7 +6,6 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; import java.util.Date; diff --git a/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/model/match/PredictService.java b/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/model/match/PredictService.java index 6407fe3..d8f6abb 100644 --- a/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/model/match/PredictService.java +++ b/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/model/match/PredictService.java @@ -1,9 +1,12 @@ package com.resultprediction.polishekstraklasa.Predictions.model.match; +import com.resultprediction.polishekstraklasa.Predictions.Prediction; +import com.resultprediction.polishekstraklasa.Predictions.Variable; import com.resultprediction.polishekstraklasa.Predictions.model.team.Team; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -44,10 +47,10 @@ public class PredictService { //wlasnosci - private int homeTeamBoost = 20; // w punktach [0,100] + /*private int homeTeamBoost = 20; // w punktach [0,100] private int downwardZoneDrawBoost = 10; // w punktach [0,100] - +*/ //private int winningStreakChanceForLoseValue = 1; @@ -72,6 +75,7 @@ public class PredictService { } else { goalkeeperForm1 = calculateGoalkeeperForm(previousMatchesTeam1.subList(0, howManyPastForGoalkeeperForm - 1), team1); } + Prediction.addToList(new Variable("goalkeeperForm1", goalkeeperForm1)); System.out.println("Team1 Goalkeeper form = " + goalkeeperForm1); List formationMatchesTeam1 = matchRepository.findTop10ByTeamsMatchStatistics1TeamAndSeasonAndDateBeforeAndTeamsMatchStatistics2FormationOrTeamsMatchStatistics2TeamAndSeasonAndDateBeforeAndTeamsMatchStatistics1FormationOrderByDateDesc(team1, match.getSeason(), match.getDate(), match.getTeamsMatchStatistics2().getFormation(), team1, match.getSeason(), match.getDate(), match.getTeamsMatchStatistics2().getFormation()); @@ -81,14 +85,15 @@ public class PredictService { } else { formationAgainstForm1 = calculateFormationForm(formationMatchesTeam1.subList(0, howManyPastForFormationAgainstForm - 1), team1); } + Prediction.addToList(new Variable("formationAgainstForm1", formationAgainstForm1)); System.out.println("Team1 Formation against form = " + formationAgainstForm1); List teamFormMatches1 = matchRepository.findTop10ByTeamsMatchStatistics1TeamAndSeasonAndDateBeforeOrTeamsMatchStatistics2TeamAndSeasonAndDateBeforeOrderByDateDesc(team1, match.getSeason(), match.getDate(), team1, match.getSeason(), match.getDate()); int teamForm1; if (howManyLastMatchesResult > teamFormMatches1.size()){ - teamForm1 = calculateTeamForm(teamFormMatches1, team1, match.getTeamsMatchStatistics2().getTeam(), match.getDate()); + teamForm1 = calculateTeamForm(teamFormMatches1, team1, match.getTeamsMatchStatistics2().getTeam(), match.getDate(),"1"); } else { - teamForm1 = calculateTeamForm(teamFormMatches1.subList(0, howManyLastMatchesResult - 1), team1, match.getTeamsMatchStatistics2().getTeam(), match.getDate()); + teamForm1 = calculateTeamForm(teamFormMatches1.subList(0, howManyLastMatchesResult - 1), team1, match.getTeamsMatchStatistics2().getTeam(), match.getDate(),"1"); } System.out.println("Team1 Form = " + teamForm1); @@ -105,6 +110,7 @@ public class PredictService { } else { goalkeeperForm2 = calculateGoalkeeperForm(previousMatchesTeam2.subList(0, howManyPastForGoalkeeperForm - 1), team1); } + Prediction.addToList(new Variable("goalkeeperForm2", goalkeeperForm2)); System.out.println("Team2 Goalkeeper form = " + goalkeeperForm2); List formationMatchesTeam2 = matchRepository.findTop10ByTeamsMatchStatistics1TeamAndSeasonAndDateBeforeAndTeamsMatchStatistics2FormationOrTeamsMatchStatistics2TeamAndSeasonAndDateBeforeAndTeamsMatchStatistics1FormationOrderByDateDesc(team2, match.getSeason(), match.getDate(), match.getTeamsMatchStatistics1().getFormation(), team2, match.getSeason(), match.getDate(), match.getTeamsMatchStatistics1().getFormation()); @@ -114,27 +120,32 @@ public class PredictService { } else { formationAgainstForm2 = calculateFormationForm(formationMatchesTeam2.subList(0, howManyPastForFormationAgainstForm - 1), team2); } + Prediction.addToList(new Variable("formationAgainstForm2", formationAgainstForm2)); System.out.println("Team2 Formation against form = " + formationAgainstForm2); List teamFormMatches2 = matchRepository.findTop10ByTeamsMatchStatistics1TeamAndSeasonAndDateBeforeOrTeamsMatchStatistics2TeamAndSeasonAndDateBeforeOrderByDateDesc(team2, match.getSeason(), match.getDate(), team2, match.getSeason(), match.getDate()); int teamForm2; if (howManyLastMatchesResult > teamFormMatches2.size()){ - teamForm2 = calculateTeamForm(teamFormMatches2, team2, team1, match.getDate()); + teamForm2 = calculateTeamForm(teamFormMatches2, team2, team1, match.getDate(),"2"); } else { - teamForm2 = calculateTeamForm(teamFormMatches2.subList(0, howManyLastMatchesResult - 1), team2, team1, match.getDate()); + teamForm2 = calculateTeamForm(teamFormMatches2.subList(0, howManyLastMatchesResult - 1), team2, team1, match.getDate(),"2"); } System.out.println("Team2 Form = " + teamForm2); int calculatedTeam2Form = ((goalkeeperForm2 * gooalkeeperFormValue) + (formationAgainstForm2 * formationFormValue) + (teamForm2 * teamFormValue)) / (gooalkeeperFormValue + formationFormValue + teamFormValue); System.out.println("Team2 Calculated Form = " + calculatedTeam2Form); System.out.println(match.getTeamsMatchStatistics1().getGoals() + ":" + match.getTeamsMatchStatistics1().getGoals_lost()); + + + Prediction.make(); + //int winner = whoWillWin(calculatedTeam1Form, calculatedTeam2Form); - LeagueTable leagueTable = new LeagueTable(matchRepository.findAllByDateBeforeAndSeason(match.getDate(), match.getSeason())); + /* LeagueTable leagueTable = new LeagueTable(matchRepository.findAllByDateBeforeAndSeason(match.getDate(), match.getSeason())); System.out.println("###############################################################"); for (LeagueTeamScore leagueTeamScore : leagueTable.getLeagueTeamScores()){ System.out.println(leagueTeamScore.getScore() + " " + leagueTeamScore.getTeam().getName()); } - System.out.println("###############################################################"); + System.out.println("###############################################################");*/ } return "done"; @@ -150,7 +161,7 @@ public class PredictService { }*/ - private int calculateTeamForm(List matches, Team team, Team enemy, Date actualMatchDate) { + private int calculateTeamForm(List matches, Team team, Team enemy, Date actualMatchDate, String nameForFuzzy) { if (matches.size() == 0) return 100; @@ -239,9 +250,15 @@ public class PredictService { lastMatchesResultBetweenAverage = lastMatchesResultBetweenAverage / matchesBetween.size(); else lastMatchesResultBetweenAverage = 0; - - - + Prediction.addToList(new Variable("shootsOnTargetAverage" + nameForFuzzy, shootsOnTargetAverage)); + Prediction.addToList(new Variable("possessionAverage" + nameForFuzzy, possessionAverage)); + Prediction.addToList(new Variable("goalsAverage" + nameForFuzzy, goalsAverage)); + Prediction.addToList(new Variable("goalsLostAverage" + nameForFuzzy, goalsLostAverage)); + Prediction.addToList(new Variable("redCardsAverage" + nameForFuzzy, redCardsAverage)); + Prediction.addToList(new Variable("penaltyAreaEntriesAverage" + nameForFuzzy, penaltyAreaEntriesAverage)); + Prediction.addToList(new Variable("penaltiesAverage" + nameForFuzzy, penaltiesAverage)); + Prediction.addToList(new Variable("lastMatchesResultAverage" + nameForFuzzy, lastMatchesResultAverage)); + Prediction.addToList(new Variable("lastMatchesResultBetweenAverage" + nameForFuzzy, lastMatchesResultBetweenAverage)); return calculateTeamStatsByAverages(shootsOnTargetAverage, possessionAverage, goalsAverage, goalsLostAverage, redCardsAverage, penaltyAreaEntriesAverage, penaltiesAverage, lastMatchesResultAverage, lastMatchesResultBetweenAverage, matches.size(), lastMatchesBetweenSize); } diff --git a/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/run.txt b/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/run.txt new file mode 100644 index 0000000..6b70661 --- /dev/null +++ b/Back/src/main/java/com/resultprediction/polishekstraklasa/Predictions/run.txt @@ -0,0 +1,8 @@ +Kompilacja w laboratoriach: +javac -cp jFuzzyLogic.jar prediction.java + +Uruchomienie Windows +java -cp jFuzzyLogic.jar;. prediction + +Uruchomienie Linux +java -cp jFuzzyLogic.jar:. prediction \ No newline at end of file diff --git a/Back/src/main/resources/application.properties b/Back/src/main/resources/application.properties index f2b00a6..2ef9e51 100644 --- a/Back/src/main/resources/application.properties +++ b/Back/src/main/resources/application.properties @@ -1,4 +1,4 @@ spring.jpa.hibernate.ddl-auto=update -spring.datasource.url=jdbc:mysql://localhost:3307/ekstraklasa +spring.datasource.url=jdbc:mysql://localhost:3306/ekstraklasa spring.datasource.username=ekstra spring.datasource.password=YnBDC0hqqhKaxt94