Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <ctime>
- #include <iomanip>
- using namespace std;
- double F(double x, double y)
- { // возвращет значение функции
- return (sin(x) / (1 + x * x + y * y));
- }
- struct point
- { // создание структуры точка
- public:
- double x, y; // поля структуры - координаты х и у
- public:
- point()
- {
- int min = -2; //границы допустимой области
- int max = 2;
- x = min + (double)(rand()) / RAND_MAX * (max - min); // инициализация полей структуры(генов) случайными числами
- y = min + (double)(rand()) / RAND_MAX * (max - min);
- }
- double Getfunc() { // метод возвращающий значение функции
- return (sin(x) / (1 + x * x + y * y));
- }
- };
- void mutation(point Coords[4])
- { // функция мутации
- double eps = -0.1 + (double)(rand()) / RAND_MAX * 0.2; // генерация малой величины
- for (unsigned int i = 0; i < 3; i++)
- {
- Coords[i].x += eps; // прибавление случайной малой величины к каждому из генов(мутация)
- Coords[i].y += eps;
- }
- }
- point sort(point Coords[4]) { // сортировка массива по убыванию значений функции приспособленности
- for (unsigned int i = 0; i < 4; i++)
- {
- for (unsigned int j = 1; j < 4; j++)
- {
- if (Coords[j].Getfunc() > Coords[j - 1].Getfunc())
- {
- swap(Coords[j], Coords[j - 1]);
- }
- }
- }
- return Coords[4];
- }
- void Crossover(point Coords[4]) { // скрещиваниe
- point TmpCoords[4]; // создание вспомогательного массива точек
- sort(Coords); // сортировка исходного массива
- TmpCoords[0].x = Coords[1].x; TmpCoords[0].y = Coords[0].y; // скрещивание - 1 точка ,чья функция приспосоленности имеет наибольшее значение
- TmpCoords[1].x = Coords[2].x; TmpCoords[1].y = Coords[0].y; // дает свои гены 4 новым генам разных точек, 2 и 3 точки дают свои гены другим 4 генам
- TmpCoords[2].x = Coords[0].x; TmpCoords[2].y = Coords[1].y; // оставшихся точек
- TmpCoords[3].x = Coords[0].x; TmpCoords[3].y = Coords[2].y;
- mutation(TmpCoords); // мутация вспомгательного массива
- sort(TmpCoords); // и его сортировка
- for (int i = 0; i < 4; i++)
- { // присваиваем элементам массива элементы вспомогательного
- Coords[i] = TmpCoords[i];
- }
- }
- int main()
- {
- srand(time(0));
- setlocale(LC_ALL, "Russian");
- point a, b, c, d;
- point Coords[4] = { a,b,c,d };
- int N = 0;
- while (N != 10)
- {
- double SumOfX = 0;
- double SumOfY = 0;
- double Max = 0;
- double SumOfZnach = 0;
- Crossover(Coords);
- N++;
- cout <<endl<< "--------------------------------------------------------------------------------";
- cout << endl << "Номер популяции :" << N << endl;
- for (int i = 0; i < 4; i++)
- {
- cout << "|" << "x = " << Coords[i].x << "||" << " y = " << Coords[i].y << "||" << " f = " << Coords[i].Getfunc() << "|" << endl << endl;
- if (Coords[i].Getfunc() > Max)
- {
- Max = Coords[i].Getfunc();
- }
- SumOfX += Coords[i].x;
- SumOfY += Coords[i].y;
- SumOfZnach += Coords[i].Getfunc();
- }
- cout << "------------------------------";
- cout << endl <<fixed << setw(10)<< "Среднее x=" << SumOfX / 4 << setw(10) << " Среднее y = " << SumOfY / 4 << endl;
- cout << setw(9) << "FIT=" << F(SumOfX / 4, SumOfY / 4);
- cout << setw(9) << "MaxFIT=" << Max;
- cout << setw(9) << "SrednFIT=" << (SumOfZnach) / 4;
- }
- cout << endl << "максимум равен F = " << Coords[0].Getfunc();
- cout << endl << endl;
- system("pause");
- return (0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement