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

📄 c#版遗传算法解tsp问题.txt

📁 C#版遗传算法解TSP问题
💻 TXT
📖 第 1 页 / 共 3 页
字号:
				for(int i=0;i<nn;i++)
					for(int j=0;j<nn;j++)
					{
						double a1,a2;
						a1=Distance[i,j];
						a2=Distance[i,k]+Distance[k,j];
						if(a1>a2)
						{
							Distance[i,j]=a2;
							Path[i,j]=Path[k,j];
						}
					}
		}
	}
	class LSMat
	{
		//从数据文件中获取二维矩阵
		public static double[,] LoadDoubleDataFile(string DataFileName)
		{
			FileStream fs;  //文件指针
			fs=File.Open(DataFileName,FileMode.Open,FileAccess.Read); //以只读方式打开数据
文件
			StreamReader r=new StreamReader(fs);//创建读入流
			string str;
			str=r.ReadLine();  //读入数据文件的第一行
			double []vv;  //定义一维数组
			vv=StringToDouble(str,2); //把特定字符串转换为一维数组
			double [,]Mat;
			switch((int)vv[0])
			{
				case 1: Mat=LoadDoubleDataFileFormat1(r);break;
				case 2: Mat=LoadDoubleDataFileFormat2(r);break;
				default:Mat=new double[0,0];break;
			}
			r.Close();
			fs.Close();  //关闭数据文件指针
			return Mat;
		}
		//获得文件格式为1的双精度型数据
		private static double [,] LoadDoubleDataFileFormat1(StreamReader r)
		{
			string str;
			str=r.ReadLine();  //读入数据文件的第二行
			int seek=str.IndexOf("matrix");
			str=str.Remove(seek,6);
			double []rowcolv;  //定义一维数组
			rowcolv=StringToDouble(str,2); //把特定字符串转换为一维数组
			double [,]Mat;   //定义二维数组
			Mat=new double[(int)rowcolv[0],(int)rowcolv[1]]; //创建二维数组Mat
			str=r.ReadLine(); //读入数据文件的第三行,在此没用,原因是照顾到别的语言的兼容
			while(r.Peek()>-1)    //当到达数据文件尾时结束循环
			{
				str=r.ReadLine();  //读入数据文件当前行字符串
				rowcolv=StringToDouble(str,Mat.GetLength(1));//把特定字符串转换为一维数组
				Mat[(int)rowcolv[0]-1,(int)rowcolv[1]-1]=rowcolv[2]; //为二维数组赋值
			}
			return Mat;  //返回二维数组
		}
		private static double [,] LoadDoubleDataFileFormat2(StreamReader r)
		{
			string str;
			str=r.ReadLine();  //读入数据文件的第二行
			int seek=str.IndexOf("matrix");
			str=str.Remove(seek,6);
			double []rowcolv;  //定义一维数组
			rowcolv=StringToDouble(str,2); //把特定字符串转换为一维数组
			double [,]Mat;   //定义二维数组
			Mat=new double[(int)rowcolv[0],(int)rowcolv[1]]; //创建二维数组Mat
			double[] rowvalue=new double[Mat.GetLength(1)];
			int rowi=0;
			while(r.Peek()>-1)    //当到达数据文件尾时结束循环
			{
				str=r.ReadLine();  //读入数据文件当前行字符串
				int seekm=str.IndexOf(":");
				str=str.Remove(0,seekm+1);
				rowvalue=StringToDouble(str,Mat.GetLength(1));//把特定字符串转换为一维数组
				for(int i=0;i<Mat.GetLength(1);i++)
					Mat[rowi,i]=rowvalue[i];
				rowi++;
			}
			return Mat;  //返回二维数组
		}
		//从数据文件中获取二维矩阵
		public static int[,] LoadIntleDataFile(string DataFileName)
		{
			FileStream fs;  //文件指针
			fs=File.Open(DataFileName,FileMode.Open,FileAccess.Read); //以只读方式打开数据
文件
			StreamReader r=new StreamReader(fs);//创建读入流
			string str;
			str=r.ReadLine();  //读入数据文件的第一行
			int []vv;  //定义一维数组
			vv=StringToInt(str,2); //把特定字符串转换为一维数组
			int [,]Mat;
			switch(vv[0])
			{
				case 1: Mat=LoadIntleDataFileFormat1(r);break;
				case 2: Mat=LoadIntleDataFileFormat2(r);break;
				default:Mat=new int[0,0];break;
			}
			r.Close();
			fs.Close();  //关闭数据文件指针
			return Mat;  //返回二维数组
		}
		private static int[,] LoadIntleDataFileFormat1(StreamReader r)
		{
			string str;
			str=r.ReadLine();  //读入数据文件的第二行
			int seek=str.IndexOf("matrix");
			Console.WriteLine("{0}",seek);
			str=str.Remove(seek,6);
			int []rowcolv;  //定义一维数组
			rowcolv=StringToInt(str,1); //把特定字符串转换为一维数组
			int [,]Mat;   //定义二维数组
			Mat=new int[rowcolv[0],rowcolv[1]]; //创建二维数组Mat
			str=r.ReadLine(); //读入数据文件的第三行,在此没用,原因是照顾到别的语言的兼容
			while(r.Peek()>-1)    //当到达数据文件尾时结束循环
			{
				str=r.ReadLine();  //读入数据文件当前行字符串
				rowcolv=StringToInt(str,Mat.GetLength(1));//把特定字符串转换为一维数组
				Mat[rowcolv[0]-1,rowcolv[1]-1]=rowcolv[2]; //为二维数组赋值
			}
			return Mat;  //返回二维数组
		}
		private static int[,] LoadIntleDataFileFormat2(StreamReader r)
		{
			string str;
			str=r.ReadLine();  //读入数据文件的第二行
			int seek=str.IndexOf("matrix");
			str=str.Remove(seek,6);
			double []rowcolv;  //定义一维数组
			rowcolv=StringToDouble(str,2); //把特定字符串转换为一维数组
			int [,]Mat;   //定义二维数组
			Mat=new int[(int)rowcolv[0],(int)rowcolv[1]]; //创建二维数组Mat
			int[] rowvalue=new int[Mat.GetLength(1)];
			int rowi=0;
			while(r.Peek()>-1)    //当到达数据文件尾时结束循环
			{
				str=r.ReadLine();  //读入数据文件当前行字符串
				int seekm=str.IndexOf(":");
				str=str.Remove(0,seekm+1);
				rowvalue=StringToInt(str,Mat.GetLength(1));//把特定字符串转换为一维数组
				for(int i=0;i<Mat.GetLength(1);i++)
					Mat[rowi,i]=rowvalue[i];
				rowi++;
			}
			return Mat;  //返回二维数组
		}
		//把双精度型数据矩阵存入指定文件中
		public static void SaveDataFile(string DataFileName,double [,]Mat,int DataFile
Format)
		{
			FileStream fs;//文件指针
			fs=File.Open(DataFileName,FileMode.Create,FileAccess.Write);//创建并打开文件指
			StreamWriter w=new StreamWriter(fs);//创建写入文件流
			switch(DataFileFormat)
			{
				case 1: SaveDataFileFormat1(w,Mat); break;
				case 2: SaveDataFileFormat2(w,Mat); break;
				default:break;
			}
			w.Close();
			fs.Close();
		}
		//把双精度型数据矩阵以数据格式1存入文件流指向的文件中
		private static void SaveDataFileFormat1(StreamWriter w,double [,]Mat)
		{
			w.WriteLine("1");
			string str;//定义字符串
			string str2=" ";//创建一个空格字符串
			str="matrix "+Mat.GetLength(0).ToString()+str2+Mat.GetLength(1);// 行和列字符
			w.WriteLine(str);//写入该字符串
			//计算非零元素的个数
			int unzeronumber=0;
			for(int i=0;i<Mat.GetLength(0);i++)
				for(int j=0;j<Mat.GetLength(1);j++)
				{
					if(Mat[i,j]!=0.0) unzeronumber++;
				}
			w.WriteLine("{0}",unzeronumber.ToString());
			//把每个元素写入文件
			for(int i=Mat.GetLowerBound(0);i<=Mat.GetUpperBound(0);i++)
				for(int j=Mat.GetLowerBound(1);j<=Mat.GetUpperBound(1);j++)
				{
					str=(i+1).ToString()+str2+(j+1).ToString()+str2+Mat[i,j].ToString();
					w.WriteLine(str);
				}
		}
		//把双精度型数据矩阵以数据格式2存入文件流指向的文件中
		private static void SaveDataFileFormat2(StreamWriter w,double [,]Mat)
		{
			w.WriteLine("2");
			string str;//定义字符串
			string str2=" ";//创建一个空格字符串
			str="matrix "+Mat.GetLength(0).ToString()+str2+Mat.GetLength(1);// 行和列字符
			w.WriteLine(str);//写入该字符串
			//把每个元素写入文件
			for(int i=Mat.GetLowerBound(0);i<=Mat.GetUpperBound(0);i++)
			{
				str=i.ToString()+":  ";
				w.Write(str);
				for(int j=Mat.GetLowerBound(1);j<=Mat.GetUpperBound(1);j++)
				{
					str=Mat[i,j].ToString()+"  ";
					w.Write(str);
				}
				w.Write("\n");
			}
		}
	    //把整型数据矩阵存入指定文件中
		public static void SaveDataFile(string DataFileName,int [,]Mat,int DataFileFor
mat)
		{
			FileStream fs;//文件指针
			fs=File.Open(DataFileName,FileMode.Create,FileAccess.Write);//创建并打开文件指
			StreamWriter w=new StreamWriter(fs);//创建写入文件流
			switch(DataFileFormat)
			{
				case 1: SaveDataFileFormat1(w,Mat); break;
				case 2: SaveDataFileFormat2(w,Mat); break;
				default:break;
			}
			w.Close();
			fs.Close();
		}
		//把双精度型数据矩阵以数据格式1存入文件流指向的文件中
		private static void SaveDataFileFormat1(StreamWriter w,int [,]Mat)
		{
			w.WriteLine("1");
			string str;//定义字符串
			string str2=" ";//创建一个空格字符串
			str="matrix "+Mat.GetLength(0).ToString()+str2+Mat.GetLength(1);// 行和列字符
			w.WriteLine(str);//写入该字符串
			//计算非零元素的个数
			int unzeronumber=0;
			for(int i=0;i<Mat.GetLength(0);i++)
				for(int j=0;j<Mat.GetLength(1);j++)
				{
					if(Mat[i,j]!=0.0) unzeronumber++;
				}
			w.WriteLine("{0}",unzeronumber.ToString());
			//把每个元素写入文件
			for(int i=Mat.GetLowerBound(0);i<=Mat.GetUpperBound(0);i++)
				for(int j=Mat.GetLowerBound(1);j<=Mat.GetUpperBound(1);j++)
				{
					str=(i+1).ToString()+str2+(j+1).ToString()+str2+Mat[i,j].ToString();
					w.WriteLine(str);
				}
		}
		//把双精度型数据矩阵以数据格式2存入文件流指向的文件中
		private static void SaveDataFileFormat2(StreamWriter w,int [,]Mat)
		{
			w.WriteLine("2");
			string str;//定义字符串
			string str2=" ";//创建一个空格字符串
			str="matrix "+Mat.GetLength(0).ToString()+str2+Mat.GetLength(1);// 行和列字符
			w.WriteLine(str);//写入该字符串
			//把每个元素写入文件
			for(int i=Mat.GetLowerBound(0);i<=Mat.GetUpperBound(0);i++)
			{
				str=i.ToString()+":  ";
				w.Write(str);
				for(int j=Mat.GetLowerBound(1);j<=Mat.GetUpperBound(1);j++)
				{
					str=Mat[i,j].ToString()+"  ";
					w.Write(str);
				}
				w.Write("\n");
			}
		}
		//把只含有空格符,小数点和"0-9"数字符的字符串转换为一个一维双精度型数组
		private static double[] StringToDouble(string str,int veclength)
		{
			double []Mat; //定义一维数组
			Mat=new Double[veclength];  //创建一维数组
			string str1=null;   //创建空字符串
			int index1=0;  //创建一个整型数并赋0
			if(str[0]==' ')  //如果字符串的首字符为空
			{
				//本循环目的是找到第一个不为"空格"的字符的索引,并把它赋给index1
				for(int i=1;i<str.Length;i++) 
				{
					if(str[i]!=' ')
					{
						index1=i;
						break;
					}
				}
				
			}
			//下面循环的目的是以空格为分界符找出所有子字符串,同时把这些子字符串转换成双精
度浮点数
			int k=0;//标志着目前的子字符串的序号,从0开始记数
			for(int i=index1;i<str.Length;i++) //从第一个非"空格"字符开始
			{
				if(str[i]==' '||i>=(str.Length-1)) //如果第i个字符为"空格"或者已到字符串结尾
				{
					//如果已到字符串结尾并且该字符不为"空格",则把最后的字符加到最后的子字符串中
					if(i>=(str.Length-1)&&(str[i]!=' ')) 
						str1+=str[i];
					Mat[k]=double.Parse(str1);//转换字符串为双精度浮点数
					if(i<(str.Length-1))  //如果未到字符串结尾
					{
						k++;  //记数到下一个子字符串
						str1=str1.Remove(0,str1.Length); //清空子字符串
						//下面循环的目的是从当前子字符串结尾的"空格"开始直至找到下一个非"空格"字符
的索引
						//或者到字符串结尾(我们知道两数据间可以有多个空格)
						while(true)
						{
							if(str[i+1]!=' ') break;
							i++;
							if(i>=(str.Length-1)) break;
						}
				    }
				}
				else
				{
					str1+=str[i];//继续加入非"空格"字符到当前子字符串
				}
			}
			return Mat; //返回字符串对应的一维数组
		}
		//把只含有空格符和"0-9"数字的字符串转换为一个一维整型数组
		private static int[] StringToInt(string str,int veclength)
		{
			int []Mat; //定义一维数组
			Mat=new int[veclength];  //创建一维数组
			string str1=null;   //创建空字符串
			int index1=0;  //创建一个整型数并赋0
			if(str[0]==' ')  //如果字符串的首字符为空
			{
				//本循环目的是找到第一个不为"空格"的字符的索引,并把它赋给index1
				for(int i=1;i<str.Length;i++) 
				{
					if(str[i]!=' ')
					{
						index1=i;
						break;
					}
				}
				
			}
			//下面循环的目的是以空格为分界符找出所有子字符串,同时把这些子字符串转换成双精
度浮点数
			int k=0;//标志着目前的子字符串的序号,从0开始记数
			for(int i=index1;i<str.Length;i++) //从第一个非"空格"字符开始
			{
				if(str[i]==' '||i>=(str.Length-1)) //如果第i个字符为"空格"或者已到字符串结尾
				{
					//如果已到字符串结尾并且该字符不为"空格",则把最后的字符加到最后的子字符串中
					if(i>=(str.Length-1)&&(str[i]!=' ')) 
						str1+=str[i];
					Mat[k]=int.Parse(str1);//转换字符串为双精度浮点数
					if(i<(str.Length-1))  //如果未到字符串结尾
					{
						k++;  //记数到下一个子字符串
						str1=str1.Remove(0,str1.Length); //清空子字符串
						//下面循环的目的是从当前子字符串结尾的"空格"开始直至找到下一个非"空格"字符
的索引
						//或者到字符串结尾(我们知道两数据间可以有多个空格)
						while(true)
						{
							if(str[i+1]!=' ') break;
							i++;
							if(i>=(str.Length-1)) break;
						}
					}
				}
				else
				{
					str1+=str[i];//继续加入非"空格"字符到当前子字符串
				}
			}
			return Mat; //返回字符串对应的一维数组
		}
	}
}

⌨️ 快捷键说明

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