From d731d217834e64f7a658c865011ee59decdf65ad Mon Sep 17 00:00:00 2001 From: samuele-brusegan Date: Thu, 14 May 2026 14:36:56 +0200 Subject: [PATCH] Finished Model Logic (no Threads) --- .gitignore | 39 +++++++++ .idea/.gitignore | 10 +++ .idea/encodings.xml | 7 ++ .idea/misc.xml | 15 ++++ .idea/vcs.xml | 6 ++ nbactions.xml | 30 +++++++ pom.xml | 54 ++++++++++++ src/main/java/module-info.java | 4 + src/main/java/org/example/App.java | 24 ++++++ src/main/java/org/example/SystemInfo.java | 13 +++ .../org/example/controller/Controller.java | 4 + .../java/org/example/models/Importer.java | 36 ++++++++ .../java/org/example/models/MainLogic.java | 84 +++++++++++++++++++ src/main/java/org/example/models/Node.java | 51 +++++++++++ src/main/java/org/example/models/Path.java | 67 +++++++++++++++ .../java/org/example/models/PathBuilder.java | 8 ++ src/main/java/org/example/views/MainUI.java | 17 ++++ src/main/resources/punti_interesse.csv | 15 ++++ src/main/resources/punti_interesse_b.csv | 21 +++++ 19 files changed, 505 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/encodings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 nbactions.xml create mode 100644 pom.xml create mode 100644 src/main/java/module-info.java create mode 100644 src/main/java/org/example/App.java create mode 100644 src/main/java/org/example/SystemInfo.java create mode 100644 src/main/java/org/example/controller/Controller.java create mode 100644 src/main/java/org/example/models/Importer.java create mode 100644 src/main/java/org/example/models/MainLogic.java create mode 100644 src/main/java/org/example/models/Node.java create mode 100644 src/main/java/org/example/models/Path.java create mode 100644 src/main/java/org/example/models/PathBuilder.java create mode 100644 src/main/java/org/example/views/MainUI.java create mode 100644 src/main/resources/punti_interesse.csv create mode 100644 src/main/resources/punti_interesse_b.csv diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..480bdf5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ +.kotlin + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..30cf57e --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..d0530a3 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/nbactions.xml b/nbactions.xml new file mode 100644 index 0000000..00d47f1 --- /dev/null +++ b/nbactions.xml @@ -0,0 +1,30 @@ + + + + run + + jar + + + clean + javafx:run + + + + jlink + + clean + javafx:jlink + + + + debug + + clean + javafx:run@debug + + + true + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..4e3d468 --- /dev/null +++ b/pom.xml @@ -0,0 +1,54 @@ + + 4.0.0 + org.example + brusegan_samuele_VETF04000T_secondaprova + 1.0-SNAPSHOT + + UTF-8 + 25 + 25 + + + + org.openjfx + javafx-controls + 21.0.2 + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + 25 + + + + org.openjfx + javafx-maven-plugin + 0.0.4 + + + default-cli + + org.example.App + + + + debug + + + + + + org.example.App + + + + + + + diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java new file mode 100644 index 0000000..158098b --- /dev/null +++ b/src/main/java/module-info.java @@ -0,0 +1,4 @@ +module org.example { + requires javafx.controls; + exports org.example; +} \ No newline at end of file diff --git a/src/main/java/org/example/App.java b/src/main/java/org/example/App.java new file mode 100644 index 0000000..617f0ee --- /dev/null +++ b/src/main/java/org/example/App.java @@ -0,0 +1,24 @@ +package org.example; + +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.control.Label; +import javafx.scene.layout.StackPane; +import javafx.stage.Stage; +import org.example.views.MainUI; + +/** + * JavaFX App + */ +public class App extends Application { + + @Override + public void start(Stage stage) { + MainUI.start(stage); + } + + public static void main(String[] args) { + launch(); + } + +} \ No newline at end of file diff --git a/src/main/java/org/example/SystemInfo.java b/src/main/java/org/example/SystemInfo.java new file mode 100644 index 0000000..69a6275 --- /dev/null +++ b/src/main/java/org/example/SystemInfo.java @@ -0,0 +1,13 @@ +package org.example; + +public class SystemInfo { + + public static String javaVersion() { + return System.getProperty("java.version"); + } + + public static String javafxVersion() { + return System.getProperty("javafx.version"); + } + +} \ No newline at end of file diff --git a/src/main/java/org/example/controller/Controller.java b/src/main/java/org/example/controller/Controller.java new file mode 100644 index 0000000..6f1952c --- /dev/null +++ b/src/main/java/org/example/controller/Controller.java @@ -0,0 +1,4 @@ +package org.example.controller; + +public class Controller { +} diff --git a/src/main/java/org/example/models/Importer.java b/src/main/java/org/example/models/Importer.java new file mode 100644 index 0000000..3aa8fc6 --- /dev/null +++ b/src/main/java/org/example/models/Importer.java @@ -0,0 +1,36 @@ +package org.example.models; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + +public class Importer { + + private static final String FILENAME_CSV_DATA = "./src/main/resources/punti_interesse.csv"; + + public static ArrayList importData() { + + ArrayList nl = new ArrayList<>(); + + try (BufferedReader br = new BufferedReader(new FileReader(FILENAME_CSV_DATA))) { + + String line; + + while ((line = br.readLine()) != null) { + String[] data = line.split(","); + + nl.add( + new Node( + data[0], + Double.parseDouble(data[1]), + Integer.parseInt(data[2]) + ) + ); + } + + } catch (IOException e) { + throw new RuntimeException(e); + } + return nl; + } +} diff --git a/src/main/java/org/example/models/MainLogic.java b/src/main/java/org/example/models/MainLogic.java new file mode 100644 index 0000000..e26b0db --- /dev/null +++ b/src/main/java/org/example/models/MainLogic.java @@ -0,0 +1,84 @@ +package org.example.models; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class MainLogic { + + private static final HashMap, List> cache = new HashMap<>(); + public static final double MULTIPLIER = 1.5; + public static final int K = 4; + public static double LENGHT; + + public static void main(String[] args) { + + ArrayList nl = importData(); + Node moncalieri = nl.getLast(); + nl.remove(moncalieri); + + LENGHT = nl.size(); + + ArrayList paths = getPaths(nl); + + for (Path path : paths) path.add(moncalieri); + + Path bestPath = null; + double bestPrestigio = Double.NEGATIVE_INFINITY; + for (Path p : paths) { + double prestigio = p.getPrestigio(); + if (bestPrestigio < prestigio) { + bestPrestigio = prestigio; + bestPath = p; + } + } + System.out.println(bestPath); + } + + public static ArrayList importData() { + return Importer.importData(); + } + + public static ArrayList getPaths(List nl) { + // Dynamic Programming: la chiave è l'insieme dei nodi rimanenti + // (l'ordine non conta, ciò che conta è quali nodi possiamo ancora usare). + Set key = new HashSet<>(nl); + if (cache.containsKey(key)) { + // Restituisco copie difensive: i chiamanti mutano i Path con addAsFirstNode. + ArrayList copy = new ArrayList<>(); + for (Path p : cache.get(key)) copy.add(new Path(p)); + return copy; + } + + if (nl.size() == LENGHT - K - 1) { + ArrayList paths = new ArrayList<>(); + paths.add(new Path()); // path vuoto: i K nodi verranno aggiunti dai livelli superiori + return paths; + } + + ArrayList result = new ArrayList<>(); + for (Node n : nl) { + ArrayList bak = new ArrayList<>(nl); + bak.remove(n); + + ArrayList subPaths = getPaths(bak); + + for (Path p : subPaths) p.addAsFirstNode(n); + result.addAll(subPaths); + } + + // Salvo in cache copie immutate, così le mutazioni dei chiamanti non corrompono il cache. + ArrayList cached = new ArrayList<>(); + for (Path p : result) cached.add(new Path(p)); + cache.put(key, cached); + + return result; + } + + public static boolean needBonus(Node s, Node e){ + return s != null && s.getType() != e.getType(); + } + +} diff --git a/src/main/java/org/example/models/Node.java b/src/main/java/org/example/models/Node.java new file mode 100644 index 0000000..a75e4db --- /dev/null +++ b/src/main/java/org/example/models/Node.java @@ -0,0 +1,51 @@ +package org.example.models; + +import java.util.Objects; + +public class Node { + private String name; + private double prestigio; + private boolean type; + + public Node(String name, double prestigio, boolean type) { + this.name = name; + this.prestigio = prestigio; + this.type = type; + } + public Node(String name, double prestigio, int type) { + this.name = name; + this.prestigio = prestigio; + this.type = ( type == 1 ); + } + + public boolean getType() { + return type; + } + + public double getPrestigio() { + return prestigio; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Node n)) return false; + return Double.compare(prestigio, n.prestigio) == 0 + && type == n.type + && Objects.equals(name, n.name); + } + + @Override + public int hashCode() { + return Objects.hash(name, prestigio, type); + } + + @Override + public String toString() { + return "Node[" + + name + + ", " + prestigio + + ", " + type + + ']'; + } +} diff --git a/src/main/java/org/example/models/Path.java b/src/main/java/org/example/models/Path.java new file mode 100644 index 0000000..7731803 --- /dev/null +++ b/src/main/java/org/example/models/Path.java @@ -0,0 +1,67 @@ +package org.example.models; + +import java.util.ArrayList; + +public class Path { + private ArrayList nodes; + private double prestigioTotale; + + public Path() { + this.nodes = new ArrayList<>(); + this.prestigioTotale = 0; + } + + public Path(Path other) { + this.nodes = new ArrayList<>(other.nodes); + this.prestigioTotale = other.prestigioTotale; + } + + public void add(Node n) { + if (nodes.isEmpty()) { + prestigioTotale = n.getPrestigio(); + nodes.add(n); + return; + } + Node p = nodes.getLast(); + prestigioTotale += calculateDeltaPrestigio(p, n); + nodes.add(n); + } + + private double calculateDeltaPrestigio(Node p, Node n) { + return (MainLogic.needBonus(p,n)) ? + n.getPrestigio() * MainLogic.MULTIPLIER : + n.getPrestigio(); + } + + public void addAsFirstNode(Node n) { + if (nodes.isEmpty()) { + prestigioTotale = n.getPrestigio(); + nodes.add(n); + return; + } + nodes.addFirst(n); + + updatePrestigio(); + } + + private void updatePrestigio() { + Node p = null; + prestigioTotale = 0; + for (Node n : nodes) { + prestigioTotale += calculateDeltaPrestigio(p, n); + p = n; + } + } + + @Override + public String toString() { + return "Path{" + + "nodes=" + nodes + + ", prestigioTotale=" + prestigioTotale + + '}'; + } + + public double getPrestigio() { + return prestigioTotale; + } +} diff --git a/src/main/java/org/example/models/PathBuilder.java b/src/main/java/org/example/models/PathBuilder.java new file mode 100644 index 0000000..0202b44 --- /dev/null +++ b/src/main/java/org/example/models/PathBuilder.java @@ -0,0 +1,8 @@ +package org.example.models; + +public class PathBuilder implements Runnable { + @Override + public void run() { + + } +} diff --git a/src/main/java/org/example/views/MainUI.java b/src/main/java/org/example/views/MainUI.java new file mode 100644 index 0000000..07eab06 --- /dev/null +++ b/src/main/java/org/example/views/MainUI.java @@ -0,0 +1,17 @@ +package org.example.views; + +import javafx.scene.Scene; +import javafx.scene.control.Label; +import javafx.scene.layout.StackPane; +import javafx.stage.Stage; + +public class MainUI { + public static void start(Stage stage) { + + var label = new Label("Hello, JavaFX " + "javafxVersion" + ", running on Java " + "javaVersion" + "."); + var scene = new Scene(new StackPane(label), 640, 480); + stage.setScene(scene); + stage.show(); + + } +} diff --git a/src/main/resources/punti_interesse.csv b/src/main/resources/punti_interesse.csv new file mode 100644 index 0000000..e01d443 --- /dev/null +++ b/src/main/resources/punti_interesse.csv @@ -0,0 +1,15 @@ +Palazzo Reale di Torino,55,0 +Belvedere di Villa d'Este,42,1 +Reggia di Caserta,54,0 +Piazzale Michelangelo,50,1 +Palazzo Pitti,53,0 +Belvedere di Castelmola,38,1 +Castello di Miramare,48,0 +Rocca di Calascio,45,1 +Palazzo Ducale di Urbino,50,0 +Belvedere di San Vigilio,33,1 +Castello di Racconigi,46,0 +Belvedere della Silvana,28,1 +Palazzo Madama,49,0 +Punto Panoramico del Monte Baldo,40,1 +Castello di Moncalieri,95,1 \ No newline at end of file diff --git a/src/main/resources/punti_interesse_b.csv b/src/main/resources/punti_interesse_b.csv new file mode 100644 index 0000000..4b206fc --- /dev/null +++ b/src/main/resources/punti_interesse_b.csv @@ -0,0 +1,21 @@ +Palazzo Reale di Torino,55,0 +Belvedere di Villa d'Este,42,1 +Reggia di Caserta,54,0 +Piazzale Michelangelo,50,1 +Palazzo Pitti,53,0 +Belvedere di Castelmola,38,1 +Castello di Miramare,48,0 +Rocca di Calascio,45,1 +Palazzo dei Normanni,52,0 +Belvedere di Lanzo d'Intelvi,35,1 +Villa Reale di Monza,47,0 +Terrazza del Pincio,49,1 +Castello del Buonconsiglio,44,0 +Belvedere di Ravello,51,1 +Palazzo Ducale di Urbino,50,0 +Belvedere di San Vigilio,33,1 +Castello di Racconigi,46,0 +Belvedere della Silvana,28,1 +Palazzo Madama,49,0 +Punto Panoramico del Monte Baldo,40,1 +Castello di Moncalieri,95,1 \ No newline at end of file