亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? c#版遺傳算法解tsp問題.txt

?? C#版遺傳算法解TSP問題
?? TXT
?? 第 1 頁 / 共 3 頁
字號:
摘要:本文借助于遺傳算法給出了旅行銷售員問題較優解的求解方法,并用C#語言實現。

1. 旅行銷售員問題的描述和相關定理

  為了方便討論旅行銷售員問題(Traveling Saleman Problem,簡稱TSP),先給出圖論
中相關的一些定義:
定義1 經過圖G的每個頂點正好一次的圈,稱為G的哈密爾頓圈,簡稱H圈。
定義2 在加權圖G=(V,E)中

(1)最小的H圈稱為最佳H圈;

(2)經過每個頂點至少一次且權最小的閉通路稱為最佳銷售員回路。

  本文要解決的問題就是求加權圖的最佳銷售員回路。而最佳銷售員回路的問題可以轉化
為最佳H圈問題。
設給定加權圖G=(V,E),用它構造以V為頂點集的完全圖G′=(V,E′),其中E′中每條
邊(x,y)的權等于圖G中頂點x到頂點y的最短路徑的長度,即
對任意∈E′,權 
圖論中相關定理如下:

定理1 加權圖G的最佳銷售員回路的長度和G′的最佳H圈的長度相同。
定理2 在加權完全圖中最佳H圈問題是NPC問題。

  根據定理1我們可以把任意加權圖的旅行銷售員問題轉化為其加權完全圖上的最佳H圈問
題。根據定理2我們知道對該問題尋找多項式時間算法是不現實的,我們只能構造一些啟發式
近似算法來求得問題的較優解。

2. 旅行銷售員問題的遺傳算法實現

2.1 用Floyd-Warshall算法求圖中任意兩頂點的最短路徑

  Floyd-Warshall算法步驟:
STEP0 k=0;對于所有節點i和j,令 (可以認為 ), ;
STEP1 k=k+1;對于所有頂點i和j,若 ,則令 ;否則令 ;
STEP2 如果k==n,結束;否則轉STEP1。
其中代號意義如下:
: 圖G的頂點數目
:圖G中頂點i到j的弧的權值
:圖G中頂點i到j中間經過前k個頂點的最短路徑的長度
:圖G中頂點i到j中間經過前k個頂點的最短路徑的前一個頂點的標號
顯然, 就是頂點i到j的最短路徑的長度。
注:這個算法由命名空間TSP下的Floyd類來實現。

2.2 遺傳算子的選擇 

  在本文中,編碼方案我們采用可能是對一個旅行最自然的表達-路徑表達。例如,一個旅
5-1-7-8-9-4-6-2-3
可以簡單地被表達成
(5 1 7 8 9 4 6 2 3)。
遺傳算法的運算步驟:
{
隨機初始化種群P(0),t=0;
計算P(0)中個體的適應度;
while(不滿足中止條件)
{
for(k=0;k<N;k+=2) //設N能被2整除
{
隨機從P(t)中產生兩個父體交叉操作后產生兩個后代;
把這兩個后代加入中間群體P′(t)中;
}
對中間群體P′(t)中的每個個體進行變異操作;
從P(t)和P′(t)中進行選擇操作得到N個個體賦予新群體P(t+1)中;
計算P(t+1)中每個個體的適應度;
t++;
}
}
根據實測結果,我們僅從眾多的遺傳算子中選擇幾個性能較好的算子。

2.2.1 交叉算子

  采用由Davis提出OX算子-通過從一個親體中挑選一個子序列旅行并保存另一個親體的城
市相對次序來構造后代。例如,兩個親體(切割點以"|"標記)
p1=? 2 3 | 4 5 6 7 | 8 9)
p2=(4 5 2 | 1 8 7 6 | 9 3)
將按照下面的方式產生后代。首先,切割點之間的片段被拷貝到后代里:
o1=(x x x | 4 5 6 7 | x x)
o2=(x x x | 1 8 7 6 | x x)
為了得到o1,我們只需要移走p2中已在o1中的城市4、5、6和7后,得到
2-1-8-9-3
該序列順次放在o1中:
o1=(2 1 8 | 4 5 6 7 | 9 3)
相似地,我們可以得到另一個后代:
o2=(2 3 4 | 1 8 7 6 | 5 9)
OX交叉開拓了路徑表達的一個特性,即城市的次序(不是它們的位置)是重要的,即兩個旅
5-1-7-8-9-4-6-2-3
8-9-4-6-2-3-5-1-7
實際上是相同的。
注:本算子由命名空間TSP中的類Ga中的公共成員函數CrossOX()來實現。

2.2.2 變異算子

  對于變異算子我們采用倒置變異。倒置變異是在染色體上隨機地選擇兩點,將兩點間的
子串反轉。說明如下:
原個體:(1 2 3 4 5 6 7 8 9)
隨機選擇兩點:(1 2 | 3 4 5 6 | 7 8 9)
倒置后的個體:(1 2 | 6 5 4 3 | 7 8 9)
注:本算子由命名空間TSP中的類Ga中的公共成員函數MutateReverse()來實現。

2.2.3 選擇算子

  對于選擇算子我們采用錦標賽選擇算子。選擇時,選隨機地在群體中選擇k個個體進行比
較,適應度最好的個體將被選擇復制到下一代,參數k稱為競賽規模,常取k=2。
注:本算子由命名空間TSP中的類Ga中的公共成員函數SelectMatch()來實現。

3. 編程中的相關問題

  根據2中的分析和算法,我們便可借助于一種編程語言來實現它,我們在這里選擇C#語言
。對于如何編程實現和編程中的一些細節我將在下面分類討論。注意整個編碼工作都在命名
空間TSP中實現。

3.1 數據的輸入輸出

  我們知道在解決旅行銷售員問題時要輸入圖的信息,它是一個矩陣,如果每次都在C#的
集成開發環境中直接輸入,那么將不勝麻煩,并且輸入的信息還不易保存。因此,我們采用
文件輸入方式。這樣我們就有必要規定數據文件的格式。我們這里自定義了兩種數據文件(
僅限于數值數據)的格式,說明如下。
比如有一矩陣
1.2 2.3 0
0 0 3
4.3 0 5
格式1:
1………………………文件格式說明
matrix 3 3 …………數據矩陣大小的說明
5………………………數據矩陣的非零元素個數 
1 1 1.2……………非零元素所在行數、列數和元素數值,下同
1 2 2.3
2 3 3
3 1 4.3
3 3 5
注:顯然格式1方便稀疏矩陣的輸入,本格式是自定義格式。
格式2:
2………………………文件格式說明
matrix 3 3 …………數據矩陣大小的說明
1: 1.2 2.3 0 ……行前的冒號一定不能缺,下同
2: 0 0 3
3: 4.3 0 5
注:格式2是針對一般數據矩陣的輸入,本格式是自定義格式。
我們已經在c#語言中用命名空間TSP中的LSMat類實現數值數據的存取。

3.2 隨機數的產生

  C#中帶有隨機數的產生的類,在命名空間System下的Random類中。但是它并不能滿足遺
傳算法編程的需求,于是我就實現了自己的隨機數生成類RandNumber,當然它是基于System
.Random類的。程序源碼中有詳細說明。

3.3 Floyd算法

  我用Floyd類來實現求圖中任意兩點的最短路徑的Floyd-Warshall算法。整個算法的編制
完全按照2.1中的算法步驟進行的。

3.4 遺傳算法類

  這個類也是主要的類了,就用Ga類實現了。這里我特別要提的是Ga的類成員CrossOx(),
按2.2.1中提供的交叉算子的計算過程,我們發現的進行一次交叉操作的時間復雜度是O(n2)
,經過仔細分析我們找到了時間復雜度為O(n)的方法,讀者仔細閱讀程序就會發現。

4.下一步的工作

  我們下一步的工作將繼續豐富遺傳算法的工作,同時還將用另一類啟發式算法-螞蟻算法
來實現TSP的求解。我們會努力把這個問題做得更好。
My Email:wanbaocheng@163.com


程序代碼:

 


namespace TSP
{
	//數據文件格式:
	//第一行有兩個數據:矩陣行數  矩陣列數
	//接下來的行的數據:行  列  該行該列的元素值
	//注意數據與數據之間是用空格隔開的,沒有給出的矩陣的某些位置的值用0來代替
	using System;
	using System.IO;
	class TestClass
	{
		public static void TestGa(string DataFileName)
		{
			Ga ga=new Ga();
			ga.GaTsp(DataFileName);
		}
		public static void TestGa2()
		{
			RandNumber rands=new RandNumber();
			Ga ga=new Ga();
			int n=36;
			double [,]CostMat=new double[n,n];
			double [,]vec=new double[n,2];
			for(int i=0;i<n;i++)
			{
				vec[i,0]=rands.Rand01();
				vec[i,1]=rands.Rand01();
			}
			for(int i=0;i<n;i++)
				for(int j=0;j<n;j++)
				{
					if(i==j) CostMat[i,j]=0.0;
					else
					{
						double s1=vec[i,0]-vec[j,0];
						double s2=vec[i,1]-vec[j,1];
						CostMat[i,j]=Math.Sqrt(s1*s1+s2*s2);
					}
				}
			ga.GaTsp(CostMat);
			LSMat.SaveDataFile(@"d:\c#\tsp\out01.txt",CostMat,2);
		}
		public static void TestLSMat()
		{
			int n=6;
			double [,]mat=new double[n,n];
			for(int i=0;i<n;i++)
				for(int j=0;j<n;j++)
				{
					mat[i,j]=(double)(i+1)*(j+1);
				}
			//LSMat.SaveDataFile(@"D:\eeee1.txt",mat,1);
			double [,]mat2;
			mat2=LSMat.LoadDoubleDataFile(@"D:\eeee1.txt");
			for(int i=0;i<mat2.GetLength(0);i++)
			{
                Console.Write("{0}: ",i);
				for(int j=0;j<mat2.GetLength(1);j++)
				{
					Console.Write("{0}  ",mat2[i,j]);
				}
				Console.Write("\n");
			}
		}
		public static void Main(string[] args)
		{
			//TestGa(@"d:\c#\Tsp\data01.txt");
			TestGa2();
			//TestLSMat();
		}
	}
	/* 下面是TSP問題的遺傳算法實現類
	 * */
	class Ga
	{
		private Floyd minfloyd=new Floyd();//創建Floyd類
		private double [,]Distance;
		private int N; //群體規模
		private int Length; //個體長度
		private double Pc; //交叉概率
		private double Pm; //變異概率
		private int MaxGene; //最大迭代代數
		public int []MinIndividual; //當前代的最好個體指針
		public double MinValue; //到當前代至最好個體的適應度值
		private int [,]Buf;  //群體矩陣
		private int [,]Buf1; //中間群體矩陣
		private int [,]Buf2; //中間群體矩陣
		private double []FitV; //群體Buf的每個個體的適應度
		private double []FitV1;//群體Buf1的每個個體的適應度
		private double []FitV2;//群體Buf2的每個個體的適應度
		private int[] ppindivi; //交叉算子中用到的中轉向量
		private int[] pp;//交叉算子中用到的中轉向量
		private RandNumber randnumber=new RandNumber();//創建一個隨機數類
		//類初始化函數
		public void Initialize(string DataFileName,int N1,double Pc1,double Pm1,int Ma
xGene1)
		{
			minfloyd.MinFloyd(DataFileName);
			Distance=minfloyd.GetDistance();
			for(int i=0;i<Distance.GetLength(0);i++)
				Distance[i,i]=0;
			N=N1;
			Length=Distance.GetLength(0);
			Pc=Pc1;
			Pm=Pm1;
			MaxGene=MaxGene1;
			MinValue=double.MaxValue;
			Buf=new int[N,Length];
			Buf1=new int[N,Length];
			Buf2=new int[N,Length];
			FitV=new double[N];
			FitV1=new double[N];
			FitV2=new double[N];
			MinIndividual=new int[Length];
			int []individual;
			for(int i=0;i<N;i++)
			{
				individual=randnumber.RandDifferInt(Length-1);
				for(int j=0;j<Length;j++)
					Buf[i,j]=individual[j];
				FitV[i]=Fit(i,0);
			}
			ppindivi=new int[Length];
			pp=new int[Length];
		}
		//類初始化函數
		public void Initialize(double [,]CostMat,int N1,double Pc1,double Pm1,int MaxG
ene1)
		{
			minfloyd.MinFloyd(CostMat);
			Distance=minfloyd.GetDistance();
			for(int i=0;i<Distance.GetLength(0);i++)
				Distance[i,i]=0;
			N=N1;
			Length=Distance.GetLength(0);
			Pc=Pc1;
			Pm=Pm1;
			MaxGene=MaxGene1;
			MinValue=double.MaxValue;
			Buf=new int[N,Length];
			Buf1=new int[N,Length];
			Buf2=new int[N,Length];
			FitV=new double[N];
			FitV1=new double[N];
			FitV2=new double[N];
			MinIndividual=new int[Length];
			int []individual;
			for(int i=0;i<N;i++)
			{
				individual=randnumber.RandDifferInt(Length-1);
				for(int j=0;j<Length;j++)
					Buf[i,j]=individual[j];
				FitV[i]=Fit(i,0);
			}
			ppindivi=new int[Length];
			pp=new int[Length];
		}
		//返回第i個個體的適應度(order==0,返回Buf的;order==1,返回Buf1的;否則返回Buf2的
		public double Fit(int i,int order)
		{
			if(order==0)
			{
				double fitv=0.0;
				for(int j=0;j<Length-1;j++)
					fitv+=Distance[Buf[i,j],Buf[i,j+1]];
				fitv+=Distance[Buf[i,Length-1],Buf[i,0]];
				return fitv;
			}
			if(order==1)
			{
				double fitv=0.0;
				for(int j=0;j<Length-1;j++)
					fitv+=Distance[Buf1[i,j],Buf1[i,j+1]];
				fitv+=Distance[Buf1[i,Length-1],Buf1[i,0]];
				return fitv;
			}
			else
			{
				double fitv=0.0;
				for(int j=0;j<Length-1;j++)
					fitv+=Distance[Buf2[i,j],Buf2[i,j+1]];
				fitv+=Distance[Buf2[i,Length-1],Buf2[i,0]];
				return fitv;
			}
		}
		//順序交叉算子。由雙親Buf中的第i1和j1兩個個體交叉后得到的后代賦給Buf1中的第k1個
個體
		public void CrossOX(int i1,int j1,int k1)
		{
			/* 產生[0,Length-1]間的兩個隨機整數。大的賦給l1,小的賦給l2。
			 * */
			int []randi;
			randi=randnumber.RandDifferInt(0,Length-1,2); 
			int l1,l2;
			if(randi[0]>randi[1])
			{
				l1=randi[1];
				l2=randi[0];
			}
			else
			{
				l1=randi[0];
				l2=randi[1];
			}
			//結束l1和l2的賦值

			//把Buf的第j1個個體賦給中轉向量ppindivi
			for(int i=0;i<Length;i++)
				ppindivi[i]=Buf[j1,i];
			//獲得pp,其中pp[ii]表示頂點ii在個體ppindivi中的位置
			for(int i=0;i<Length;i++)
				pp[ppindivi[i]]=i;
			//把Buf中的第i1個個體中的l1到l2之間的頂點在第i2個個體中用-1標記出來
			for(int i=l1;i<=l2;i++)
				ppindivi[pp[Buf[i1,i]]]=-1;
			int k=0;
			for(int i=0;i<Length;i++)
			{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
六月丁香婷婷久久| 2021中文字幕一区亚洲| 日韩欧美中文字幕公布| 国产精品家庭影院| 麻豆视频观看网址久久| 色一情一乱一乱一91av| 久久这里只有精品首页| 亚洲主播在线播放| 99精品久久久久久| 精品处破学生在线二十三| 一区二区三区蜜桃网| 不卡的电影网站| 国产欧美一区二区三区网站 | 另类小说视频一区二区| 99riav一区二区三区| 欧美国产丝袜视频| 国产很黄免费观看久久| 精品免费视频一区二区| 日韩国产欧美三级| 欧美日韩国产成人在线免费| 亚洲欧美国产毛片在线| 99视频在线精品| 国产精品三级视频| 成人黄色免费短视频| 国产女同互慰高潮91漫画| 国产suv一区二区三区88区| 久久在线免费观看| 国产精品亚洲一区二区三区妖精| 欧美一区二区三区在线看| 三级不卡在线观看| 这里是久久伊人| 蜜桃av一区二区三区| 91精选在线观看| 日韩avvvv在线播放| 欧美丰满一区二区免费视频| 日韩制服丝袜av| 日韩欧美一区二区久久婷婷| 久久国产麻豆精品| 久久久精品天堂| 成人av综合在线| 亚洲少妇屁股交4| 欧美又粗又大又爽| 天天操天天色综合| 精品免费视频.| 波多野结衣91| 亚洲自拍偷拍网站| 日韩一区二区免费电影| 国产一区二区精品久久99| 欧美激情综合网| 在线观看视频一区二区欧美日韩| 亚洲午夜在线视频| 日韩一区二区三区电影| 风间由美中文字幕在线看视频国产欧美| 精品国产乱码久久| 成年人国产精品| 日韩综合小视频| 欧美精品一区二区精品网| 丁香啪啪综合成人亚洲小说 | 日韩精品免费视频人成| 亚洲精品一区在线观看| caoporm超碰国产精品| 亚洲国产色一区| 欧美精品一区二区久久久| 波多野结衣在线aⅴ中文字幕不卡| 亚洲国产精品麻豆| 久久久亚洲午夜电影| 色噜噜狠狠成人网p站| 理论片日本一区| 综合电影一区二区三区 | 国产亚洲一本大道中文在线| 97久久人人超碰| 久久精品国产免费看久久精品| 国产精品伦一区| 91精品在线麻豆| 99久久久精品| 精品亚洲porn| 亚洲伊人色欲综合网| 久久久www免费人成精品| 欧美色综合网站| 成人激情文学综合网| 蜜桃av一区二区在线观看| 亚洲色大成网站www久久九九| 日韩精品影音先锋| 欧美日韩国产不卡| 99在线精品一区二区三区| 久久er精品视频| 视频一区二区欧美| 亚洲精品综合在线| 久久精品日产第一区二区三区高清版 | 蜜桃av一区二区| 一区二区三区久久久| 亚洲国产成人午夜在线一区| 日韩美一区二区三区| 欧美男男青年gay1069videost| 972aa.com艺术欧美| 成人福利在线看| 福利电影一区二区三区| 国产一区二区福利视频| 精久久久久久久久久久| 久久精品免费观看| 日本免费在线视频不卡一不卡二| 亚洲一区精品在线| 一区二区三区四区不卡视频| 中文字幕一区二区三区视频| 国产日韩欧美制服另类| 久久精品亚洲精品国产欧美kt∨ | 欧美一区二区三区色| 欧美色大人视频| 99国产精品99久久久久久| 成人av免费在线观看| aaa亚洲精品一二三区| 成人午夜激情影院| 成人黄色一级视频| 99久久伊人网影院| 99re成人在线| 欧美视频一区二区| 欧美人xxxx| 91精品国产一区二区三区香蕉| 欧美精品一二三区| 日韩一区二区不卡| 精品动漫一区二区三区在线观看| 欧美成人一区二区三区| 久久女同性恋中文字幕| 日本一区二区三区国色天香| 国产精品少妇自拍| 亚洲欧美色一区| 亚洲成a人片在线观看中文| 午夜视频一区二区三区| 日本伊人色综合网| 国产一区二区三区黄视频 | 在线一区二区三区做爰视频网站| 97久久精品人人做人人爽| 色伊人久久综合中文字幕| 欧美三级电影在线看| 日韩欧美在线网站| 国产亚洲成aⅴ人片在线观看| 国产精品午夜在线观看| 一区二区三区视频在线观看| 日韩高清在线一区| 国产成人av电影| 欧美影院午夜播放| 日韩精品一区二区三区视频| 中文字幕精品一区二区精品绿巨人| 亚洲视频一区在线观看| 亚洲成人av一区| 国产乱人伦偷精品视频不卡| 99久久婷婷国产综合精品| 欧美老年两性高潮| 国产亚洲成年网址在线观看| 亚洲综合色成人| 韩国欧美国产一区| 色综合激情久久| 亚洲精品一区二区三区精华液 | 天天综合网天天综合色| 国产精品 欧美精品| 欧美视频你懂的| 久久久久国产精品厨房| 亚洲国产色一区| 成人性生交大片| 日韩欧美国产精品一区| 亚洲视频在线观看三级| 精品一区二区综合| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 欧美成va人片在线观看| 亚洲一区二区三区美女| 国产成人免费视频精品含羞草妖精| 欧美午夜一区二区| 国产精品萝li| 国产伦精品一区二区三区视频青涩| 91福利视频在线| 中文字幕日韩av资源站| 国产精品亚洲第一区在线暖暖韩国| 欧美特级限制片免费在线观看| 国产亚洲午夜高清国产拍精品| 免费精品99久久国产综合精品| 91美女片黄在线| 国产精品乱人伦中文| 国内精品伊人久久久久av影院| 在线不卡欧美精品一区二区三区| 成人免费在线观看入口| 国产精品一二三区| 欧美xxx久久| 麻豆极品一区二区三区| 欧美高清一级片在线| 亚洲精品国产视频| 91免费版在线看| 亚洲视频小说图片| a4yy欧美一区二区三区| 国产精品网站导航| 国产成人8x视频一区二区| 久久综合丝袜日本网| 国模一区二区三区白浆| 精品国产免费视频| 美女高潮久久久| 精品久久久久久久久久久院品网 | 国产拍欧美日韩视频二区| 国产精品正在播放| 国产亚洲精品超碰| 成人免费高清在线观看| 成人欧美一区二区三区1314|