遗传算法


最近玩了一下boxcar2d,学习了下遗传算法,大佬都是写的三角形bmp遗传,我只会写点简单的

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<ctime>

using namespace std;

const int MaxnPopu=10001;
const int MaxnStringLen=101;
int PerNum=10;
int MaxnNum=100;

string target;
string NowPopu[MaxnPopu];

int Dif[MaxnPopu];

struct StringInfor{
    int Dif;
    string s;
    bool operator < (const StringInfor &b) const {
        return Dif<b.Dif;
    }
}SI[MaxnPopu];

char RandChar(){
    int opt=rand()%3;
    if(opt==0){
        return 'A'+(rand()%26);
    }else if(opt==1){
        return 'a'+(rand()%26);
    }else if(opt==2){
        return '0'+(rand()%10);
    }
}

int TurnChar(char a){
    if('A'<=a and a<='Z'){
        return a-'A'+1;
    }else if('a'<=a and a<='z'){
        return a-'a'+43;
    }else if('0'<=a and a<='9'){
        return a-'0'+105;
    }
}

char Varia(char a){
    if('A'<=a and a<='Z'){
        int ret=rand()%3+1;
        if('A'>a+ret or a+ret>'Z') return a-ret;
        if('A'>a-ret or a-ret>'Z') return a+ret;
        if(rand()%2){
            return a-ret;
        }else return a+ret;
    }else if('a'<=a and a<='z'){
        int ret=rand()%3+1;
        if('a'>a+ret or a+ret>'z') return a-ret;
        if('a'>a-ret or a-ret>'z') return a+ret;
        if(rand()%2){
            return a-ret;
        }else return a+ret;
    }else if('0'<=a and a<='9'){
        int ret=rand()%3+1;
        if('0'>a+ret or a+ret>'9') return a-ret;
        if('0'>a-ret or a-ret>'9') return a+ret;
        if(rand()%2){
            return a-ret;
        }else return a+ret;
    }
}

string RandString(){
    int len=rand()%MaxnStringLen;
    string ret;char ss[MaxnStringLen];
    memset(ss,0,sizeof(ss));
    for(int i=0;i<len;i++){
        ss[i]=RandChar();
    }
    ret=ss;
    return ret;
}

void Init(){
    for(int i=1;i<=MaxnNum;i++){
        NowPopu[i]=RandString();
    }
}

int Dis(char a,char b){
    return abs(TurnChar(a)-TurnChar(b));
}

int GetDif(string s1,string s2){
    int ret=0;
    ret+=(s1.size()-s2.size())*(s1.size()-s2.size())*1000;
    for(int i=0;i<max(s1.size(),s2.size());i++){
        if(i<s2.size() and i<s1.size())ret+=Dis(s1[i],s2[i]);
        else ret+=100;
    }
    return ret;
}

string Cross(string fa,string ma,int Sum1,int Sum2){
    int len1=fa.size(),len2=ma.size();
    int len=rand()%(max(len1,len2)+10)+1;
    string ret;char ss[101];
    memset(ss,0,sizeof(ss));
    for(int i=0;i<len;i++){
        if(rand()%1000<50){
            if(i>=len1){
                ss[i]=Varia(ma[i]);
                continue;
            } else if(i>=len2){
                ss[i]=Varia(fa[i]);
                continue;   
            } else {
                char tmp;
                if(i>=target.size())tmp='A';
                else tmp=target[i];
                int ch1=Dis(fa[i],tmp);
                int ch2=Dis(ma[i],tmp);
                ss[i]=Varia(ch1<ch2?fa[i]:ma[i]);
            }
        } else {
            if(i>=len1){
                ss[i]=ma[i];
                continue;
            } else if(i>=len2){
                ss[i]=fa[i];
                continue;   
            } else {
                char tmp;
                if(i>=target.size())tmp='A';
                else tmp=target[i];
                double ch1=Dis(fa[i],tmp);
                double ch2=Dis(ma[i],tmp);
                ss[i]=ch1<ch2?fa[i]:ma[i];
            } 
        }
    }
    ret=ss;
    return ret;
}

void Solve(){
    int MiniDif;
    int Geration=0;
    do{
        Geration++;
        MiniDif=0x7fffffff;
        cout<<"Now Geration is : "<<Geration<<endl;
        for(int i=1;i<=MaxnNum;i++){
            cout<<NowPopu[i]<<endl;
        }
        for(int i=1;i<=MaxnNum;i++){
            Dif[i]=GetDif(NowPopu[i],target);
            MiniDif=min(MiniDif,Dif[i]);
            SI[i]=(StringInfor){Dif[i],NowPopu[i]};
        }
        sort(SI+1,SI+MaxnNum+1);
        int Num=0;
        for(int i=1;i<=PerNum;i++){
            for(int j=i+1;j<=PerNum;j++){
                NowPopu[++Num]=Cross(SI[i].s,SI[j].s,SI[i].Dif,SI[j].Dif);
            }
        }
        for(int i=1;i<=5;i++){
            NowPopu[++Num]=SI[i].s;
        }
        for(int i=Num+1;i<=MaxnNum;i++){
            int opt1=rand()%MaxnNum+1;
            int opt2=rand()%MaxnNum+1;
            NowPopu[i]=Cross(SI[opt1].s,SI[opt2].s,SI[opt1].Dif,SI[opt2].Dif);
        }
        puts("------------------------------------------");
    }while(MiniDif);
    printf("Final Geration:%d",Geration); 
}
int main(){
    srand(time(NULL));
    cin>>target;
    cin>>MaxnNum;
    PerNum=MaxnNum*0.2;
    Init();
    system("pause");
    Solve();
    return 0;
}
优质内容筛选与推荐>>
1、随机数生成
2、[logstash-input-http] 插件使用详解
3、蹭你wifi后 我竟然干了这样的事
4、Python基础
5、功能完善的php上传类


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号