#define _CRT_SECURE_NO_WARNINGS
#define iterations 100
#define operater >
#define mylength 100
#define demension 3
#define maxspeed 3
#define infinity 0x3f3f3f3f
#define mystart 0
#define myend 15
#define myw 100
#include<stdio.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
#include<Windows.h>
typedef struct node {
double historysolution;
double vector[demension];
double position[demension];
};
struct node bestnode;
//double racesolution = -infinity;
struct node nodes[mylength];
double myrand() {
return (double)(rand()%100)/100;
}
double fitness(double a, double b, double c) {
return 2 * a * a - 3 * b * b - 4 * a + 5 * b + c;
}
void copy(node &a, node b) {
a.historysolution = b.historysolution;
for (int i = 0; i < demension; i++) {
a.vector[i] = b.vector[i];
a.position[i] = b.position[i];
}
}
void __init__() {
bestnode.historysolution = -infinity;
for (int i = 0; i < mylength; i++) {
for (int j = 0; j < demension; j++) {
nodes[i].vector[j] = myrand()*maxspeed;
nodes[i].position[j] = mystart + myrand() * (myend - mystart);
}
nodes[i].historysolution = fitness(nodes[i].position[0], nodes[i].position[1], nodes[i].position[2]);
if (bestnode.historysolution < nodes[i].historysolution) {
copy(bestnode, nodes[i]);
}
}
}
void speed(double vector[demension]) {
double v = 0;
for (int i = 0; i < demension; i++) {
v += pow(vector[i], 2);
}
v = sqrt(v);
if (v > maxspeed) {
for (int i = 0; i < demension; i++) {
vector[i] /= v;
vector[i] *= myrand() * maxspeed;
}
}
}
void PSO() {
printf("初始种群发现的极值:%f\n",bestnode.historysolution);
double temp[demension] = { 0 };
double self[demension] = { 0 };
double myspeed[demension] = { 0 };
double score;
double rt = myrand();
double rs = myrand();
for (int i = 0; i < iterations; i++) {
for (int j = 0; j < mylength; j++) {
rs = myrand();
rt = myrand();
for (int k = 0; k < demension; k++) {
temp[k] = (bestnode.position[k] - nodes[j].position[k]) * rt;
self[k] = (bestnode.position[k] - nodes[j].position[k]) * rs;
myspeed[k] = temp[k] + self[k] + myw * nodes[j].vector[k];
}
speed(myspeed);
for (int k = 0; k < demension; k++)temp[k] = myspeed[k] + nodes[j].position[k];
bool Continue = true;
while (true) {
for (int k = 0; k < demension; k++) {
if (temp[k] > myend || temp[k] < mystart)Continue = false;
}
if (!Continue) {
Continue = true;
rs = myrand();
for (int k = 0; k < demension; k++)temp[k] *= rs;
}
else
break;
}
score = fitness(temp[0], temp[1], temp[2]);
if (score > nodes[j].historysolution)nodes[j].historysolution = score;
if (score > bestnode.historysolution)
copy(bestnode, nodes[j]);
for (int k = 0; k < demension; k++) {
nodes[j].position[k] = temp[k];
nodes[j].vector[k] = myspeed[k];
}
}
}
printf("%d次迭代后发现的极值:%f\n", iterations,bestnode.historysolution);
}
int main(void) {
srand(time(NULL));
__init__();
PSO();
return 0;
}
简单写了个粒子群兄弟们
最新推荐文章于 2024-05-16 23:45:01 发布