?? 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 + -