用动态规划算法解决TSP问题

匿名 (未验证) 提交于 2019-12-03 00:30:01

环境:程序使用语言java,jdk版本1.8,程序中用到的jar包:poi-3.17


程序中使用的数据:下载地址:https://download.csdn.net/download/qq_35685675/10487174


项目导入:


3.实验主要源代码

City.java//城市类,结构体

package

publicclass

privateintname;

privatedoubleX;

privatedoubleY;

publicintnamedoublexdoubley) {

super();

this.namename-1;

Xx;

Yy;

}

publicint

returnname;

}

publicvoidintname) {

this.namename;

}

publicdouble

returnX;

}

publicvoiddoublex) {

Xx;

}

publicdouble

returnY;

}

publicvoiddoubley) {

Yy;

}

@Override

public

return"city [name="name",X="X", Y="Y"]";

}

}

inputData.Java//导入数据类

package

import

import

import

import

import

import

import

import

import

publicclass

@SuppressWarnings("resource")

publicstaticinput_att48file){

cityListnew

try

wookbooknewnewfile));

sheetwookbook.getSheet("Sheet1");

introwssheet.getPhysicalNumberOfRows();

for(intii<rowsi++){

rowsheet.getRow(i);

if(row!=null){

cynewirowrow.getCell(2).getNumericCellValue());

cityList.add(cy);

}

}

catche) {

System.out.println("File not fount!");

catche) {

System.out.println("IO exception!");

}

returncityList;

}

}

DP.Java//核心代码

package TSP;


import java.io.File;
import java.util.List;
import java.util.Scanner;


public class DP {
//V集合表示已经旅行后的点的集合。
//n点经过集合V中所有点到达起始点的最短距离;1<<(n-1)代表一个二进制串,
//1代表该位置的城市在V集合例,反之不在。
static double INF = Double.MAX_VALUE;
static double[][] DT = null;
static double[][] DP = null;
// static int n = 0;
static void init(int n) {
File file = new File("E:\\Java\\arithmetic\\src\\resource\\att48.xls");
List<city> cityList = inputData.input_att48(file);

for(int i=0; i<n; i++) {
System.out.println(cityList.get(i).toString());
}
DT = new double[n][n];
DP = new double[n][1<<(n-1)];
for(int i=0; i<n; i++) {
for(int j=i; j<n; j++) {
if(i==j) DT[i][j] = 0;
else {
double dertX = cityList.get(i).getX()-cityList.get(j).getX();
double dertY = cityList.get(i).getY()-cityList.get(j).getY();
DT[i][j] = Math.sqrt(dertX*dertX + dertY*dertY);
DT[j][i] = DT[i][j];
}
}
}

// for(int i=0; i<n; i++) {
// for(int j=0; j<n; j++) {
// System.out.print(DT[i][j]);
// System.out.print(" ");
// }
// System.out.println();
// }

//V集合为空的情况,初始化第i点直接回到起点s的距离
for(int i=1; i<n; i++) {
DP[i][0] = DT[i][0];
}
}

static void solve(int n) {
double minDt = INF;
double temp = 0;
for(int j=1; j<1<<(n-1); j++){//j的二进制表示V集合。













minDt = INF;








}

@SuppressWarnings("resource")
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("----------------动态规划解决TSP问题----------------");
Scanner in = new Scanner(System.in);
while(true) {
System.out.println();
System.out.println("请输入城市数:");
int n = in.nextInt();
if(n>24) {
System.out.println("城市数过多,请使用其他算法!");
return;
}
init(n);
solve(n);
}
}
}

输入输出:


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!