优化算法人工蜂群算法ABCWord文档格式.doc
《优化算法人工蜂群算法ABCWord文档格式.doc》由会员分享,可在线阅读,更多相关《优化算法人工蜂群算法ABCWord文档格式.doc(12页珍藏版)》请在冰点文库上搜索。
![优化算法人工蜂群算法ABCWord文档格式.doc](https://file1.bingdoc.com/fileroot1/2023-5/3/fcd8420f-ec57-4483-9443-7bc14665d28e/fcd8420f-ec57-4483-9443-7bc14665d28e1.gif)
cmath>
5.#include<
fstream>
6.#include<
iomanip>
7.using
namespace
std;
8.
9.const
int
NP=40;
//种群的规模,采蜜蜂+观察蜂
10.const
FoodNumber=NP/2;
//食物的数量,为采蜜蜂的数量
11.const
limit=20;
//限度,超过这个限度没有更新采蜜蜂变成侦查蜂
12.const
maxCycle=10000;
//停止条件
13.
14./*****函数的特定参数*****/
15.const
D=2;
//函数的参数个数
16.const
double
lb=-100;
//函数的下界
17.const
ub=100;
//函数的上界
18.
19.double
result[maxCycle]={0};
20.
21./*****种群的定义****/
22.struct
BeeGroup
23.{
24.
code[D];
//函数的维数
25.
trueFit;
//记录真实的最小值
26.
fitness;
27.
rfitness;
//相对适应值比例
28.
trail;
//表示实验的次数,用于与limit作比较
29.}Bee[FoodNumber];
30.
31.BeeGroup
NectarSource[FoodNumber];
//蜜源,注意:
一切的修改都是针对蜜源而言的
32.BeeGroup
EmployedBee[FoodNumber];
//采蜜蜂
33.BeeGroup
OnLooker[FoodNumber];
//观察蜂
34.BeeGroup
BestSource;
//记录最好蜜源
35.
36./*****函数的声明*****/
37.double
random(double,
double);
//产生区间上的随机数
38.void
initilize();
//初始化参数
39.double
calculationTruefit(BeeGroup);
//计算真实的函数值
40.double
calculationFitness(double);
//计算适应值
41.void
CalculateProbabilities();
//计算轮盘赌的概率
42.void
evalueSource();
//评价蜜源
43.void
sendEmployedBees();
44.void
sendOnlookerBees();
45.void
sendScoutBees();
46.void
MemorizeBestSource();
47.
48.
49./*******主函数*******/
50.int
main()
51.{
52.
ofstream
output;
53.
output.open("
dataABC.txt"
);
54.
55.
srand((unsigned)time(NULL));
56.
//初始化
57.
//保存最好的蜜源
58.
59.
//主要的循环
60.
gen=0;
61.
while(gen<
maxCycle)
62.
{
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
output<
<
setprecision(30)<
BestSource.trueFit<
endl;
76.
77.
gen++;
78.
}
79.
80.
output.close();
81.
cout<
"
运行结束!
!
82.
return
0;
83.}
84.
85./*****函数的实现****/
86.double
random(double
start,
end)//随机产生区间内的随机数
87.{
88.
start+(end-start)*rand()/(RAND_MAX
+
1.0);
89.}
90.
91.void
initilize()//初始化参数
92.{
93.
i,j;
94.
for
(i=0;
i<
FoodNumber;
i++)
95.
96.
(j=0;
j<
D;
j++)
97.
98.
NectarSource[i].code[j]=random(lb,ub);
99.
EmployedBee[i].code[j]=NectarSource[i].code[j];
100.
OnLooker[i].code[j]=NectarSource[i].code[j];
101.
BestSource.code[j]=NectarSource[0].code[j];
102.
103.
/****蜜源的初始化*****/
104.
NectarSource[i].trueFit=calculationTruefit(NectarSource[i]);
105.
NectarSource[i].fitness=calculationFitness(NectarSource[i].trueFit);
106.
NectarSource[i].rfitness=0;
107.
NectarSource[i].trail=0;
108.
/****采蜜蜂的初始化*****/
109.
EmployedBee[i].trueFit=NectarSource[i].trueFit;
110.
EmployedBee[i].fitness=NectarSource[i].fitness;
111.
EmployedBee[i].rfitness=NectarSource[i].rfitness;
112.
EmployedBee[i].trail=NectarSource[i].trail;
113.
/****观察蜂的初始化****/
114.
OnLooker[i].trueFit=NectarSource[i].trueFit;
115.
OnLooker[i].fitness=NectarSource[i].fitness;
116.
OnLooker[i].rfitness=NectarSource[i].rfitness;
117.
OnLooker[i].trail=NectarSource[i].trail;
118.
119.
/*****最优蜜源的初始化*****/
120.
BestSource.trueFit=NectarSource[0].trueFit;
121.
BestSource.fitness=NectarSource[0].fitness;
122.
BestSource.rfitness=NectarSource[0].rfitness;
123.
BestSource.trail=NectarSource[0].trail;
124.}
125.
126.double
calculationTruefit(BeeGroup
bee)//计算真实的函数值
127.{
128.
truefit=0;
129.
/******测试函数1******/
130.
truefit=0.5+(sin(sqrt(bee.code[0]*bee.code[0]+bee.code[1]*bee.code[1]))*sin(sqrt(bee.code[0]*bee.code[0]+bee.code[1]*bee.code[1]))-0.5)
131.
/((1+0.001*(bee.code[0]*bee.code[0]+bee.code[1]*bee.code[1]))*(1+0.001*(bee.code[0]*bee.code[0]+bee.code[1]*bee.code[1])));
132.
133.
truefit;
134.}
135.
136.double
calculationFitness(double
truefit)//计算适应值
137.{
138.
fitnessResult=0;
139.
if
(truefit>
=0)
140.
141.
fitnessResult=1/(truefit+1);
142.
}else
143.
144.
fitnessResult=1+abs(truefit);
145.
146.
fitnessResult;
147.}
148.
149.void
sendEmployedBees()//修改采蜜蜂的函数
150.{
151.
i,j,k;
152.
param2change;
//需要改变的维数
153.
Rij;
//[-1,1]之间的随机数
154.
155.
156.
157.
param2change=(int)random(0,D);
//随机选取需要改变的维数
158.
159.
/******选取不等于i的k********/
160.
while
(1)
161.
162.
k=(int)random(0,FoodNumber);
163.
(k!
=i)
164.
165.
break;
166.
167.
168.
169.
170.
171.
172.
173.
174.
/*******采蜜蜂去更新信息*******/
175.
Rij=random(-1,1);
176.
EmployedBee[i].code[param2change]=NectarSource[i].code[param2change]+Rij*(NectarSource[i].code[param2change]-NectarSource[k].code[param2change]);
177.
/*******判断是否越界********/
178.
(EmployedBee[i].code[param2change]>
ub)
179.
180.
EmployedBee[i].code[param2change]=ub;
181.
182.
(EmployedBee[i].code[param2change]<
lb)
183.
184.
EmployedBee[i].code[param2change]=lb;
185.
186.
EmployedBee[i].trueFit=calculationTruefit(EmployedBee[i]);
187.
EmployedBee[i].fitness=calculationFitness(EmployedBee[i].trueFit);
188.
189.
/******贪婪选择策略*******/
190.
(EmployedBee[i].trueFit<
NectarSource[i].trueFit)
191.
192.
193.
194.
NectarSource[i].code[j]=EmployedBee[i].code[j];
195.
196.
197.
NectarSource[i].trueFit=EmployedBee[i].trueFit;
198.
NectarSource[i].fitness=EmployedBee[i].fitness;
199.
200.
201.
NectarSource[i].trail++;
202.
203.
204.}
205.
206.void
CalculateProbabilities()//计算轮盘赌的选择概率
207.{
208.
i;
209.
maxfit;
210.
maxfit=NectarSource[0].fitness;
211.
(i=1;
212.
213.
(NectarSource[i].fitness>
maxfit)
214.
maxfit=NectarSource[i].fitness;
215.
216.
217.
218.
219.
NectarSource[i].rfitness=(0.9*(NectarSource[i].fitness/maxfit))+0.1;
220.
221.}
222.
223.void
sendOnlookerBees()//采蜜蜂与观察蜂交流信息,观察蜂更改信息
224.{
225.
i,j,t,k;
226.
R_choosed;
//被选中的概率
227.
//需要被改变的维数
228.
229.
i=0;
230.
t=0;
231.
while(t<
FoodNumber)
232.
233.
234.
R_choosed=random(0,1);
235.
if(R_choosed<
NectarSource[i].rfitness)//根据被选择的概率选择
236.
237.
t++;
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
for(j=0;
251.
252.
253.
254.
255.
/****更新******/
256.
257.
OnLooker[i].code[param2change]=NectarSource[i].code[param2change]+Rij*(NectarSource[i].code[param2change]-NectarSource[k].code[param2change]);
258.
259.
/*******判断是否越界*******/
260.
(OnLooker[i].code[param2change]<
261.
262.
OnLooker[i].code[param2change]=lb;
263