四、经验和体会
刚拿到这个题目时有些轻视了这个题目,第一感觉就是城市遍历主要核心问题就是获得一个全排列,依次比较每个排列的总长度即可找到最佳路径。对于其他问题都好解决。因此,前期的设计思想、界面的布局等准备工作都显得十分轻松。当整个程序接近尾声进入测试阶段时才发现时间效率很低。对于较少了城市运行速度还是可以的,但当城市数量逐渐变大时却发现求出一个全排列是十分困难的。
于是,我提醒自己必须改善这种求解思想。当我把题目资料仔细的的看一遍时才发现,题目中给了一个叫“模拟退火算法”的求解遍历路径的经典算法。对于这个算法我是第一次听到,只有认真理解该算法的原理和结合实际问题的解决思路后才能够掌握该算法。通过查阅大量的资料后终于对该算法有了一个较为全面的认识。简单的说,该算法是从概率上来解决求解全排列寻找最佳路径的一个简便方法。通过“逆转中间或者逆转两端”的方法来寻找最佳路径,当然对于不同的问题可能采用不同的寻找的路径方法,但总体思想都是通过“随机产生新解” ,“判断新解是否优于原始解”,“获得新解”等一系列操作来进行的。
通过对该算法的认识,我开始将原有的“全排列”算法用“模拟退火算法”
取代。但又出现了新的问题,比如:灭火的条件如何控制?这问题看似简单但解决起来是比较困难的,这问题也是该算法存在尚未解决的难题之一。有人可能会认为自定义一个温度(这里是产生新解序列的次数)就可以了,如果这样,那么在时间效率上将会有一个很大的浪费,该灭火条件应该由当时的具体环境所决定,这也是最理想的条件控制方法,本程序采用了在全排列次数的条件下随机产生新序列,虽然并未达到理想的条件控制但相对前期的控制方法有很大的改善。
这次的城市遍历问题课程设计虽然总体上说不是很难,要求的技术也不是很高,但通过这次的实验我有着丰厚的收获。
大型项目或者类似这样的课程设计不仅可以使已经掌握的知识掌握的更加牢固,还能使以前掌握但现在却模糊的知识变得清晰起来。我相信大多数同学通过这次课程设计都会拿起书本或者电子资料重新回顾以前的知识。当然这些都是最直接最直观的体会。
每个题目中都会涉及到一些重未触及到的问题,需要大量的新知识才可以解决的问题。就拿我的课程设计来说,涉及的模拟退火算法,我相信多数同学对它都没有太多的了解。这就要求你必须通过自主学习来掌握解决这些新问题的思路和方法。这就培养了学生的自主学习的能力和解决问题的思路,当然通过这样的实验也会提高学生综合运用所学知识来解决大型问题的能力。这对在以后的工作、学习中有着不可替代的作用。也是走向成功的必备素质和能力。
这也使得我体会到对于一个问题不可以轻视问题的隐蔽的困难性。要真正深入到问题中发现问题中的显性和隐性问题,采取对应的策略来解决。这也让我认识到在以后的工作中不可以随意的看待问题或者接受一个问题的考验。比如,你接一个项目,在未签订工作合同之前你要能够发现项目中存在的隐性问题,一旦你忽略了这些隐性问题,那么这些隐性问题可能会给你致命一击,使得你无法完成该项目而违约。当然前提是这些隐性问题你真的无法解决。
附录:主要源程序
1、主界面入口类
public class userUI {
public static void main(String[] args) { @SuppressWarnings(\
ui u = new ui(); } 2、主界面类
import java.awt.Color; import java.awt.Graphics;
import java.awt.event.ActionEvent; Import java.awt.event.ActionListener; import java.util.List;
import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; @SuppressWarnings(\
public class ui extends JFrame implements ActionListener { private userOP usOP = new userOP();
private annealingMeans annealing = new annealingMeans(); private List
private static long startTime = 0, endTime = 0;
String anHui[] = { \合肥市\蚌埠市\安庆市\芜湖市\阜阳市\淮北市\
String timeStr = \查询用时:0.000000 秒\ JComboBox box = new JComboBox(anHui);
JLabel startCity = new JLabel(\起始城市:\ JLabel time = new JLabel(timeStr);
JLabel Info = new JLabel(\欢 迎 使 用 -- \ JTextField start = new JTextField(); JButton find = new JButton(\查询\ public ui() {
this.setLayout(null);
this.setTitle(\城 市 遍 历\ box.setBounds(90, 12, 70, 30); this.add(box);
box.addActionListener(this);// 为下拉列表注册监听器 // 加入起始城市标签
startCity.setBounds(190, 15, 230, 30);
this.add(startCity);
//加入起始城市输入组件JTextField start.setBounds(260, 15, 100, 24); this.add(start);
start.addActionListener(this);// 为文本框注册监听器 // 显示查询用时
time.setBounds(20, 20, 160, 60); this.add(time); // 加入查询用时标签
Info.setBounds(240, 20, 300, 60); this.add(Info); //加入查询按钮
find.setBounds(520, 15, 80, 30); this.add(find);
find.addActionListener(this);// 为查询按钮注册监听器 this.setBounds(200, 200, 700, 530);// 窗口大小、位置 this.setVisible(true);// 设置窗体可见 }
@SuppressWarnings(\
public void actionPerformed(ActionEvent e) {
String cityName = (String) box.getSelectedItem(); if (cityName.equals(\合肥市\ draw = 1; repaint(); }
if (cityName.equals(\蚌埠市\ draw = 2; repaint(); }
if (cityName.equals(\安庆市\ draw = 3; repaint(); }
if (cityName.equals(\芜湖市\ draw = 4; repaint(); }
if (cityName.equals(\淮北市\ draw = 5; repaint(); }
if (cityName.equals(\阜阳市\ draw = 6; repaint();
}
if (e.getSource() == find) { time.setText(timeStr);
String InputName = start.getText();
if (usOP.testCityName(cityName, InputName)) {
Info.setText(\正在寻找最佳路径,请稍等......\ line = 1; repaint(); } else {
Info.setText(\您输入的城市不存在,请重新输入!\ line = 0; } } }
@SuppressWarnings(\public void paint(Graphics g) {
String startCityName = start.getText().trim(); // 画线(中间的横线) g.setColor(Color.blue);
g.drawLine(10, 110, 690, 110); // 画实心矩形框
g.setColor(new Color(190, 193, 183)); g.fill3DRect(8, 115, 680, 400, false); // 绘制左下角图例方框
g.setColor(new Color(184, 230, 94)); g.drawRect(18, 420, 120, 80); // 绘制图例内容
g.setColor(new Color(83, 205, 74)); g.drawString(\ g.setColor(Color.black);
g.drawString(\行驶顺序\ g.setColor(Color.red);
g.drawString(\——\ g.setColor(Color.black);
g.drawString(\直达路线\ // 设置直线(连接两个城市的)颜色 g.setColor(Color.red); if (draw == 1) {
cityName = \合肥市\
// 获得合肥市所有地方名称信息 list = usOP.showCity(cityName); // 显示合肥市所有地方名称信息 usOP.show(g, list, cityName); if (line == 1) {