首页 > 编程知识 正文

matlab求多元函数最大值程序,matlab求函数在区间最大值

时间:2023-05-03 08:33:38 阅读:114887 作者:2721

从最近的遗传算法来看,这是经典的优化算法。 我们可以将实际工程问题抽象为数学问题,转化为含有一些未知数的函数及其相应的约束。 而且,在这些制约下成为求出该函数的最大值或最小值的问题。 求最大值或最小值需要遗传算法、粒子群算法、蚁群算法、模拟退火算法等优化算法。 例如,机器中装配线的布局问题是,在知道产品的生产节拍、产品的种类、每个产品的组装工序和优先顺序、每个组装工序的运转时间的基础上,如果站的数量最少,则站的数量最少,意味着设置面积最小,且意味着工厂的能耗最低,这个问题是根据产品的组装要求将这些信息抽象到数学模型中,在这个数学模型中将工作站的数量设定为未知数,可以用遗传算法求出,这次试着用遗传算法来计算函数的最大值网上有几个相似的例子,经过我的调查和调试,或多或少在逻辑上或语法上有错误。 经过我不断的修改和调试,我终于调整了。 进入下一个代码!

2016-2-29上传16:56

单击文件名下载附件

下载积分: G硬币-1

该压缩文件在以下函数txt文本模式下,由于是最后三速函数,因此放在论坛上时会出现表情符号。 在这里上传到论坛。

主题:求出以下函数的最大值,f(x )=10 ) sin (5x )7) cos (4x ),其中x (0,10 )。

%Name:main.m

%主函数

清除器

clf

popsize=20; %组大小

chromlength=10; %字符串长度(个体长度)

pc=0.6; %交叉概率

pm=0.001; %变异概率

pop=initpop(popsize,chromlength ); %随机生成初始群体

for i=1:20是反复次数

[objvalue]=calobjvalue(pop ); %计算目标函数

fitvalue=calfitvalue(objvalue ); 计算%组内各个体的适应度

[newpop]=selection(pop,fitvalue; %复制

[newpop]=crossover(pop,pc ); %交叉

[newpop]=mutation(pop,pm ); %变异

[bestindividual,bestfit]=best(pop,fitvalue ); 求%群体中适应值最大的个体及其适应值

y(I )=max ) bestfit;

n(I )=i;

pop5=bestindividual;

x(I )=译码字符(pop 5,1,字符长度) *10/1023; %回转十进制

pop=newpop;

结束

FPlot('10*sin )5*x )7*cos )4*x ),[0 10]

霍尔德on

plot(x,y,' r* ) )

霍尔德关闭

[zindex]=max(y; %计算最大值及其位置

x5=x(index ) %与计算最大值对应的x值

y=z

%Name: initpop.m

%初始化

函数pop=init pop (popsize,chromlength ) ) ) ) )。

pop=round(rand ) popsize,chromlength ); % rand随机生成各单元为{ 0,1 }行数为popsize、列数为chromlength的矩阵,

% round舍入矩阵中的每个单元格。 这样出生的初期种群。

%Name: decodechrom.m

虽然这是在将%二进制代码转换为十进制代码之前对二进制位的剪切,但实际上,如果您知道这个主题,则可以看到,相对于这个例题,此函数的功能是完全可以忽略的

function pop2=译码chrom (pop、spoint、length ) )。

pop1=pop(:spoint:spoint length-1 );

pop2=解码二进制(pop 1;

%Name: decodebinary.m

%将二进制文件转换为十进制文件

function pop2=解码二进制(pop )

[px,py]=size(pop ); 求出pop的行数和列数

for i=1:py

pop1(3360,I )=2.^ ) py-I ).*pop ) :I );

结束

pop2=sum (pop 1,2 ); 求出pop1各行的和

%Name: calobjvalue.m

实现%目标函数的计算

function [ obj value ]=calobjvalue (pop )

temp1=译码铬(pop,1,10 ); %对于每个pop

行转化成十进制数

x=temp1*10/1023; %将二值域 中的数转化为变量域 的数

objvalue=10*sin(5*x)+7*cos(4*x); %计算目标函数值

%Name:calfitvalue.m

%计算个体的适应值

function fitvalue=calfitvalue(objvalue)

[px,py]=size(objvalue);

for i=1:px

if objvalue(i)>0

temp=objvalue(i);

else

temp=0.0;

end

fitvalue(i)=temp;

end

fitvalue=fitvalue';

%Name: selection.m

%选择复制

function [newpop]=selection(pop,fitvalue)

totalfit=sum(fitvalue); %求适应值之和

fitvalue=fitvalue/totalfit; %单个个体被选择的概率

fitvalue=cumsum(fitvalue); %如 fitvalue=[1 2 3 4],则 cumsum(fitvalue)=[1 3 6 10]

[px,py]=size(pop);

ms=sort(rand(px,1)); %从小到大排列

fitin=1;

newin=1;

while newin<=px

if(ms(newin))

newpop(newin)=pop(fitin);

newin=newin+1;

else

fitin=fitin+1;

end

end

3.png (16.93 KB, 下载次数: 3)

2016-2-29 16:54 上传

1.png (18.21 KB, 下载次数: 3)

2016-2-29 16:50 上传

2.png (16.1 KB, 下载次数: 4)

2016-2-29 16:50 上传

以上就是这个题目用遗传算法的解题代码了,绝对能够调试通过,只不过遗传算法是一种激励式的算法,它只有在一定概率的情况下能求得全局最优解,一般是求得局部最优解,所以这种算法的最终结果只是个参考的解,如何提高解的最优性,是无数专家学者研究的热点,对于这里例题,大家可以通过增加繁殖的代数来缓解这个问题,这个代码中只繁衍了20代,我亲自试过了,如果繁衍200代,或者2000代,甚至20000代,精度会有一定提高的。

这个代码可以适用于几乎所有一元函数的求最大值和最小值问题,这是将几个关键的地方修改一下就可以,如果是二元函数或者是多元函数的话,则需要改动的大一些,但是大部分代码都是可以直接用的,尤其是遗传过程中的,选择、交叉、变异过程,在这里代码逻辑很精彩。读者可以细细品味。

下面给大家截个最后结果图吧:

QQ图片20160229163050.jpg (84.76 KB, 下载次数: 3)

2016-2-29 16:31 上传

有兴趣的找我讨论啊!我们共同进步!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。