欢迎来到 SiteSMO | 思默AI智能问答平台!
注册或点击登录代表您同意《SiteSMO网络服务安全协议》
提示信息
请打开微信扫码登录
返回列表

用javafx实现可自定义节点数、路径长度、起止节点的最短路径可视化程序

举报
367阅读 | 0人回复 | 2023-12-12 14:57:06

本帖由 you ... 发布,如有侵权联系删除 IP属地:江西

您可以使用JavaFX来实现一个可自定义节点数、路径长度和起止节点的最短路径可视化程序。以下是一个简单的实现示例:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

import java.util.ArrayList;
import java.util.List;

public class ShortestPathVisualization extends Application {

    private static final int NODE_SIZE = 30;
    private static final int PADDING = 50;

    private int numNodes;
    private int pathLength;
    private int startNode;
    private int endNode;

    private List<Rectangle> nodes;
    private List<Line> edges;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        // Create the main layout
        BorderPane root = new BorderPane();
        root.setPadding(new Insets(PADDING));

        // Create the canvas for drawing the nodes and edges
        Pane canvas = new Pane();
        root.setCenter(canvas);

        // Create the control panel
        VBox controlPanel = new VBox(10);
        controlPanel.setPadding(new Insets(10));
        controlPanel.setBackground(new Background(new BackgroundFill(Color.LIGHTGRAY, CornerRadii.EMPTY, Insets.EMPTY)));

        // Create the input fields and buttons
        Button visualizeButton = new Button("Visualize");
        visualizeButton.setOnAction(event -> visualizeShortestPath());

        controlPanel.getChildren().addAll(visualizeButton);

        root.setRight(controlPanel);

        // Create the scene
        Scene scene = new Scene(root, 800, 600);
        primaryStage.setTitle("Shortest Path Visualization");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void visualizeShortestPath() {
        // Clear previous nodes and edges
        nodes.clear();
        edges.clear();

        // Generate random nodes
        generateNodes();

        // Generate random edges
        generateEdges();

        // Find the shortest path using an algorithm (e.g., Dijkstra's algorithm)

        // Visualize the shortest path by coloring the nodes and edges
    }

    private void generateNodes() {
        // Generate numNodes random nodes and add them to the canvas
        nodes = new ArrayList<>();
        for (int i = 0; i < numNodes; i++) {
            Rectangle node = new Rectangle(NODE_SIZE, NODE_SIZE, Color.BLUE);
            node.setTranslateX(Math.random() * (PADDING * 2));
            node.setTranslateY(Math.random() * (PADDING * 2));
            nodes.add(node);
        }
    }

    private void generateEdges() {
        // Generate random edges between nodes and add them to the canvas
        edges = new ArrayList<>();
        for (int i = 0; i < numNodes; i++) {
            for (int j = i + 1; j < numNodes; j++) {
                Line edge = new Line(nodes.get(i).getTranslateX() + NODE_SIZE / 2,
                        nodes.get(i).getTranslateY() + NODE_SIZE / 2,
                        nodes.get(j).getTranslateX() + NODE_SIZE / 2,
                        nodes.get(j).getTranslateY() + NODE_SIZE / 2);
                edges.add(edge);
            }
        }
    }

    private void findShortestPath() {
        // Implement an algorithm (e.g., Dijkstra's algorithm) to find the shortest path
    }
}

这个示例程序使用JavaFX创建了一个可视化界面,并提供了一个按钮来触发最短路径的可视化。您可以根据您的需求修改和扩展代码,以满足您具体的要求。

请注意,这个示例程序只提供了一个基本的框架,您需要实现算法来找到最短路径,并根据算法的结果来可视化路径。您可以使用Dijkstra算法或其他适合的算法来实现最短路径的查找。

希望这个示例对您有帮助!

复制
实现findShortestPath()方法

要实现findShortestPath()方法,您可以使用Dijkstra算法来找到最短路径。以下是一个简单的实现示例:

import java.util.*;

public class ShortestPathVisualization {

    // ...

    private void findShortestPath() {
        // Create a priority queue to store the nodes
        PriorityQueue<Node> queue = new PriorityQueue<>();

        // Create a map to store the distances from the start node to each node
        Map<Integer, Integer> distances = new HashMap<>();

        // Create a map to store the previous node in the shortest path
        Map<Integer, Integer> previous = new HashMap<>();

        // Initialize the distances and previous map
        for (int i = 0; i < numNodes; i++) {
            distances.put(i, Integer.MAX_VALUE);
            previous.put(i, null);
        }

        // Set the distance of the start node to 0 and add it to the queue
        distances.put(startNode, 0);
        queue.add(new Node(startNode, 0));

        while (!queue.isEmpty()) {
            Node current = queue.poll();

            // If the current node is the end node, we have found the shortest path
            if (current.id == endNode) {
                break;
            }

            // Iterate through the neighbors of the current node
            for (int neighbor : getNeighbors(current.id)) {
                int distance = distances.get(current.id) + getDistance(current.id, neighbor);

                // If the new distance is shorter, update the distances and previous map
                if (distance < distances.get(neighbor)) {
                    distances.put(neighbor, distance);
                    previous.put(neighbor, current.id);
                    queue.add(new Node(neighbor, distance));
                }
            }
        }

        // Reconstruct the shortest path
        List<Integer> path = new ArrayList<>();
        int current = endNode;
        while (current != null) {
            path.add(current);
            current = previous.get(current);
        }
        Collections.reverse(path);

        // Visualize the shortest path by coloring the nodes and edges
        for (int i = 0; i < path.size() - 1; i++) {
            int node1 = path.get(i);
            int node2 = path.get(i + 1);
            nodes.get(node1).setFill(Color.GREEN);
            edges.stream()
                    .filter(edge -> (edge.getStartX() == nodes.get(node1).getTranslateX() + NODE_SIZE / 2 &&
                            edge.getStartY() == nodes.get(node1).getTranslateY() + NODE_SIZE / 2 &&
                            edge.getEndX() == nodes.get(node2).getTranslateX() + NODE_SIZE / 2 &&
                            edge.getEndY() == nodes.get(node2).getTranslateY() + NODE_SIZE / 2) ||
                            (edge.getStartX() == nodes.get(node2).getTranslateX() + NODE_SIZE / 2 &&
                                    edge.getStartY() == nodes.get(node2).getTranslateY() + NODE_SIZE / 2 &&
                                    edge.getEndX() == nodes.get(node1).getTranslateX() + NODE_SIZE / 2 &&
                                    edge.getEndY() == nodes.get(node1).getTranslateY() + NODE_SIZE / 2))
                    .forEach(edge -> edge.setStroke(Color.GREEN));
        }
    }

    private List<Integer> getNeighbors(int nodeId) {
        // Return a list of neighbor node IDs for the given node ID
        // Implement your logic here
    }

    private int getDistance(int node1, int node2) {
        // Return the distance between node1 and node2
        // Implement your logic here
    }

    private static class Node implements Comparable<Node> {
        int id;
        int distance;

        public Node(int id, int distance) {
            this.id = id;
            this.distance = distance;
        }

        @Override
        public int compareTo(Node other) {
            return Integer.compare(distance, other.distance);
        }
    }
}

findShortestPath()方法中,我们使用优先队列(PriorityQueue)来存储节点,并使用HashMap来存储每个节点到起始节点的距离(distances)和每个节点在最短路径中的前一个节点(previous)。

我们通过循环从优先队列中取出节点,并遍历其邻居节点。如果通过当前节点到达邻居节点的距离比已知的最短距离要短,则更新距离和前一个节点,并将邻居节点加入优先队列。

最后,我们通过重建最短路径,将最短路径上的节点和边进行可视化。

请注意,您需要根据您的具体需求实现getNeighbors()方法和getDistance()方法,以提供节点的邻居信息和节点之间的距离。

希望这个示例对您有帮助!

复制
实现getNeighbors()方法和getDistance()方法

要实现getNeighbors()方法和getDistance()方法,您需要根据您的具体需求和数据结构来实现这些方法。以下是一个简单的示例,供您参考:

private List<Integer> getNeighbors(int nodeId) {
    List<Integer> neighbors = new ArrayList<>();
    // Implement your logic here to get the neighbors of the given node ID
    // For example, if you have a graph represented by an adjacency matrix:
    for (int i = 0; i < numNodes; i++) {
        if (adjacencyMatrix[nodeId][i] != 0) {
            neighbors.add(i);
        }
    }
    return neighbors;
}

private int getDistance(int node1, int node2) {
    // Implement your logic here to get the distance between node1 and node2
    // For example, if you have a graph represented by an adjacency matrix:
    return adjacencyMatrix[node1][node2];
}

getNeighbors()方法中,您需要根据您的数据结构来获取给定节点ID的邻居节点。示例中使用了一个邻接矩阵来表示图,通过遍历邻接矩阵的一行或一列,找到与给定节点相连的节点,并将其添加到邻居列表中。

getDistance()方法中,您需要根据您的数据结构来获取节点之间的距离。示例中使用了邻接矩阵来表示图,通过访问邻接矩阵中的元素,可以获取节点之间的距离。

请根据您的具体情况修改和扩展这些方法,以适应您的数据结构和需求。

希望这个示例对您有帮助!

复制
adjacencyMatrix是什么

adjacencyMatrix是一种常见的图数据结构,用于表示图中节点之间的连接关系。它是一个二维矩阵,其中行和列分别表示图中的节点,矩阵中的元素表示节点之间的连接情况。

在邻接矩阵中,如果节点i和节点j之间存在连接,则矩阵中的(adjacencyMatrix[i][j])元素为1或非零值。如果节点i和节点j之间不存在连接,则矩阵中的(adjacencyMatrix[i][j])元素为0或空值。

邻接矩阵可以用于表示无向图或有向图。对于无向图,邻接矩阵是对称的,即(adjacencyMatrix[i][j])等于(adjacencyMatrix[j][i])。对于有向图,邻接矩阵不一定对称。

使用邻接矩阵可以方便地查找节点之间的连接关系和距离。在最短路径算法中,可以使用邻接矩阵来表示图的连接关系和节点之间的距离。

请注意,邻接矩阵的大小取决于图中节点的数量。对于较大的图,邻接矩阵可能会占用较大的内存空间。

希望这个解释对您有帮助!

复制
0
0

注:避免重复,不要就相同的标题进行反复追问。

回答共0个
回复禁止带推广链接、违法词及灌水,违规将封禁账号!!
您需要登录后才可以回复 注册 / 登录
每个账号仅有一次回答机会!
取消
提示信息
请选择举报理由
我要回答