有没有什么参数的建议或者优化的建议或者给一组数据?
还是遗传过不了这道题
求救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);
}