本项目需要开发一个管线铺设辅助系统,以我校西校区为例,在里仁学院教学楼、学生公寓、学生食堂、第一、二、三、四教学楼、材料学院、电气学院、理学院、艺术学院、经管学院、西里西亚学院和信息学院之间铺设输水管道,设计算法并实现使铺设的输水管道距离最短,从文本中读取数据、显示最佳铺设方案,以及绘制最佳方案的简单示意图等功能。
由于此项目为合作完成,我只写了prim算法,所以只上传有关prim的部分。
运行结果
db.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/map?userSSL=ture&useUnicode=true&characterEncoding=utf-8
username=root
password=root
index.jsp
<%@ page import="domain.Buildings" %>
<%@ page import="java.util.List" %>
<%@ page import="com.google.gson.Gson" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta charset="utf-8">
<title>管道铺设辅助系统</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<style>
html{height:100%}
body{height:100%;margin:0px;padding:0px}
#container {
overflow: hidden;
width: 100%;
height: 90%;
margin: 0;
font-family: "微软雅黑";
}
</style>
<script src="//api.map.baidu.com/api?type=webgl&v=1.0&ak=40ZSZGnM6HRUM06RKMsnWOcyUsmTed3Z"></script>
</head>
<body>
<div id="container"></div>
<div id="r-result">
<form action="/PrimeServlet" method="get">
<p>起点:<input type="text" name="point"></p>
<input type="submit" value="提交">
</form>
<input type="button" onclick="start();" value="kruskal" />
<input type="button" onclick="startprime();" value="prim" />
<%-- <a class="btn float-buttons waves-effect waves-button waves-float" id="a" href="/PrimeServlet">--%>
<%-- primeBuildings--%>
<%-- </a>--%>
</div>
</body>
</html>
<script>
var map = new BMapGL.Map('container'); // 创建Map实例
map.centerAndZoom(new BMapGL.Point(119.533143,39.912459), 18); // 初始化地图,设置中心点坐标和地图级别
map.enableScrollWheelZoom(true); // 开启鼠标滚轮缩放
var buildingsList = [];
<% List<Buildings> buildingList = (List<Buildings>) request.getAttribute("buildings"); %>
<% if (buildingList != null) { %>
buildingsList = <%= new Gson().toJson(buildingList) %>;
<% } %>
var route=[];
<% List<String> routes = (List<String>) request.getAttribute("route"); %>
<% if (routes != null) { %>
route = <%= new Gson().toJson(routes) %>;
<% } %>
var path = [];
for (var i1 = 0; i1 < route.length; i1++) {
var point2 = {
'lng': parseFloat(route[i1].split(",")[0]),
'lat': parseFloat(route[i1].split(",")[1])
};
path.push(point2);
}
function change(){
var points = [];
var labels = [];
for (var i = 0; i < buildingsList.length; i++) {
var building = buildingsList[i];
var address1 = building.address;
var name = building.name;
var address=address1.split(",");
var point = new BMapGL.Point(parseFloat(address[0]),parseFloat(address[1]));
points.push(point);
var label = new BMapGL.Label(name, {
position: point,
offset: new BMapGL.Size(0, 0)
});
labels.push(label);
}
for (var j = 0; j < labels.length; j++) {
map.addOverlay(labels[j]);
}
}
function start(){
change();
for (var ij=0;ij<path.length;) {
var coors = [
{'lat': parseFloat(path[ij].lat), 'lng': parseFloat(path[ij].lng)},
{'lat': parseFloat(path[ij + 1].lat), 'lng': parseFloat(path[ij + 1].lng)}
];
var polyline = new BMapGL.Polyline(coors);
map.addOverlay(polyline);
ij += 2;
}
}
var addresses=[];
var point=[];
<% int []point=(int[]) request.getAttribute("point"); %>
<% if (point != null) { %>
point = <%= new Gson().toJson(point) %>;
<% } %>
function startprime(){
var ans=[];
for(var i=0;i<point.length;i++){
for(var j=0;j<buildingsList.length;j++){
var abstract_name=buildingsList[j].abstract_name;
if(point[i]==abstract_name) {
var address = buildingsList[j].address;
var an = buildingsList[j].abstract_name;
break;
}
}
ans.push(an);
addresses.push(address);
}
var lng=[];
var lat=[];
for (var i=0;i<addresses.length;i++) {
const a = addresses[i].split(",");
lng[i] = a[0];
lat[i] = a[1];
}
for (var i=0;i<addresses.length;i++){
var point1 = new BMapGL.Point(lng[i], lat[i]);
var marker = new BMapGL.Marker(point1); // 创建标注
map.addOverlay(marker); // 将标注添加到地图中
}
for (var i=1;i<addresses.length;i++){
// window.alert(lng[i], lat[i]);
var polyline = new BMapGL.Polyline([
new BMapGL.Point(lng[i-1], lat[i-1]),
new BMapGL.Point(lng[i], lat[i])
], {strokeColor:"blue", strokeWeight:2, strokeOpacity:0.5});
map.addOverlay(polyline);
}
}
</script>
PrimeServlet
package servlet;
import domain.Buildings;
import domain.Edata;
import service.Kruskalimp;
import service.Primeimpl1;
import service.buildingserviceimp;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebServlet("/PrimeServlet")
public class PrimeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
buildingserviceimp buildings = new buildingserviceimp();
List<Buildings> buildingsList = new ArrayList<Buildings>();
buildingsList = buildings.getbuildings();
request.setAttribute("buildings", buildingsList);
String v0=request.getParameter("point");
int v=Integer.parseInt(v0);
Primeimpl1 prime = new Primeimpl1();
int []point=prime.Prim(v);
request.setAttribute("point",point);
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
Primeimpl1
package service;
import dao.Filedao;
import dao.Filedaoimp;
import java.io.IOException;
public class Primeimpl1 {
Filedao Filedaoimp=new Filedaoimp();
int[][] number;
{
try {
number = Filedaoimp.read();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
int [][]edge=number; //存放图中边
int vertexNum=14;
boolean visited[] = new boolean[vertexNum];//是否已经经过
int []point=new int[vertexNum];//存放路径顶点
int MAX = Integer.MAX_VALUE;
int []lowcost=new int[vertexNum];//到已经经过的点集合的最短距离
int total=0;//用来记录权值和
public int[] Prim(int v) throws IOException {
int i,j,k,n;
lowcost[v]=0;
visited[v] = true;
point[0]=v;
for(i=0;i<vertexNum;i++){
lowcost[i]=edge[v][i];
}
for(n=1;n<vertexNum;n++){
int min=MAX;
int index=-1;
for(i=0;i<vertexNum;i++){
if(!visited[i]&&lowcost[i]<min){
min=lowcost[i];
index=i;
}
}
if(index==-1) System.out.println("error");
total+=min;
lowcost[index]=0;
visited[index]=true;
point[n]=index;
//更新lowcost
for(j=0;j<vertexNum;j++) {
if(edge[index][j]<lowcost[j]) {
lowcost[j]=edge[index][j];
}
}
}
// for (i=0;i<point.length;i++) {
// System.out.println(point[i]);
// }
// System.out.println(total);
Filedaoimp.writefile(point,total);
return point;
}
}
buildingservice
package service;
import java.util.List;
import domain.*;
public interface buildingservice {
public List<Buildings> getbuildings();
}
buildingserviceimp
package service;
import java.sql.Connection;
import java.util.List;
import dao.BaseDao;
import dao.Buildingsdao;
import dao.Buildingsdaoimp;
import domain.*;
public class buildingserviceimp implements buildingservice {
private Buildingsdao buildingdao;
public buildingserviceimp() {
buildingdao = new Buildingsdaoimp();
}
public List<Buildings>getbuildings(){
Connection connection = null;
List<Buildings> buildinglist = null;
try {
connection = BaseDao.getConnection();
buildinglist = buildingdao.getBuilding(connection);
} catch (Exception e) {
e.printStackTrace();
}finally{
BaseDao.closeResource(connection, null, null);
}
return buildinglist;
}
}
Buildings
package domain;
public class Buildings {
String name;
String address;
int abstract_name;
public int getAbstract_name() {
return abstract_name;
}
public void setAbstract_name(int abstract_name) {
this.abstract_name = abstract_name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
BaseDao
package dao;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
public class BaseDao {
//静态代码块,在类加载的时候执行
static {
init();
}
private static String driver;
private static String url;
private static String username;
private static String password;
//初始化连接参数,从配置文件里获得
public static void init(){
Properties properties = new Properties();
String configFile = "db.properties";
InputStream inputStream = dao.BaseDao.class.getClassLoader().getResourceAsStream(configFile);
try {
properties.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
driver=properties.getProperty("driver");
url=properties.getProperty("url");
username=properties.getProperty("username");
password=properties.getProperty("password");
}
/**
* 获取数据库连接
* @return
*/
public static Connection getConnection() {
Connection connection =null;
try {
Class.forName(driver);
connection= DriverManager.getConnection(url,username,password);
}catch (Exception e){
e.printStackTrace();
}
return connection;
}
/**
* 编写查询公共类
*/
public static ResultSet execute(Connection connection, PreparedStatement pstm, ResultSet rs, String sql, Object[] params)throws Exception{
pstm = connection.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
pstm.setObject(i+1,params[i]);
}
rs=pstm.executeQuery();
return rs;
}
/**
* 编写增删改公共类
*/
public static int execute(Connection connection,PreparedStatement pstm,
String sql,Object[] params) throws Exception{
int updateRows = 0;
pstm = connection.prepareStatement(sql);
for(int i = 0; i < params.length; i++){
pstm.setObject(i+1, params[i]);
}
updateRows = pstm.executeUpdate();
return updateRows;
}
/**
* 释放资源
*/
public static boolean closeResource(Connection connection,PreparedStatement pstm,ResultSet rs){
boolean flag = true;
if(rs != null){
try {
rs.close();
rs = null;//GC回收
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
flag = false;
}
}
if(pstm != null){
try {
pstm.close();
pstm = null;//GC回收
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
flag = false;
}
}
if(connection != null){
try {
connection.close();
connection = null;//GC回收
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
flag = false;
}
}
return flag;
}
}
Buildingsdao
package dao;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import domain.*;
public interface Buildingsdao {
public List<Buildings> getBuilding(Connection connection) throws Exception;
public List<String> getabsname(Connection connection) throws SQLException;
}
Buildingsdaoimp
package dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import domain.*;
public class Buildingsdaoimp implements Buildingsdao {
public List<Buildings> getBuilding(Connection connection) throws Exception {
PreparedStatement pstm = null;
ResultSet rs = null;
List<Buildings> buildingList = new ArrayList<Buildings>();
if (connection != null) {
String sql = "select name,address,abstract_name from map";
pstm = connection.prepareStatement(sql);
rs = pstm.executeQuery();
while (rs.next()) {
Buildings _b = new Buildings();
_b.setName(rs.getString("name"));
_b.setAddress(rs.getString("address"));
_b.setAbstract_name(rs.getInt("abstract_name"));
buildingList.add(_b);
}
BaseDao.closeResource(null, pstm, rs);
}
return buildingList;
}
public List<String> getabsname(Connection connection) throws SQLException {
PreparedStatement pstm = null;
ResultSet rs = null;
List<String> absname = new ArrayList<String>();
if (connection != null) {
String sql = "select abstract_name from map";
pstm = connection.prepareStatement(sql);
rs = pstm.executeQuery();
while (rs.next()) {
String _b = rs.getString("abstract_name");
absname.add(_b);
}
BaseDao.closeResource(null, pstm, rs);
}
return absname;
}
}
Filedao
public interface Filedao {
public int[][] read() throws IOException;
public void writefile(int[]point,int total) throws IOException;
}
Filedaoimp
public class Filedaoimp implements Filedao {
public int [][] read() throws IOException {
String pathname = "D:\\文档\\Tencent Files\\2247594359\\FileRecv\\input(1).txt";
File filename = new File(pathname);
BufferedReader bf = new BufferedReader(new FileReader(filename));
String textLine = new String();
String str = new String();
while((textLine = bf.readLine()) != null) {//每次读取一行
str += textLine + ",";//每读取一行就用逗号隔开
}
String[] numbers = str.split(",");//根据逗号把每行分别存入numbers中
int[][] number = new int[14][14];//矩阵数组
String[] stmp = null;
for(int i = 0; i < 14; i++) {
stmp = numbers[i].split(" ");//把每一行的数字进一步分离
for(int j = 0; j < 14; j++) {
number[i][j] = Integer.parseInt(stmp[j]);
}
}
for(int i = 0; i < 14; i++) {
for(int j = 0; j < 14; j++) {
System.out.print(number[i][j]+" ");
}
System.out.print("\n");
}
bf.close();
return number;
}
@Override
public void writefile(int[]point,int total) throws IOException {
File outfile = new File("D:\\桌面\\output.txt");
if (outfile.exists()) {
System.out.println("文件已经存在");
System.exit(1);
}
PrintWriter out = new PrintWriter(outfile, "UTF-8");
// out.println("最小生成树的邻接矩阵为:");
// for(int i=0;i<matrix.length;i++){
// for (int j=0;j<matrix[0].length;j++){
// out.print(matrix[i][j]);
// }
// out.print("\n");
// }
out.println("最小生成树的路径为:");
for(int i=0;i<point.length-1;i++)
out.print(point[i]+"->");
out.println(point[13]);
out.print("最小生成树的长度为:"+total);
out.close();
}
}