遗传算法求解多元函数的简单实现(1):求解函数最大值

遗传算法求解one_max问题
遗传算法求解one_max问题
one_max问题:
所谓的one_max就是指定任意长度的二进制串,当二进制串中的所有二进制数字都为1时,one_max就得解。用数学方法表示如下:(假设二进制串的长度为L)
也即最大化函数f(x)。
遗传算法:
遗传算法是模拟自然界生物的交配,基因的重组以及变异还有自然选择来进行求解最优化问题的一种算法。其间有大体包括genetic algorithm,evolution strategy,evolution programming 和 genetic programming。四种方法在基因重组和变异上各有其不同,从而可以用来解决不同的问题。笔者刚接触遗传算法,其差别也不是了解特别清楚。在one_max问题中,我们使用GA(genetic algorithm)。
GA是遗传算法的一个分支,其在variable operator上更侧重于recombination(重组)而不是mutation(变异)。在one_max问题中,由于我们使用的是二进制串,因而我们在recombination的时候采用0ne-point crossover的方法,也即在选定的双亲中在相同的点切一刀,交换切点之后的串从而得到它们的后代。
参数的设定:
population size = 100;
string size = 25,也即L=25;
crossover probability = 0.7
number = 100(设定一个最大的generation数,避免程序在找不到最优解的时候一直跑)
1:利用随机种子产生随机数
2:采用转轮盘的方法挑选出双亲
3:每两个相邻的双亲进行recombination
4:得到的后代进行遍历变异
5:将变异后的后代作为下一代的population
6:重复步骤2—到步骤5,一直到找到最优解或者迭代完成。
在上述步骤中,有几点是要注意的:
1):在这里我们采用generational model,即下一代的数量个当代的数量是相同的,然后整个下一代替换上一代。
2):转轮盘方法
在这里的转轮盘方法其实是基于population中每个个体的fitness来进行的。我们把某一代的population中的所有个体进行fitness函数的计算,在这里就是上面进行优化的函数,然后得到每个个体的fitness值,再基于这些值求出每个个体被选为下一代双亲的几率。得到这些几率之后就可以通过转轮盘的方法选出双亲。
我们在这里给出转轮盘方法的伪代码
假定(a1,a2,a3,...,al)是基于当代population得到的累积概率,即
令λ= μ=population,(λ是子代数量,μ是当代数量)。
Set current_number = 1;
WHILE(current_number&=μ) DO
Pick a random value γ uniformly from [0,1];
WHILE(a_i& γ) DO
Set i = i+1;
Set mating_pool[current_number] = parents[i];
Set current_number = current_number+1;
3):recombination
在双亲选取出来后,我们对相邻的两个双亲进行重组。我们之前设置一个crossover的作用就是在于,我们在进行重组的时候随机产生一个在0-1之间的浮点数,如果其小于我们的预设值0.7,那么就继续产生一个0-string size的整数值,将这个整数值所谓crossover的断点;如果几率大于我们的预设值,那么这两个双亲就不进行重组,直接作为下一代。
由于我们用的是GA,变异的几率比较小,通常我们在这里设置为string size的倒数。
没有更多推荐了,豆丁微信公众号
君,已阅读到文档的结尾了呢~~
利用遗传算法求解函数的最大值.doc——所有资料文档均为本人悉心收集,全部是文档中的精品,绝对值得下载收藏!
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
利用遗传算法求解函数的最大值.doc
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口初入计算机的新人
遗传算法简单例题的详解
int main()
srand((unsigned)time(NULL));
system("pause");
init函数:
void init()    //初始化 建立一个种群
for(int i=0;i&SIZE;i++)
tmp=randi(N);
for(int j=0;j&LEN;j++)
cur[i].x[j]=tmp%2;
//存储在一定范围内产生随机数被2取余的余数
tmp=tmp&&1;
cal_fitness();
randi函数:
int randi(int k)
return (int)(randd()*k+0.5);
//randi()函数生成均匀分布的伪随机整数,范围为imin--imax,如果没指定imin,则默认为1。r =randi(imax,n):生成n*n的矩阵
randd函数:
double randd()
return (double)rand()/RAND_MAX; // rand()函数是产生随机数的一个随机函数
//计算当前种群中各个个体的适应度
void cal_fitness()
for(i=0;i&SIZE;i++)
for(j=LEN-1;j&=0;j--) k=(k&&1)+cur[i].x[j];
//累加在一定范围内的余数
d=(double)k/N*3-1;
//d即为在该范围内的一个数值
cur[i].fitness=d*sin(10*PI*d)+2; //fitness代表该数所求的函数值
cur[i].fitsum=i&0?(cur[i].fitness+cur[i-1].fitsum):(cur[0].fitness);
//除第0个数之外求该数d所对应的函数值的和前一个的和
//遗传进化函数
while(cnt++&MAXGEN)
//进行换代操作
printf("%.6lf\n",max.fitness);
printcur();
ans=cur[0].
for(int i=1;i&SIZE;i++) ans=MAX(ans,cur[i].fitness);
// 找到适应度最大的值即为该函数的值
printf("%.6lf\n",ans);
tran函数:
void tran()
//找当前种群最优个体
max=cur[0];
for(i=1;i&SIZE-1;i++)
if(cur[i].fitness&max.fitness) max=cur[i];
for(int k=0;k&SIZE;k+=2)
//选择交叉个体
//选择交叉位置
pos=randi(LEN-1);
if(randd()&P_CORSS)
//如果小于交叉概率则进行 如果大于 则进行else
memcpy(next[k].x,cur[i].x,pos);
//直接把cur【i】.x
拷贝到 next【i】.x
memcpy(next[k].x+pos,cur[j].x+pos,LEN-pos);
//第pos位置进行复制
从j中第pos起 总共LEN-pos
复制上去 相当于交叉
memcpy(next[k+1].x,cur[j].x,pos);
memcpy(next[k+1].x+pos,cur[i].x+pos,LEN-pos);
同理 xj分别产生 一个交叉
memcpy(next[k].x,cur[i].x,LEN);
//直接把复制到下一代 基因型不改变
memcpy(next[k+1].x,cur[j].x,LEN);
if(randd()&P_MUTATION)
//如果小于则进行变异操作
pos=randi(LEN-1);
//产生随机数
确定变异的位置在len-1的范围内
next[k].x[pos]^=next[k].x[pos];
pos=randi(LEN-1);
//再次进行
next[k+1].x[pos]^=next[k+1].x[pos];
//在pos位置变为原来的平方
//找下一代的最差个体
min=next[0],j=0;
for(i=1;i&SIZE-1;i++)
if(next[i].fitness&min.fitness) min=next[i],j=i;
//下一代中适应度最低的值
//用上一代的最优个体替换下一代的最差个体
memcpy(cur,next,sizeof(cur));
cal_fitness();
//再次求新一代适应度
double p=randd();
//产生一个随机数
double sum=cur[SIZE-1].
//找到结尾数的最好的适应度
for(int i=0;i&SIZE;i++)
if(cur[i].fitsum/sum&p)
//然后从头到尾找到适应度 大于产生的随机数如果有则返回i
memcpy函数:
//拷贝函数
调用string 函数即可
//打印个体适应度和二进制编码
void print(node tmp)
printf("%.6lf",tmp.fitness);
for(int i=0;i&LEN;i++) printf(" %d",tmp.x[i]);
printf("\n");
//打印种群
void printcur()
for(int i=0;i&SIZE;i++) print(cur[i]);
用遗传算法求y=x*sin(10*pi*x)+2的最大值
精确到6位小数
pow(2,21)&3*1000000&pow(2,22)
编码的二进制长度为22
#include &stdio.h&
#include &string.h&
#include &stdlib.h&
#include &ctime&
#include &math.h&
#define N 3000000
#define PI 3.
#define MAX(a,b) ((a)&(b)?(a):(b))
#define SIZE
#define MAXGEN
#define P_CORSS 0.75
#define P_MUTATION 0.05
#define LEN 22
typedef struct node
char x[LEN];   //存储编码
double fitness,   //第一个为最适合  第二个适应度和
//构建一个结构体来存储
node cur[SIZE],next[SIZE],max,
没有更多推荐了,哪位大神能帮我写个程序,用遗传算法求解投资组合的最优比例。
[问题点数:50分]
本版专家分:0
CSDN今日推荐
本版专家分:0
本版专家分:0
匿名用户不能发表回复!|
CSDN今日推荐&>&遗传算法求函数最大值,C++实现
遗传算法求函数最大值,C++实现
上传大小:11KB
用C++实现的遗传算法求函数的最大值,可运行
综合评分:0
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有0条
ligaofeng007
综合评分:
积分/C币:5
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
遗传算法求函数最大值,C++实现
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
举报的资源分:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*详细原因:
遗传算法求函数最大值,C++实现

我要回帖

更多关于 遗传算法 罚函数 的文章

 

随机推荐