⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 traveling salesman problem.cs

📁 Sample program for demonstrating Hopfield Neural Network to solve popular TSP
💻 CS
📖 第 1 页 / 共 4 页
字号:
		//}

		private void txtB_TextChanged(object sender, System.EventArgs e) {
			try { network.B = double.Parse(txtB.Text); } catch (Exception ex) {}
		}

		private void txtD_TextChanged(object sender, System.EventArgs e) {
			try { network.D = double.Parse(txtD.Text); } catch (Exception ex) {}
		}

		private void btnAnalyzeFull_Click(object sender, System.EventArgs e) {
			if (thread == null) {  // fire up thread
				thread = new Thread(new ThreadStart(AnalyzeFullThread));
				thread.Start();
				btnAnalyzeFull.Text = "Abort";
				btnAnalyzeFull.Refresh();
			}
			else {  // abort thread
				thread.Abort();
				thread = null;
				txtStatus.Text = "Aborted. Total distance = " + network.TotalDistance();
				txtStatus.Refresh();
				btnAnalyzeFull.Text = "Analyze (Full)";
				btnAnalyzeFull.Refresh();
				SetNetworkLists();
			}
		}

		private void btnResetSolution_Click(object sender, System.EventArgs e) {
			network.Reset();
			SetNetworkLists();
		}

		private void btnHFlip_Click(object sender, System.EventArgs e) {
			foreach (City c in network.cities)
				c.x = picMap.Width - c.x;
			picMap.Refresh();
			SetNetworkLists();
		}

		private void btnVFlip_Click(object sender, System.EventArgs e) {
			foreach (City c in network.cities)
				c.y = picMap.Height - c.y;
			picMap.Refresh();
			SetNetworkLists();
		}

		private void btnCWRotate_Click(object sender, System.EventArgs e) {
			foreach (City c in network.cities) {
				double newX = picMap.Width * ((float) (picMap.Height - c.y) / (float) picMap.Height);
				double newY = picMap.Height * ((float) c.x / (float) picMap.Width);
				c.y = newY;
				c.x = newX;
			}
			picMap.Refresh();
			SetDistanceList();
			SetNetworkLists();
		}

		private void btnCCWRotate_Click(object sender, System.EventArgs e) {
			foreach (City c in network.cities) {
				double newX = picMap.Width * ((float) c.y / (float) picMap.Height);
				double newY = picMap.Height * ((float) (picMap.Width - c.x) / (float) picMap.Width);
				c.y = newY;
				c.x = newX;
			}
			picMap.Refresh();
			SetDistanceList();
			SetNetworkLists();
		}

		#endregion

		#region XML read/write functions and event handlers

		private void btnSaveNetwork_Click(object sender, System.EventArgs e) {
			SaveFileDialog s = new SaveFileDialog();
			s.Filter = "Network Files (*.net)|*.net";
			s.OverwritePrompt = true;
			if (s.ShowDialog() == DialogResult.OK) {
				XmlTextWriter save = new XmlTextWriter(s.FileName, System.Text.Encoding.UTF8);
				save.Formatting = Formatting.Indented;
				save.IndentChar = ' ';
				save.WriteStartDocument();
				save.WriteStartElement("HopfieldTankNetwork");
				save.Indentation++;
				// write parameters
				save.WriteStartElement("Parameters");
				save.Indentation++;
				save.WriteElementString("NetworkName", network.name);
				//save.WriteElementString("A", network.A.ToString());
				save.WriteElementString("B", network.B.ToString());
				save.WriteElementString("C", network.C.ToString());
				save.WriteElementString("D", network.D.ToString());
				save.WriteElementString("du0", network.u0variation.ToString());
				save.WriteElementString("dt", network.dTimeInterval.ToString());
				save.Indentation--;
				save.WriteEndElement();
				// write neuron data
				save.WriteStartElement("Cities");
				save.Indentation++;
				foreach (object cityobject in network.cities) {
					City city = (City) cityobject;
					save.WriteStartElement("City");
					save.Indentation++;
					save.WriteElementString("Name", city.name);
					save.WriteElementString("X", city.x.ToString());
					save.WriteElementString("Y", city.y.ToString());
					save.Indentation--;
					save.WriteEndElement();
				}
				save.Indentation--;
				save.WriteEndElement();
				// close XML file
				save.Indentation--;
				save.WriteEndElement();
				save.WriteEndDocument();
				save.Close();
			}
		}

		private void btnLoadNetwork_Click(object sender, System.EventArgs e) {
			City city;
			network = new HopfieldTankNetwork();
			network.cities = new ArrayList();
			OpenFileDialog open = new OpenFileDialog();
			open.Filter = "Network files (*.net)|*.net";
			if (open.ShowDialog() == DialogResult.OK) {  // selected an XML file
				try {
					XmlTextReader xtr = new XmlTextReader(open.FileName);
					XmlValidatingReader xvr = new XmlValidatingReader(xtr);
					xvr.ValidationType = ValidationType.Schema;
					xvr.ValidationEventHandler += new ValidationEventHandler(ValidationErrors);
					XmlSchemaCollection xsc = new XmlSchemaCollection();
					xsc.Add("", System.Reflection.Assembly.GetExecutingAssembly().Location.Substring(0, System.Reflection.Assembly.GetExecutingAssembly().Location.Length - 61) + @"Schema Files\Network.xsd");
					xvr.Schemas.Add(xsc);
					XmlDocument xd = new XmlDocument();
					XmlLoadErrors = "";
					xd.Load(xvr);
					if (XmlLoadErrors.Length > 0)
						MessageBox.Show("Errors loading network document. This does not appear to be a valid network file.", "Errors Loading Network Document", MessageBoxButtons.OK, MessageBoxIcon.Error);
					else {
						foreach (XmlNode x1 in xd.ChildNodes) {
							if (x1.Name == "HopfieldTankNetwork") {
								foreach (XmlNode x2 in x1.ChildNodes) {
									if (x2.Name == "Parameters") {
										foreach (XmlNode x3 in x2.ChildNodes) {
											if (x3.Name == "NetworkName")
												network.name = x3.InnerText;
											//else if (x3.Name == "A")
											//	network.A = double.Parse(x3.InnerText);
											else if (x3.Name == "B")
												network.B = double.Parse(x3.InnerText);
											else if (x3.Name == "C")
												network.C = double.Parse(x3.InnerText);
											else if (x3.Name == "D")
												network.D = double.Parse(x3.InnerText);
											else if (x3.Name == "du0")
												network.u0variation = double.Parse(x3.InnerText);
											else if (x3.Name == "dt")
												network.dTimeInterval = double.Parse(x3.InnerText);
										}
									}
									else if (x2.Name == "Cities") {
										foreach (XmlNode x3 in x2.ChildNodes) {
											if (x3.Name == "City") {
												city = new City(100, 100);
												foreach (XmlNode x4 in x3.ChildNodes) {
													if (x4.Name == "Name")
														city.name = x4.InnerText;
													else if (x4.Name == "X")
														city.x = Double.Parse(x4.InnerText);
													else if (x4.Name == "Y")
														city.y = Double.Parse(x4.InnerText);
												}
												network.cities.Add(city);
											}
										}
									}
								}
							}
						}
						xtr.Close();
						txtName.Text = network.name;
						//txtA.Text = network.A.ToString();
						txtB.Text = network.B.ToString();
						txtD.Text = network.D.ToString();
						txtdu0.Text = network.u0variation.ToString();
						txtTimeInterval.Text = network.dTimeInterval.ToString();
						network.Initialize((new Random()).Next(99999));
						SetDistanceList();
						SetNetworkLists();
						picMap.Refresh();
					}
				} catch (Exception ex) {
					MessageBox.Show(ex.Message);
				}
			}
		}
		public void ValidationErrors(object sender, ValidationEventArgs e) {
			XmlLoadErrors += e.Message + "\r\n";
		}

		#endregion

		#region Other event handlers

		private void picMap_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) {
			iMouseX = e.X;
			iMouseY = e.Y;
			if (movingCity != null) {
				movingCity.x = iMouseX;
				movingCity.y = iMouseY;
				picMap.Refresh();
				network.SetDistances();
				SetDistanceList();
				SetNetworkLists();
			}
		}

		private void picMap_MouseLeave(object sender, System.EventArgs e) {
			movingCity = null;
		}

		private void picMap_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) {
			City clickedCity = null;
			// check location first
			foreach (object cityobject in network.cities) {
				City city = (City) cityobject;
				if (Math.Abs(city.x - iMouseX) + Math.Abs(city.y - iMouseY) < 15) {  // close enough - delete city.
					clickedCity = city;
					break;
				}
			}
			if (e.Button == MouseButtons.Left) {  // deleting or placing city
				if (clickedCity != null)
					network.cities.Remove(clickedCity);
				else {  // placing new city
					int x = iMouseX;
					int y = iMouseY;  // preserve coordinates
					City city = new City(x, y);
					int i = (new Random()).Next(139);
					switch (i) {
						case 1: city.name = "Baltimore"; break;
						case 2: city.name = "Chicago"; break;
						case 3: city.name = "Cincinnati"; break;
						case 4: city.name = "New York City"; break;
						case 5: city.name = "Kansas City"; break;
						case 6: city.name = "San Diego"; break;
						case 7: city.name = "San Francisco"; break;
						case 8: city.name = "Paris"; break;
						case 9: city.name = "Berlin"; break;
						case 10: city.name = "Washington D.C."; break;
						case 11: city.name = "Cincinnati"; break;
						case 12: city.name = "Columbus"; break;
						case 13: city.name = "Philadelphia"; break;
						case 14: city.name = "New Orleans"; break;
						case 15: city.name = "Dallas"; break;
						case 16: city.name = "Salt Lake City"; break;
						case 17: city.name = "Houston"; break;
						case 18: city.name = "Los Angeles"; break;
						case 19: city.name = "Boston"; break;
						case 20: city.name = "Detroit"; break;
						case 21: city.name = "Toronto"; break;
						case 22: city.name = "Albany"; break;
						case 23: city.name = "Orlando"; break;
						case 24: city.name = "Anchorage"; break;
						case 25: city.name = "Brussels"; break;
						case 26: city.name = "London"; break;
						case 27: city.name = "Denver"; break;
						case 28: city.name = "San Antonio"; break;
						case 29: city.name = "Tampa"; break;
						case 30: city.name = "Miami"; break;
						case 31: city.name = "Atlanta"; break;
						case 32: city.name = "Providence"; break;
						case 33: city.name = "Tallahassee"; break;
						case 34: city.name = "Nashville"; break;
						case 35: city.name = "Las Vegas"; break;
						case 36: city.name = "Santa Fe"; break;
						case 37: city.name = "Boise"; break;
						case 38: city.name = "Seattle"; break;
						case 39: city.name = "Portland"; break;
						case 40: city.name = "Bismarck"; break;
						case 41: city.name = "Minneapolis"; break;
						case 42: city.name = "Milwaukee"; break;
						case 43: city.name = "Montreal"; break;
						case 44: city.name = "Winnipeg"; break;
						case 45: city.name = "Calgary"; break;
						case 46: city.name = "Birmingham"; break;
						case 47: city.name = "St. Louis"; break;
						case 48: city.name = "Little Rock"; break;
						case 49: city.name = "Oklahoma City"; break;
						case 50: city.name = "Indianapolis"; break;
						case 51: city.name = "Pittsburgh"; break;
						case 52: city.name = "Phoenix"; break;
						case 53: city.name = "Omaha"; break;
						case 54: city.name = "Wichita"; break;
						case 55: city.name = "Lexington"; break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -