遗传算法源程序附件:
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MaxGen 30
#define chrom_length 4
#define PopSize 20
#define Upper_Num 5
#define Down_Num 6
#define Point_Num 11
#define INFINITY 9999
#define pc 0.6
#define pm 0.05
#define E 2.78
double d=2,l=10;
double weight=0.5;
int gen;
struct individual{
int chrom[chrom_length];
double value;
double fitness;
};
struct Point{
double x;
double y;
}m_point[Point_Num]={{0,0},{d,0},{2*d,0},{3.5*d,0},{5*d,0},
{2*d,l},{3*d,l},{4*d,l},{0,l+d},{d,l+d},{5*d,l+d}};
double best=INFINITY;
int Best[chrom_length];
struct individual population[PopSize];
double Upper_Array[Upper_Num][35]={
4,3,2,3,4,4,3,1,3,4,2,1,0,1,2,3.5,5,17,15,15,14,12,13,13,15,9,10,11,12,13,13,11,13,10,12,5,4,3,4,5,5,4,2,2,3,3,2,1,0,1,2.5,4,16,14,14,13,11,12,12,14,8,9,10,11,12,12,10,12,9,11,6,5,4,5,4,6,5,3,3,2,4,3,2,1,0,1.5,3,15,13,13,17,10,11,11,13,7,8,9,10,11,11,9,11,8,10,
7.5,6.5,5.5,6.5,5.5,7.5,6.5,4.5,4.5,3.5,5.5,4.5,3.5,2.5,
1.5,0,1.5,13.5,11.5,11.5,10.5,8.5,9.5,9.5,11.5,5.5,6.5,7.5,8.5,9.5,9.5,7.5,9.5,6.5,8.5,9,8,7,6,5,9,8,6,6,5,7,6,5,4,3,1.5,0,12,10,10,9,7,8,8,10,4,5,6,7,8,8,6,8,5,7
};
double Down_Array[Down_Num][12]={
0,2,4,4,3,2,3,4,5,8.47214,8,6,
2,0,2,5,4,3,2,3,4,9.47214,9,7,
4,2,0,6,5,4,3,2,3,10.47214,10,8,
4,5,6,0,1,2,3,4,5,4.47214,4,2,
3,4,5,1,0,1,2,3,4,5.47214,5,3,
5,4,3,5,4,3,2,1,0,9.47214,9,7
};
int murr(int n){
int i,sum=1;
for(i=n;i>0;i--)
sum*=i;
return sum;
}
double min(double x,double y){
return (x>y?y:x);
}
double length(double x1,double y1,double x2,double y2){
return (sqrt(pow((x1-x2),2)+pow((y1-y2),2)));
}
double max(double x,double y){
return(x>y?x:y);
}
void Gener_Init(){//初始化
int i,j;
for(i=0;i<PopSize;i++)
{
do{
for(j=0;j<chrom_length;j+=2)
population[i].chrom[j]=rand()%5;
}while(population[i].chrom[0]==population[i].chrom[2]);
do{
for(j=1;j<chrom_length;j+=2)
population[i].chrom[j]=rand()%6;
}while(population[i].chrom[1]==population[i].chrom[3]);
}
}
void Add_Value(){//目标函数
int i,j,t1,t2,t3,t4;
double Umin_Value,Dmin_Value;
double l1,l2;
for(i=0;i<PopSize;i++){
Umin_Value=0; Dmin_Value=0;
for(j=0;j<35;j++)
Umin_Value+=min(Upper_Array[population[i].chrom[0]][j],
Upper_Array[population[i].chrom[2]][j]);
for(j=0;j<12;j++)
Dmin_Value+=min(Down_Array[population[i].chrom[1]][j],
Down_Array[population[i].chrom[3]][j]);
t1=population[i].chrom[0];
t2=population[i].chrom[1]+5;
t3=population[i].chrom[2];
t4=population[i].chrom[3]+5;
l1=length(m_point[t1].x,
m_point[t1].y,
m_point[t2].x,
m_point[t2].y);
l2=length(m_point[t3].x,
m_point[t3].y,
m_point[t4].x,
m_point[t4].y);
population[i].value=weight*(Umin_Value+Dmin_Value)+(1-weight)*(l1+l2)*100;
}
}
void selection(){//选择
int i,index;
double p,temp=0,total=0;
double cfitness[PopSize];
struct individual newpopulation[PopSize];
for(i=0;i<PopSize;i++){
temp=max(population[i].value,temp);
total+=population[i].value;
}
temp+=100;
for(i=0;i<PopSize;i++){
population[i].fitness=(temp-population[i].value)/(PopSize*temp-total);
cfitness[i]=population[i].fitness;
}
for(i=1;i<PopSize;i++)
cfitness[i]+=cfitness[i-1];
for(i=0;i<PopSize;i++){
p=rand()%1000/1000.0;
index=0;
while(p>cfitness[index])
index++;
newpopulation[i]=population[index];
}
for(i=0;i<PopSize;i++){
population[i]=newpopulation[i];
}
}
void Crossing(){//
int i,j;//
int index[PopSize],temp,point;
double p;
for(i=0;i<PopSize;i++)
index[i]=i;
for(i=0;i<PopSize;i++){
point=rand()%(PopSize-i);
temp=index[i];
index[i]=index[point+i];
index[point+i]=temp;
}
for(i=0;i<PopSize;i+=2){
p=rand()%1000/1000.0;
if(p<pc){
point=rand()%2;
if(point==0)
for(j=0;j<chrom_length;j+=2)
{
temp=population[index[i]].chrom[j];
population[index[i]].chrom[j]
=population[index[i+1]].chrom[j];
population[index[i+1]].chrom[j]=temp;
}
else
for(j=1;j<chrom_length;j+=2)
{
temp=population[index[i]].chrom[j];
population[index[i]].chrom[j]
=population[index[i+1]].chrom[j];
population[index[i+1]].chrom[j]=temp;
}
}
}
}
void Muta_Opeator(){//
int i,j,s,q;
double p;
for(i=0;i<PopSize;i++)
for(j=0;j<chrom_length;j++){
p=rand()%1000/1000.0;
if(p<pm){
q=rand()%4;
switch(q){
case 0:
s=rand()%5;
while(s==population[i].chrom[2])
s=rand()%5;
population[i].chrom[q]=s;
break;
case 1:
s=rand()%6;
while(s==population[i].chrom[3])
s=rand()%6;
population[i].chrom[q]=s;
break;
case 2:
s=rand()%5;
while(s==population[i].chrom[0])
s=rand()%5;
population[i].chrom[q]=s;
break;
case 3:
s=rand()%6;
while(s==population[i].chrom[1])
s=rand()%6;
population[i].chrom[q]=s;
break;
}
}
}
}
void print(){
int i,temp=-1;
double average,sum=0;
cout<<endl;
for(i=0;i<PopSize;i++)
sum+=population[i].value;
average=sum/PopSize;
for(i=0;i<PopSize;i++){
if(best>=population[i].value){
best=population[i].value;
temp=i;
}
}
if(temp!=-1){
for(i=0;i<chrom_length;i++)
Best[i]=population[temp].chrom[i];
}
cout<<"Generation="<<gen<<" Average="<<average
<<" Best_Value="<<best<<endl;
cout<<"Best_Chrom";
for(i=0;i<chrom_length;i++)
cout<<Best[i]<<" ";
cout<<endl;
}
void main(){
int q=5,k;
double p[35],sum;
int i,j;
do{
for(i=0;i<35;i++){
k=rand()%(3*q);
p[i]=pow(q,k)*pow(E,-1*q)/(murr(k));
sum+=p[i];}
}while(sum==1.0);
for(i=0;i<Upper_Num;i++)
for(j=0;j<35;j++)
Upper_Array[i][j]*=p[j];
do{
for(i=0;i<12;i++){
k=rand()%(3*q);
p[i]=pow(q,k)*pow(E,-1*q)/(murr(k));
sum+=p[i];}
}while(sum==1.0);
for(i=0;i<Down_Num;i++)
for(j=0;j<12;j++)
Down_Array[i][j]*=p[j];
gen=0;
Gener_Init();
while(gen<MaxGen){
Add_Value();
print();
selection();
Crossing();
Muta_Opeator();
// print();
gen++;
}
}
你可以使用这个链接引用该篇文章 http://publishblog.blogchina.com/blog/tb.b?diaryID=3833712
| JOHNSON算法的源程序 | xixiawen |
| 立井机械化数学模型 | xixiawen |
| “遗传规划”与“遗传算法”的不同点 | 海天 |
| 股票分析 数学模型 | xixiawen |
| SNS:六度的简单数学模型 | ame1981 |
|
- 评论人:anonymous
2006-08-10 23:44:41
|
|||
其实我这里有个文章是讲遗传算发的思想的可以看看对于每一个题目都是不同的但是思想是一样的所以要考虑在怎么样子的情况下适应性比较好而不是进入蚂蚁算法最好能得到最优解不然是只是局部最优的 |
||||
|
- 评论人:83
2006-08-10 11:39:31
|
|||
使用罚函数时,适应值函数为:,,为与进化代数相关的罚因子,为进化代数,为第个约束有关的违约值,为违约数目,和为调节惩罚值大小的参数,请问这些参数如何取值,对应不同的实际情况是否取不同的值呢? |
||||
|
- 评论人:西夏文
2006-08-09 19:10:54
|
|||
要给出一个参数制定在哪个时候确定跳出去了优化了 |
||||
|
- 评论人:hyzhang83
2006-08-08 15:07:27
|
|||
不太明白,在计算适应度函数那一块要是用罚函数法的话怎么写呢,不知道罚函数怎么确定。 |
||||
|
- 评论人:西夏文
2006-07-04 16:34:44
|
|||
什么也不能解决啊 |
||||
|
- 评论人:蔓延
2006-06-29 16:10:20
|
|||
这个遗传算法目的是解决什么啊? |
||||
|
- 评论人:西夏文
2006-06-15 00:17:59
|
|||
这里的程序是没有错误的,只是对于某个特殊的题目的,不是对于其他的题目,所以我也不会给出什么答案的,至于写程序吗?是不可能的,因为不太可能再次接触那个算法了 |
||||
|
- 评论人:西夏文
2006-06-15 00:14:20
|
|||
评论人:一品冰红茶 2006-06-14 15:18:50
|
||||
|
- 评论人:西夏文
2006-06-15 00:13:31
|
|||
直接赋值啊 |
||||
|
- 评论人:一品冰红茶
2006-06-14 15:18:50
|
|||
有没有人有《遗传算法在旅行商问题》的源程序啊!有请于我联系
|
||||
|
- 评论人:一品冰红茶
2006-06-14 15:15:35
|
|||
有没有人有《遗传算法在旅行商问题》的源程序啊!有请于我联系 |
||||
|
- 评论人:vfdff
2006-06-11 00:06:31
|
|||
double Upper_Array[Upper_Num][35]={
|
||||
|
- 评论人:xixiawen
2006-06-02 10:58:48
|
|||
不会吧,你这么简单的不会吗?那你还怎用复杂的东西编程!其实那个用MATLAB就可以解决了,干什么一定要遗传算法呢? |
||||
|
- 评论人:唯我独坏
2006-06-01 21:28:22
|
|||
作者 你能不能帮我解决一下这个遗传算法问题:
|
||||
|
- 评论人:西夏文
2006-05-25 23:36:27
|
|||
在这里有哪个题目的,需要的话留下联系方式,我尽力帮助了!
|
||||
|
- 评论人:西夏文
2006-05-25 23:33:07
|
|||
需要的见其他的思想算法,如有需要,留下联系方式,我会尽力解答 |
||||
|
- 评论人:西夏文
2006-05-25 23:25:55
|
|||
那好的,我上传一下遗传算法的思想,就是在未来的选择,选择最优秀的种子,在不断的选择之中,可以用模拟退火去选择最优的解,但是只是局部最优,不一定是最好的结果! |
||||
|
- 评论人:至诚致远
2006-05-25 20:40:56
|
|||
请问这个算法的题目是什么啊,能指点下吗 |
||||
|
- 评论人:xixiawen
2006-05-24 21:46:42
|
|||
其实那是我在建摸的时候对一到题目的算法,希望你只要理解意思,不要全部的看就知道了,遗传算法是一种结构,也是长用的算法,但是很落后!所以在整整比赛的时候不要用! |
||||
|
- 评论人:xixiawen
2006-05-24 21:46:04
|
|||
其实那是我在建摸的时候对一到题目的算法,希望你只要理解意思,不要全部的看就知道了,遗传算法是一种结构,也是长用的算法,但是很落后!所以在整整比赛的时候不要用! |
||||
|
- 评论人:greatbird007
2006-05-20 20:44:47
|
|||
作者的算法很清晰,不过我能看懂每个函数干吗用,却始终不明白该算法在解决什么问题,希望作者明示. |
||||
|
- 评论人:xixiawen
2006-04-14 18:49:36
|
|||
很多时候都是在一瞬间想出来,就是那些程序 |
||||
|
- 评论人:小高
2006-04-13 12:11:11
|
|||
想知道这个程序的题目是什么?能指点一下吗?有急用,谢谢 |
||||
|
- 评论人:xiaxiawen
2006-04-11 22:52:37
|
|||
自己去想啊 |
||||
|
- 评论人:xixiawen
2006-03-17 19:25:57
|
|||
这个好像在这个网站里面有题目的。 |
||||
|
- 评论人:84微笑的鱼
2006-03-17 18:07:44
|
|||
请问这个算法的题目是什么啊,能指点下吗 |
||||