📄 c#版遗传算法解tsp问题.txt
字号:
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 + -