Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 工程数学软件 > MATLAB论坛
MATLAB论坛 一切MATLAB相关问题在此讨论。
回复
 
主题工具 显示模式
旧 2008-05-08, 23:19   #1
chege2002
初级会员
 
注册日期: 2008-04-13
年龄: 42
帖子: 1
声望力: 0
chege2002 正向着好的方向发展
默认 [求助]帮忙解决一个约束问题

麻烦各位帮忙解决一个问题
现在我程序中不知道怎么添加x1+x2<36这个约束条件
试了很多方法都无法实现
求各位帮帮忙吧
谢谢拉!


%matlab 遗传算法代码
clear all;
close all;
%遗传算法参数设定和初始化
M=80; %种群大小80个
T=100; %遗传运算得终止进化代数100代
CL=10; %二进制编码长度10位
F=0.75; %交叉概率F=0.75
Bi=0.001; %变异概率Bi=0.001
Max=36; %输入值的取值上限
Min=0; %输入值的取值下限
G=round(rand(M,CL*2)); %初始化,使其成为布尔型数值
NG=zeros(M,CL*2);
for k=1:1:T
T(k)=k;
for s=1:1:M
N=G(s,;
y1=0;y2=0;
N1=N(1:1:CL); %对x1进行解码,
for i=1:1:CL
y1=y1+N1(i)*2^(i-1);
end
x1=(Max-Min)*y1/(2^CL-1)+Min;
x1_G(k)=x1; %为了便于最后图形输出,而引进的类似指针型变量
N2=N(CL+1:1:2*CL); %对x2进行解码
for i=1:1:CL
y2=y2+N2(i)*2^(i-1);
end
x2=(Max-Min)*y2/(2^CL-1)+Min;
x2_G(k)=x2; %为了便于最后图形输出,而引进的类似指针型变量
F(s)=814.1*(x2+10)^2/(x1+x2+10)+1456.38*(x2+10)/(x1+x2+10)-19173154*x1/(x1+x2+10)^2+531.675*(x1+10)^2/(x1+x2+10)+956.25*(x1+10)/(x1+x2+10)- 12831767*x2/(x1+x2+10)^2; %目标函数表达式
%F(s)=x1.^2+x2.^2;
end
Fit=F;
[Order,Index]=sort(Fit); %将适应度从小到大进行排列
BF=Order(M); %选出适应度最大得值
BFI(k)=BF;
BG=G(Index(M),;
In=M; %保护5个最优个体
for i=1:1:5
BGG(i,=G(Index(In),;
In=In-1;
end
%采用赌盘选择法
Fit_Sum=sum(Fit); %将群体中全部个体适应度累加求和? _sum
%Fit_N=floor((Fit/Fit_Sum)*M); %产生一个0至? _sum之间的随机数fit_n
%floor(x)返回小于或等于x的最小整数值。X的绝对值一定要大于最大整数值
%从编号为1的个体开始逐个累加适应度
ada_sum=0;
for i=1:1:M %直到累加和>=fit_n,最后的累加就是复制个体
ada_sum=ada_sum+F(i);
end
for i=1M-5) %选择39次,最后一个个体留给历代最优解
r=rand*ada_sum; %随机产生一个数
ada_temp=0; %初始化累加值为0
j=1;
while(ada_temp<r)&(j<81)
ada_temp=ada_temp+F(j);
j=j+1;
end
if j==1
j=1;
else
j=j-1;
end
NG(i,=G(j,;
end
%Cn=ceil(2*CL*rand); %产生单点交叉起始位,
%ceil(x)返回大于或等于x的最小整数值。X的绝对值一定要小于最大整数值
for i=1:2M-5)
Rn=rand; %Rn为0-1之间的随机数
if F>Rn %交叉条件,F=0.6,Rn<0.6时就进行交叉运算
Cn=ceil(2*CL*Rn);
if or(Cn==0,Cn>=20)
continue;
end
for j=Cn:1:2*CL %随机交换部分染色体的基因,交换的位从Cn到末位止
temp=NG(i,j);
NG(i,j)=NG(i+1,j);
NG(i+1,j)=temp;
end
end
end
%Rs=4;%对第76位到第80位(即后五位)进行保优
%for i=1:1:5
%NG(M-Rs,=BGG(i,;
%Rs=Rs-1;
%end
%G=NG;
for i=1:1M-5) %变异运算
for j=1:1:2*CL
Mr=rand; %产生基本位变异位,同样Mr是0-1之间的数
if Bi>Mr %变异条件,只有当Mr<0.001时才会进行变异运算,保证
if NG(i,j)==0
NG(i,j)=1;
else
NG(i,j)=0;
end
end
end
end
Rs=4;%对第76位到第80位(即后五位)进行保优
for i=1:1:5
NG(M-Rs,=BGG(i,;
Rs=Rs-1;
end
G=NG;
end
k
Max=BF
x1
x2
subplot(2,1,2);plot(T,BFI); xlabel('次数');ylabel('最大值');
subplot(2,2,1);plot(T,x2_G); xlabel('次数');ylabel('X2');
subplot(2,2,2);plot(T,x1_G); xlabel('次数');ylabel('X1');
chege2002 当前离线   回复时引用此帖
旧 2008-05-29, 13:04   #2
fanxing39
高级会员
 
注册日期: 2007-12-02
年龄: 44
帖子: 303
声望力: 31
fanxing39 是一位成功的新星fanxing39 是一位成功的新星fanxing39 是一位成功的新星fanxing39 是一位成功的新星
默认

遗传算法的 工具箱 是
输入psearchtool回车,就可以调出来了
在网上找下它的用法的 资料看下,就可以了 ,遗传算法自己写程序的话,太麻烦了,这个工具箱7.0版本才有的
fanxing39 当前离线   回复时引用此帖
旧 2008-08-20, 02:20   #3
pslpsl
普通会员
 
注册日期: 2008-08-17
年龄: 36
帖子: 70
声望力: 20
pslpsl 是一个将要出名的人pslpsl 是一个将要出名的人
默认 回复: [求助]帮忙解决一个约束问题

当 x1+x2>=Max 时 对适应度值进行惩罚


代码:
    for s=1:1:M
    N=G(s,:);
    y1=0;y2=0;
    N1=N(1:1:CL); %对x1进行解码,
        for i=1:1:CL 
        y1=y1+N1(i)*2^(i-1);
        end
    x1=(Max-Min)*y1/(2^CL-1)+Min;
    x1_G(k)=x1; %为了便于最后图形输出,而引进的类似指针型变量
    N2=N(CL+1:1:2*CL); %对x2进行解码
        for i=1:1:CL
        y2=y2+N2(i)*2^(i-1);
        end
    x2=(Max-Min)*y2/(2^CL-1)+Min; 
    x2_G(k)=x2; %为了便于最后图形输出,而引进的类似指针型变量
    F(s)=814.1*(x2+10)^2/(x1+x2+10)+1456.38*(x2+10)/(x1+x2+10)-19173154*x1/(x1+x2+10)^2+531.675*(x1+10)^2/(x1+x2+10)+956.25*(x1+10)/(x1+x2+10)- 12831767*x2/(x1+x2+10)^2; %目标函数表达式
    %%%%%%%%%%%%%%
        if(x1+x2>=Max)
            F(s)=F(s)-99999;
        end
    %F(s)=x1.^2+x2.^2;
    end

在目标函数表达式后加入
代码:
        if(x1+x2>=Max)
            F(s)=F(s)-99999;
        end
即可
pslpsl 当前离线   回复时引用此帖
旧 2008-08-20, 02:22   #4
pslpsl
普通会员
 
注册日期: 2008-08-17
年龄: 36
帖子: 70
声望力: 20
pslpsl 是一个将要出名的人pslpsl 是一个将要出名的人
默认 回复: [求助]帮忙解决一个约束问题

这是某次运行的结果

代码:
k =

   100


Max =

 -1.8355e+005


x1 =

    4.8563


x2 =

   30.9326
pslpsl 当前离线   回复时引用此帖
旧 2008-08-20, 02:23   #5
pslpsl
普通会员
 
注册日期: 2008-08-17
年龄: 36
帖子: 70
声望力: 20
pslpsl 是一个将要出名的人pslpsl 是一个将要出名的人
默认 回复: [求助]帮忙解决一个约束问题

又一次的结果
代码:
k =

   100


Max =

 -1.8894e+005


x1 =

    2.5689


x2 =

   32.3754
pslpsl 当前离线   回复时引用此帖
旧 2008-08-20, 02:27   #6
pslpsl
普通会员
 
注册日期: 2008-08-17
年龄: 36
帖子: 70
声望力: 20
pslpsl 是一个将要出名的人pslpsl 是一个将要出名的人
默认 回复: [求助]帮忙解决一个约束问题

多次测试觉得算法需要改进
收敛性太差
pslpsl 当前离线   回复时引用此帖
回复


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码


相似的主题
主题 主题作者 版面 回复 最后发表
[分享]很好的GUI开发经验 dishengpiao MATLAB论坛 136 2020-04-05 07:16
[求助]请问simulink仿真有没有两个输入两个输出的运算放大器? seasky MATLAB论坛 0 2008-04-21 16:34
【求助】Laplace 滤波 s7401543 MATLAB论坛 0 2008-02-13 08:37
【讨论】Matlab动态显示的问题讨论 tqr591513792 MATLAB论坛 0 2007-12-20 14:50
【文章】仿真动画软件设计作品--电路开闭 yesman MATLAB论坛 0 2007-12-11 16:21


所有时间均为北京时间。现在的时间是 15:48


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.