MnZn遗传算法求调
查看原帖
MnZn遗传算法求调
609092
ben090302楼主2024/10/21 20:53

有没有什么参数的建议或者优化的建议或者给一组数据?

还是遗传过不了这道题

求救pwp

#include<bits/stdc++.h>
#define ldb long double
using namespace std;
const int N=1e5+5;
const int PO=1500;//种群大小
const int TIMES=200;//迭代次数
int n;
ldb CG=1000;
ldb X[N],Y[N],W[N];
int rdom(int l, int r) { // 产生从 l 到 r 之间的随机整数
    return rand() % (r - l + 1) + l;
}
ldb dbrdom(ldb l, ldb r) {
    return (ldb)rand() / RAND_MAX * (r - l) + l;
}
struct indiv{
    ldb x,y;//考虑取坐标作为染色体?emm  maybe
    ldb fit;
    bool operator<(indiv P)const{
        return fit<P.fit;
    }
    ldb get_fit(){
        ldb dick=0;
        for(int i=1;i<=n;i++){
            dick+=sqrt((x-X[i])*(x-X[i])+(y-Y[i])*(y-Y[i]))*W[i];
        }
        return dick;
    }
    indiv(ldb X,ldb Y){
        x=X,y=Y;
        fit=get_fit();
    }
    indiv mate(indiv papa){
        ldb Xx,Yy;
        if(rand()&1) Xx=x;
        else Xx=papa.x;
        if(rand()&1) Yy=y;
        else Yy=papa.y;
        indiv son(Xx,Yy);
        if(son.fit<fit and son.fit<papa.fit){return indiv(x,y);}
        return son;
    }
    void vari(){
        CG*=0.99;
        ldb cg=dbrdom(0,CG);
        if(rand()&1) cg=-cg;
        ldb Xx=x+cg;
        cg=dbrdom(0,CG);        
        if(rand()&1) cg=-cg;
        ldb Yy=y+cg;
        indiv New(Xx,Yy);
        // cerr<<Xx<<" "<<Yy<<"\n";
        if(New.fit<fit) x=Xx,y=Yy,fit=New.fit;
    }
};
ldb ans=INT_MAX,ansx,ansy;
int main(){
    srand(time(0));
    cin>>n;
    for(int i=1;i<=n;i++) cin>>X[i]>>Y[i]>>W[i];
    vector<indiv> P;
    for(int i=1;i<=PO;i++) P.push_back(indiv(rdom(-10000,10000),rdom(-10000,10000)));//    printf("%.3lf %.3lf\n",P[i-1].x,P[i-1].y);

    for(int ytxy=1;ytxy<=TIMES;ytxy++){
        sort(P.begin(),P.end());
        // cerr<<P[0].x<<" "<<P[0].y<<" "<<P[0].fit<<endl;
        if(P[0].fit<ans){
            ans=P[0].fit;
            ansx=P[0].x,ansy=P[0].y;
        }
        vector<indiv> _p; 
        for(int i=0;i<PO;i++) _p.push_back(P[i%30].mate(P[rand()%30]));
        for(int i=0;i<PO;i++){
            if(rand()%200==0) _p[i].vari(); 
        }
        P=_p;
    }
    printf("%.3Lf %.3Lf",ansx,ansy);
}
2024/10/21 20:53
加载中...