原创 基于遗传算法的TSP(旅行商问题)解决方法

2013-7-19 11:02 2184 10 10 分类: 工业电子 文集: 论文

TSP(旅行商问题)

 

1 参数设置

设置30个城市:

x坐标:x=[87 91 83 71 64  68 83 87 74 71   58 54 51 37 41  

2 7 22 25 18   4 13 18 24 25  41 45 44 58 62];

y坐标:y=[7  38 46 44 60  58 69 76 78 71   69 62 67 84 94 

  99 64 60 62 54  50 40 40 42 38  26 21 35 35 32];

2 设计步骤

2.1 第1步:参数编码和初始群体设置

对于TSP问题,采用访问城市序列排列组合的方法编码,而不采用传统的二进制编码.如图1所示,为30进制,每个个体有30位,每位取值范围为1到30.

1

30

15

24

……

17

10 

3

图 1  个体

设置一个s行t列的矩阵D=,其中,s为个体数,t=31. 到(i=1,2,……,s)为2个城市之间的距离,为每个个体中30个城市距离的总和.

2.2 第2步:适应度函数设计

,其中j=1,2,……,31.

目标函数,自适应函数.

2.3 第3步:计算选择算子

选择是从群体中选择优胜个体,淘汰劣质个体. 它通过评估个体自适应函数,将适应度最大的c个个体直接替换适应度最小的c个个体. 仿真程序中c=15.

2.4 第4步:计算交叉算子

位号

1

2

 

3

4

5

6

7

 

8

9

10

X1

9

8

cp1

4

7

1

cp2

2

0

X2

8

7

cp1

1

0

3

2

cp2

9

6

5

 

 

 

 

 

 

 

 

 

 

 

 

 

X1'

8

3

cp1

4

5

7

1

cp2

9

0

2

X2'

9

8

cp1

1

4

0

3

2

cp2

7

5

6

图 2  交叉

如图2所示,假设为10位个体,随机选择两个交叉点cp1和cp2,X1'为X1的子代,X2'为X2的子代. 子代中cp1与cp2之间的部分直接从双亲复制而来,其它部分取双亲中另一个的,遇到与已确定段中雷同的数字时,取双亲中对应位置非雷同的数字为子代数字.例如X1'中的第2为,应该对应X2中第2位对应的7,但是X1'的第6位已经有了7,所以按照X1中第6位7对应X2的位置确定为数字3.

仿真程序中交叉概率.

2.5 第5步:计算变异算子

随机确定两个交叉点cp1和cp2,将cp1与cp2之间的字符串前后颠倒,如图3所示,74805变为50847.仿真程序中变异概率.

位号

1

2

 

3

4

5

6

7

 

8

9

10

X1

1

3

cp1

7

4

8

0

5

cp2

9

6

2

X1'

1

3

cp1

5

0

8

4

7

cp2

9

6

2

图 3   变异

3 仿真程序

主程序如下:

clear all;

close all;

t=31;     %城市数=t-1

s=10000;    %个体数

pc=0.90;

pm=0.20;

pop=zeros(s,t);

for i=1:s

   pop(i,1:t-1)=randperm(t-1);

end

for k=1:1:500

if mod(k,10)==1

    k

end

pop=chap10_1dis(pop);

c=15;

pop=chap10_1select(pop,c);

p=rand;

if p>=pc

   pop=chap10_1cross(pop);

end

if p>=pm

   pop=chap10_1mutate(pop);

end

end

pop 

min(pop(:,t))

J=pop(:,t);

fi=1./J;

[Oderfi,Indexfi]=sort(fi);

BestS=pop(Indexfi(s),;

I=BestS;

x=[87 91 83 71 64  68 83 87 74 71   58 54 51 37 41  2 7 22 25 18   4 13 18 24 25  41 45 44 58 62];

y=[7 38 46 44 60  58 69 76 78 71   69 62 67 84 94  99 64 60 62 54   50 40 40 42 38  26 21 35 35 32];

for i=1:1:t-1

    x1(i)=x(I(i));

    y1(i)=y(I(i));

end 

x1(t)=x(I(1));

y1(t)=y(I(1));

figure(1);

plot(x1,y1,'-or');

4 仿真结果

如图4所示,距离d=449.5.

图 4  仿真结果

 

 

tam

文章评论0条评论)

登录后参与讨论
我要评论
0
10
关闭 站长推荐上一条 /2 下一条