历史上的今天
返回首页

历史上的今天

今天是:2025年07月21日(星期一)

正在发生

2020年07月21日 | 基于MSP430单片机的四旋翼 PID Control种群遗传算法

2020-07-21 来源:51hei

PID Control种群遗传算法:

#include "io430x14x.h"

#include "stdlib.h"

#include "sys.h"

#include "Control.h"



#define col_MAX 50                //群体空间大小

#define var_p 65                //变异概率:65 对应的变异概率约等于0.001,655 为0.01   rand():0-65535

#define epoch_MAX 200        //进化代数

void inherit(void)                //遗传进化PID

{

        unsigned int colony[col_MAX]={

        62267,15148,39769,31849,58411,49944,29915,58375 ,53831

        ,29144,40332,51900,60411,48378,11552,26588,61306,60089

        ,26887,58565, 3794,23125,53291,  646, 9102,13288,13023

        ,39570,17838,13029, 1001,48941,29169,61066,30539,27436

        ,55457,34416,13280,44049,54926, 1287,44647,24869,54512

        ,32952,46495,28107,19963,12429

        };

        unsigned int health[col_MAX];        //对应colony[] ,每个个体的适应值,

        unsigned int dad,mum,baby1,baby2;

        unsigned int mini_health,mini_id;

        unsigned int temp_health;

        unsigned char i,epoch;        //epoch 遗传代数

        mini_health = found(&colony[0],&health[0]);        //评估初始个体,并作适应值缩放,找出最小适应值

        for(epoch=0; epoch < epoch_MAX; epoch++) //开始进化

        {

                i = roulette(&health[0]);//轮盘赌转,返回数组下标

                dad = colony[i];

                i = roulette(&health[0]);//轮盘赌转,返回数组下标

                mum = colony[i];

                baby1 = dad&0xff;baby1 |= mum&0xff00;

                baby2 = mum&0xff;baby2 |= dad&0xff00;

                baby1 = variation(baby1);        //变异?

                baby2 = variation(baby2);

                temp_health = evaluating_unit(baby1);        //评估个体适应值

                if(temp_health > mini_health)

                {

                        mini_id = evaluating(&health[0]);        //取得最差适应值的个体id(数组下标)

                        colony[mini_id] = baby1;

                        health[mini_id] = temp_health - mini_health;

                }

                temp_health = evaluating_unit(baby2);        //评估个体适应值

                if(temp_health > mini_health)

                {

                        mini_id = evaluating(&health[0]);        //取得最差个体的适应值,及其id

                        colony[mini_id] = baby2;

                        health[mini_id] = temp_health - mini_health;

                }

        }

        while(1); //结束进化

}


#define ev_N 25

#define aim_value 300

uint evaluating_unit(uint unit)//评估个体适应值  顺便PWM输出

{

        uint ret=0,temp=0,max=0;

        uchar i=0;

        int uk=0;                                //PID增量

        redressal(pid, unit);        //根据个体,对基因进行解码  修改PID三个参数

        while(i        {

                        if(measured > desired)

                        {

                                temp = measured - desired;

                                if(temp > max)

                                        max=temp;        //最大超调量

                        }

                        else

                                temp = desired - measured;

                       

                        ret+=temp;

                        uk = (int)(PID_Posi(pid, measured, desired));        //PWM输出

                        M1 = speed[0] - uk;        //y轴

                        M3 = speed[0] + uk;        //y轴


                        i++;

                }

        }

        ret=65535/(ret/ev_N+max);

        return ret;        //返回适应值

}


void redressal(float* pid,uint colon)

{

        pid[0]=(float)((colon&0xFC00)>>10)*5.0/63;        //[0:0.079:5]

        pid[1]=(float)((colon&0x3E0)>>5)*0.1/31.0;        //[0:0.0032:0.1]

        pid[2]=(float)(colon&0x1F)/31.0;                        //[0:0.032:1]

}


uint found(uint colony,uint health)        //计算初始群体适应值,并找出最小值

{

        uchar i;

        uint mini=0xff;

        for(i=0;i        {

                *(health+i) = evaluating_unit(*(colony+i));        //评估个体适应值

                if(*(health+i)                        mini=*(health+i);

        }

        for(i=0;i                *(health+i)-=mini;

        return mini;

}


uchar roulette(uint health)

{

        uchar i;

        uint temp=0;

        i=(uchar)(rand()%col_MAX); //0~(col_MAX-1) 随机选择起点

        while(1)

        {

                if((col_MAX-1)==i) //实现首尾相接

                        i=0;

               

                temp+=*(health+i); //累加适应值

                if (temp>1200)

                        return i;

                i++;

        }

}


uchar evaluating(uint health)        //取得最小适应值的个体id(数组下标)

{

        uchar i,id;

        uint mini=0xffff;

        for(i=0;i        {

                if(*(health+i)                {

                        mini=*(health+i);

                        id=i;

                }

        }

        return id;

}


uint variation(uint baby)        //对基因进行变异

{

        uchar i;

        for(i=0;i<16;i++)

        {

                if(rand()                {

                        if(0==(baby&(1<                                baby|=(1<                        else

                                baby &= ~(1<                }

推荐阅读

史海拾趣

Gore公司的发展小趣事
由于电压应力降低,开关器件的开关损耗也相应减少,系统的发热量也较少。
广州基安彼(GMB)公司的发展小趣事
输出电压的阶梯数增多,波形更加接近正弦波,输出电压和电流的谐波含量大幅减少,提高了电能质量。
Fibrefab Limited公司的发展小趣事

面对全球环境问题日益严峻的现状,Fibrefab积极响应环保号召,推动绿色生产和可持续发展。公司采用环保材料和生产工艺,降低产品生产和使用过程中的能耗和排放。同时,Fibrefab还积极参与环保公益活动和社会责任项目,为保护环境贡献自己的力量。这一举措不仅提升了Fibrefab的企业形象和社会责任感,也为其长期发展奠定了坚实基础。

3L Electronic Corporation公司的发展小趣事

面对日新月异的电子科技,3L Electronic Corporation始终坚持以技术创新为核心竞争力。公司投入大量研发资源,不断推出具有市场竞争力的新产品。从传统的电子零组件到智能电子设备,再到物联网解决方案,3L的产品线不断升级,满足了市场的多样化需求。

启攀微电子(Chiphomer)公司的发展小趣事

在知识产权保护方面,启攀微电子高度重视自主创新能力的培养和提升。公司成立了专门的知识产权保护团队,负责申请和管理公司的专利和集成电路布图设计专有权。截至目前,公司累计申请专利已达26项,集成电路布图设计专有权54项。这些知识产权的取得不仅保护了公司的技术成果和市场地位,也为公司的持续创新提供了有力的支持。

Heidenhain Corp公司的发展小趣事

在半导体制造这一高端电子领域,海德汉公司也展现出了其强大的技术实力。某国际领先的半导体制造商在研发新一代芯片制造设备时,选择了海德汉的高精度编码器作为关键部件。海德汉编码器以其卓越的稳定性和精度,确保了芯片制造过程中的高精度定位和运动控制,为半导体制造商提供了可靠的技术保障。这一合作不仅提升了半导体制造设备的整体性能,也进一步巩固了海德汉在高端电子制造领域的市场地位。

问答坊 | AI 解惑

H组的进来讨论啊

本帖最后由 paulhyde 于 2014-9-15 09:40 编辑 国赛H组兄弟一起合作吧!方案见图 [ 本帖最后由 yan131423yong 于 2009-9-2 19:19 编辑 ]  …

查看全部问答>

求助:2.4GHz无线通信距离不够,怎么加放大环节啊?

大家好,我毕设做的是nRF2401和24LE1的射频通信,我们做好的板子可以通信20米左右吧,但是要求是100米。 请大家帮帮忙想想办法,怎么办才能加大通信半径呢?最常见可靠的方法是什么? 我上网查了查,是说加PA,我对这个也不懂,请指教什么是PA 怎 ...…

查看全部问答>

想作一个船舶的Ais信号接收器

接收距离30海里左右就可。 会作的请联系QQ: 187365420   恰谈详情和价格…

查看全部问答>

建了个Q群,关于WinCE6.0\VS2005(C++)开发的,有共同工作或兴趣的可以加下,共同进步,群号 34551811

建了个Q群,关于WinCE6.0\\VS2005(C++)开发的,有共同工作或兴趣的可以加下,共同进步,群号   34551811 …

查看全部问答>

【开发板之家】快递那点事——我的元旦假期啊o(╯□╰)o

  元旦过去了,本来挺高兴的。也有不少的销量,但是现在碰到的事情让人感觉很无奈,甚至是很愤怒。在一号的时候有个客户要来买我们的板子。一个特价的板子599 ARM11的tiny6410快递的费用是10块钱,我们默认的是圆通。一般的时候我们都是在柜台 ...…

查看全部问答>

编写上位机的软件都有那些啊?

请问可以编写上位机的软件都有那些啊?那种入手操作比较快,谢谢各位大侠的帮助!…

查看全部问答>

基于Hercules 的工业“安全”控制系统-RS485,CAN通讯原理图

基于Hercules 的工业“安全”控制系统-RS485,CAN通讯原理图   …

查看全部问答>

各位大侠,同型号不同尾缀的两个芯片什么区别,急!在线等

用了一个稳压模块,型号是LT1964ES5,芯片上的印字是LTVY,后来公司又进了一批芯片,上面印字是LTVX,不知是否可以通用,我查了一下资料,这两种不同印字的芯片脚位定义只有3脚不同,LTVY印字的是SHDN上面有个杠,LTVX的3脚是BYP,小弟才疏学浅,恳 ...…

查看全部问答>