要挑战是吧,进来!遗传算法的。

dtor 2005-04-12 12:40:29
遗传算法解方程:f(x) = x平方 + 2x + 1
...全文
250 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
晨星 2005-06-28
  • 打赏
  • 举报
回复
?害我?
robertnet 2005-04-17
  • 打赏
  • 举报
回复
学习一下,怎样才能用浮点编码的方法实现遗传算法呢?
dtor 2005-04-15
  • 打赏
  • 举报
回复
我晕哦,各位大哥!
loveisbug 2005-04-14
  • 打赏
  • 举报
回复
作业自己做,还“废话少说”,那么横。讨论归讨论,给源码了你还会来讨论吗?再说一般源码不都是拿银子来换的嘛。
晨星 2005-04-14
  • 打赏
  • 举报
回复
你不是说“废话少说要源码”吗?怎么又“讨论”起来了?到底要干啥啊?
dtor 2005-04-14
  • 打赏
  • 举报
回复
恳请高手指点!
dtor 2005-04-14
  • 打赏
  • 举报
回复
是作业啊,作业就不可以讨论?
  • 打赏
  • 举报
回复
原来是作业不会来废话的,无聊
dtor 2005-04-12
  • 打赏
  • 举报
回复
求min( f(x) )
dtor 2005-04-12
  • 打赏
  • 举报
回复
C++的有没有?
说废话没用,要源码。
挑战极限!
zoologist 2005-04-12
  • 打赏
  • 举报
回复

begin
for i:=1 to PopSize do
for j:=1 to CHROMLENGTH do
begin
p:=random(1000) / 1000.0; //这里控制随机发生变异
if p<Pm
then
begin
if population[i].chrom[j]='0'
then population[i].chrom[j]:='1'
else population[i].chrom[j]:='0';
end;
end;

end;

begin
selectionoperator;
crossoveroperator;
mutationoperator;
end;

procedure performevolution;
//进化
begin
if bestindividual.fitness>currentbest.fitness
then currentbest:=population[best_index]
else population[worst_index]:=currentbest;
end;

procedure outputtextreport;
var
i,j:integer;
sum:double;
average:double;
begin
{ sum:=0.0;
for i:=1 to PopSize do
sum:=population[i].value+sum;
average:=sum/PopSize;
write(generation);
writeln('avg=',average);
write('best=',currentbest.value,' ');
write('chromosome=');}

for j:=1 to popsize do
begin
write('No. ',j, ' ');
for i:=1 to length1 do
write(currentbest.chrom[i]);
write(' ');
for i:=length1+1 to length1+length2 do
write(currentbest.chrom[i]);
writeln(currentbest.fitness);
end;
write('generation=',generation);
readln;
end;
begin
generation:=1;
EvaluatePopulation;
while generation<MaxGeneration do
begin
generation:=generation+1;
generatenextpopulation;
EvaluatePopulation;
performevolution;

end;
outputtextreport;
end;

procedure done;
begin

end;{end of done}

begin
init;
main;
done;
end.
zoologist 2005-04-12
  • 打赏
  • 举报
回复
计算
f(x1,x2)=100*(x1^2-x2)^2+(1-x1)^2的

/***************************************************************/
* Simple Genetic Algorithm
* 2002/7/18
*
* 对于整体过程的说明
* main
* GenerateInitialPopulation //产生初始子代,本程序产生0,1 序列
* EvalutePopulation
* |
* |--------CalculateObjectValue //计算目标函数值
* |
* |--------CalculateFitnessValue //计算适应度
* |
* |--------FindBestAndWorstIndividual //计算最好与最差个体
*
* 以下循环到GENERATION代
* GenerateNextPopulation
* |
* |--------SelectOperator //选择操作
* |
* |--------CalculateFitnessValue //单点交叉
* |
* |--------FindBestAndWorstIndividual //变异操作
*
* EvalutePopulation //该函数同上
* .......
* .......
* .......
* PerformEvolution //遗传
* OutputTextReport //输出报告
* 循环结束
****************************************************************
{$N+} //打开8087,因为使用double
program SGA_pascal; //Simple Genetic Algorithm
const
PopSize=160; //Simple Genetic Algorithm
MAXIMIZATION=1; //最大标志
MINIZATION=2; //最小标志
Cmax=100;
Cmin=0;
LENGTH1=10; //第一个变量的遗传变量的长度
LENGTH2=10; //第二个变量的遗传变量的长度
CHROMLENGTH=LENGTH1+LENGTH2; //变量总长度
MaxGeneration=400; //最大遗传代数
Pc=0.6; //交叉概率
Pm=0.001; //变异概率
type
individual =record //个体结构
chrom:array[1..CHROMLENGTH] of char;
value:double;
fitness:double;
end;

var

generation :integer;
best_index :integer; //记录最优秀个体
worst_index :integer; //记录最劣质个体
bestindividual :individual; //当前代最优秀个体
worstindividual :individual; //当前代最差个体
currentbest :individual; //现在得到的最优秀个体
population :array[1..PopSize] of individual;
//种群空间
functionmode :integer; //最优化类型

procedure init; //初始化

procedure generateinitpopulation; //生成最先一代
var i,j:integer;
begin
randomize;
for i:=1 to PopSize do //种群大小
for j:=1 to CHROMLENGTH do //基因长度
if random(10)<5
then population[i].chrom[j]:='0' //以相同概率产生'0','1'
else population[i].chrom[j]:='1';

functionMode:=MAXIMIZATION; //最优化类型

end;

begin
generateinitpopulation;
end; {end of init}


procedure main;

procedure EvaluatePopulation;

function DecodeChromosome(s:string;strstart,strend:integer):longint;
//基因解码过程,对于本程序,是将2进制基因转化成10进制数值
var
decimal :longint;
temp :longint;
i :integer;
begin
decimal:=0;
temp:=1; //以左到右,权值升高
for i:=strstart to strend do
begin
if copy(s,i,1)='1' then decimal:=decimal+temp; //转化到十进制
temp:=temp*2;
end;
decodechromosome:=decimal;
end;

procedure calculateobjectvalue;
//计算目标函数值,本程序目前计算为f(x1,x2)=100*(x1^2-x2)^2+(1-x1)^2
var
i:integer;
temp1,temp2:longint;
x1,x2:double;
begin
for i:=1 to PopSize do
begin
temp1:=DecodeChromosome(population[i].chrom,1,LENGTH1);
//分别对两个基因解码
temp2:=DecodeChromosome(population[i].chrom,LENGTH1+1,LENGTH1+LENGTH2);
x1:=4.096*temp1/1023.0-2.048;
//从这里可以看出,本程序是采用均匀量化
x2:=4.096*temp2/1023.0-2.048;
population[i].value:=100*(x1*x1-x2)*(x1*x1-x2)+(1-x1)*(1-x1);
end;
end;

procedure calculatefitnessvalue;
//计算适应度
var
i :integer;
temp:double;
begin
for i:=1 to PopSize do
begin
if functionmode=MAXIMIZATION
then
if population[i].value+Cmin>0.0
then
temp:=Cmin+population[i].value
else
temp:=0.0
else
if functionmode=MINIZATION
then
if population[i].value<Cmax
then
temp:=Cmax-population[i].value
else
temp:=0.0;
population[i].fitness:=temp;
end;
end;

procedure findbestandworstindividual;
//找到当前种群中最优秀个体
var
i :integer;
sum:double;
begin
sum:=0.0;
bestindividual:=population[1];
worstindividual:=population[1];
for i:=2 to PopSize do
begin
if population[i].fitness>bestindividual.fitness
then
begin
bestindividual:=population[i];
best_index:=i;
end;
if population[i].fitness<worstindividual.fitness
then
begin
worstindividual:=population[i];
worst_index:=i;
end;
sum:=sum+population[i].fitness;
end;

if generation=1
then
currentbest:=bestindividual
else
if bestindividual.fitness>currentbest.fitness
then
currentbest:=bestindividual;
end;

begin
calculateobjectvalue;
calculatefitnessvalue;
findbestandworstindividual;
end;

procedure generatenextpopulation;

procedure selectionoperator;
//通过比例选择产生新的基因
var
i,index:integer;
p,sum:double;
cfitness:array[1..PopSize] of double;
newpopulation:array[1..popsize] of individual;
begin
sum:=0.0;
for i:=1 to PopSize do
sum:=sum+population[i].fitness;

for i:=1 to PopSize do
cfitness[i]:=population[i].fitness/sum;

for i:=2 to PopSize do
cfitness[i]:=cfitness[i-1]+cfitness[i];

for i:=1 to popsize do
begin
p:=random(1000) / 1000.0;
index:=0;
while p>cfitness[index] do
index:=index+1;
newpopulation[i]:=population[index];
end;

for i:=1 to popsize do
population[i]:=newpopulation[i];

end;

procedure crossoveroperator;
//单点交叉
var
i,j:integer;
index:array[1..PopSize] of integer;
point,temp:integer;
p:double;
ch:char;
begin

for i:=1 to PopSize do
index[i]:=i;
for i:=1 to PopSize do
begin
point:=random(PopSize-i+1);
temp:=index[i];
index[i]:=index[point+i];
index[point+i]:=temp;
end;
//随机选择一对个体

for i:=1 to PopSize do
begin
p:=random(1000) / 1000.0;
if p<Pc
then
begin
point:=random(CHROMLENGTH-1)+1;
for j:=point to CHROMLENGTH do
begin
ch:=population[index[i]].chrom[j];
population[index[i]].chrom[j]:=population[index[i+1]].chrom[j];
population[index[i+1]].chrom[j]:=ch;
end;
end;
i:=i+1;
end;
//单点交叉

end;

procedure mutationoperator;
//基因变异
var
i,j:integer;
p:double;

galois_godel 2005-04-12
  • 打赏
  • 举报
回复
很多讲遗传算法的书上都有这种例子的把,
你只要理解遗传算法的运行流程,这个又不困难的
zzwu 2005-04-12
  • 打赏
  • 举报
回复
求 min f(x)吗?这确实是一个不需要用遗传算法来解的问题。因为它有唯一极值(极小值),没有局部极值。
不过,用遗传算法来解当然也是可以的。
jaredcsdn 2005-04-12
  • 打赏
  • 举报
回复
常规算法比GA快,这种题目出了有什么意义
晨星 2005-04-12
  • 打赏
  • 举报
回复
对于解这个方程来说,牛顿迭代法就完全可以看成一种简化了的遗传算法。

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧