当前位置:
文档之家› A星算法求解旅行商问题(可打印修改)
A星算法求解旅行商问题(可打印修改)
int size = str_arr.length; int[] int_arr = new int[size];
for(int i = 0; i < size; i ++){ int_arr[i] = Integer.valueOf(str_arr[i]);
}
return int_arr; }
//获取所有路径中最短的路径 private int get_min_distance(){
==
JFileChooser.SELECTED_FILE_CHANGED_PROPERTY) {//选择单个文件
try {
File file = (File) arg0.getNewValue();//获取属性的新值,转换为
文件对象
//------------------------------------
//将 open 表的首元素放入 close 表 City head_elem = open.queueOut(); close.add(head_elem); //如果当前结点是目标结点 if(head_elem.num >= city_num+1){
break; } if(head_elem.num == city_num){
public City(int city_num){ id_list = new int[city_num + 1]; isVisited = new boolean[city_num];
} }
//主类 public class TspAStar {
private int city_num = 0; private int[][] city_distance = null; private int min_distance = 0;
//获取 hvalue public int get_hvalue(int depth){
return (city_num - depth)*min_distance; }
//A*算法
public City AStar(int start){ int i, j;
//队列,队列中的元素按升序排列,用队列表示 open 表 MyQueue<City> open = new MyQueue<City>(city_num); //向量,用向量表示 close 表 Vector<City> close = new Vector<City>(); //初始的城市结点 City city = new City(city_num); city.id_list[city.num ++] = start; city.isVisited[start - 1] = true;//如果城市编号为 1,在数组的位置为 0 city.fvalue = get_gvalue(city) + get_hvalue(city.depth); //将开始结点放入 open 表 open.queueIn(city); //如果 open 表不为空 while(!open.isEmpty()){
2、用户界面
3、运行结果
通过验证,运行结果和期望值一致。
由于每个城市结点需要保存之前的路径,因此增加了空间复杂度。
五、程序 一共有三个类,City,TspAStar,MyQueue,City 是 TspAStar 的内部类。 1、City 和 TspAStar package .tspByHdy;
import javax.swing.JFileChooser; import javax.swing.JOptionPane;
//城市结点类,表示访问到中间某个城市的状态 class City{
int depth = 0;//当前深度 int[] id_list = null;//已经访问的城市的编号 int num = 0;//已经访问的城市的个数 boolean[] isVisited = null;//城市结点访问标志 int fvalue = 0; //估计值
城市之间的距离:通过 n*n 矩阵 city_distance 表示,其中 n 表示城市的个数。编号为 k 的城市到各个城市之间的距离可以从第(k-1)行获取。
open 表:用队列表示,城市结点进入队列之前需要根据估计值 fvalue 按升序排列。
close 表:用向量表示。 搜索图:搜索图通过 open 表构建,将路径的编号保存在一个数组 id_list 中。 四、实验结果和分析 1、输入数据 第一行的数值 8 表示城市结点的个数,后面是一个 8*8 的数组,数组的值表示城市之 间的距离。任何一个结点到自身的距离是 0,数组中的第 0 行表示第 1 个城市到各个城市 之间的距离,其他的可类推。
JOptionPane.showMessageDialog(null, "文件读取异常,检查文件内容是否全为数字!");
} } } }); fc.showOpenDialog(null);//弹出"打开文件"对话框
//将字符串形式的整数构成的数组转换为整数数组 private int[] transfer(String[] str_arr){
//获取输入源,输入源为选取的文件
fc.addPropertyChangeListener(new PropertyChangeListener() {//注册监听器
public void propertyChange(PropertyChangeEvent arg0) {//属性改变事件
if
(arg0.getPropertyName()
பைடு நூலகம்
FileInputStream fi = new FileInputStream(file);
InputStreamReader ir = new InputStreamReader(fi);
BufferedReader br = new BufferedReader(ir);
//------------------------------------
} return min; }
//获取 gvalue public int get_gvalue(City city){
int gvalue = 0; for(int i = 1; i < city.num; i ++){
gvalue += city_distance[city.id_list[i]-1][city.id_list[i-1]-1]; } return gvalue; }
import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.Vector;
city_num = Integer.parseInt(br.readLine().trim());//读取城市的个数
city_distance = new int[city_num][city_num];//城市之间的距离
框 }
//读取城市之间的距离,保存在 city_distance String str_line = null; for (int i = 0; i < city_num; i++) {
三、算法实现 主要的数据结构
城市结点:depth 表是从开始城市到当前城市,访问的城市个数,也可以称为深度; num 表示已访问的城市结点的个数; id_list 是一个数组,表示从开始城市到当前城市的所 有城市的编号的集合,编号的值从 1 开始;isVisited 是一个布尔数组,记录当前城市结点 到目标城市结点的访问状态,布尔值为 false,表示可访问;fvalue 表示从开始城市出发回 到原点的估计值。
str_line = br.readLine(); city_distance[i] = transfer(str_line.split(" ")); } fi.close(); ir.close(); br.close(); } catch (Exception ep) {//如果文件的内容不是全为数字,则弹出对话
Astar 算法求解旅行商问题
一、问题描述 一共有 n 个城市,某推销员从其中的一个城市 A 出发经过每个城市一次且仅一次后回
到 A,求代价最小的路径。
二、知识表示 1、状态表示
初始状态,目标状态。 初始状态:A(出发城市) 目标状态:A,···((n-1)个城市),A 2、算法描述 (1)设城市结点的个数为 n,获取开始结点,计算所有成员变量的值,将开始结点放 入 open 表(open 表用队列实现); (2)如果 open 表不为空,转(3),否则转(7); (3)将 open 表中的首元素放入 close 表,并将该首元素从 open 表中删除。 (4)获取已访问结点的个数 num,如果 num ≥ n+1,则找到最佳路径,转(7); (5)如果 num==n,还访问一个结点到达目标结点,设置初始结点的访问状态 isVisited[0]的值为 false,表示初始结点没有被访问,即可以回到出发点; (6)如果 num<n,将从当前结点出发可访问的结点和 open 表中剩余的结点放入一个 向量 vector 中,根据每个结点的 fvalue 值按升序排列,排列的结果按升序放入 open 表,转 (2); (7)获取 close 表中的最后一个元素,打印最佳路径,相邻城市之间的距离,最短的 距离值。 3、估价函数 f(n)=g(n)+h(n) ,h(n)≤h*(n)。 g(n):从开始结点到当前结点 n 的实际距离,等于路径的权值的和。 h(n):假设城市结点 n 的深度为 depth,城市的个数为 city_num,(city_num-depth)表示 从 n 到目标城市还需要的路径个数,min 表示所有路径长度的最小值,则 h(n) =min*(city_num-deep)表示从当前城市结点 n 到目标结点的路径长度的最小估计值,h(n) ≤h*(n)显然对于任意的一个城市结点都成立。