Advertisement
Guest User

Untitled

a guest
Dec 12th, 2019
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.95 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <ctime>
  4. #include <iomanip>
  5. using namespace std;
  6.  
  7. double F(double x, double y)
  8. { // возвращет значение функции
  9. return (sin(x) / (1 + x * x + y * y));
  10. }
  11.  
  12. struct point
  13. { // создание структуры точка
  14. public:
  15. double x, y; // поля структуры - координаты х и у
  16. public:
  17. point()
  18. {
  19. int min = -2; //границы допустимой области
  20. int max = 2;
  21. x = min + (double)(rand()) / RAND_MAX * (max - min); // инициализация полей структуры(генов) случайными числами
  22. y = min + (double)(rand()) / RAND_MAX * (max - min);
  23. }
  24. double Getfunc() { // метод возвращающий значение функции
  25. return (sin(x) / (1 + x * x + y * y));
  26. }
  27. };
  28.  
  29. void mutation(point Coords[4])
  30. { // функция мутации
  31. double eps = -0.1 + (double)(rand()) / RAND_MAX * 0.2; // генерация малой величины
  32. for (unsigned int i = 0; i < 3; i++)
  33. {
  34. Coords[i].x += eps; // прибавление случайной малой величины к каждому из генов(мутация)
  35. Coords[i].y += eps;
  36. }
  37. }
  38.  
  39. point sort(point Coords[4]) { // сортировка массива по убыванию значений функции приспособленности
  40. for (unsigned int i = 0; i < 4; i++)
  41. {
  42. for (unsigned int j = 1; j < 4; j++)
  43. {
  44. if (Coords[j].Getfunc() > Coords[j - 1].Getfunc())
  45. {
  46. swap(Coords[j], Coords[j - 1]);
  47. }
  48. }
  49. }
  50. return Coords[4];
  51. }
  52.  
  53. void Crossover(point Coords[4]) { // скрещиваниe
  54. point TmpCoords[4]; // создание вспомогательного массива точек
  55. sort(Coords); // сортировка исходного массива
  56. TmpCoords[0].x = Coords[1].x; TmpCoords[0].y = Coords[0].y; // скрещивание - 1 точка ,чья функция приспосоленности имеет наибольшее значение
  57. TmpCoords[1].x = Coords[2].x; TmpCoords[1].y = Coords[0].y; // дает свои гены 4 новым генам разных точек, 2 и 3 точки дают свои гены другим 4 генам
  58. TmpCoords[2].x = Coords[0].x; TmpCoords[2].y = Coords[1].y; // оставшихся точек
  59. TmpCoords[3].x = Coords[0].x; TmpCoords[3].y = Coords[2].y;
  60. mutation(TmpCoords); // мутация вспомгательного массива
  61. sort(TmpCoords); // и его сортировка
  62. for (int i = 0; i < 4; i++)
  63. { // присваиваем элементам массива элементы вспомогательного
  64. Coords[i] = TmpCoords[i];
  65. }
  66. }
  67.  
  68. int main()
  69. {
  70. srand(time(0));
  71. setlocale(LC_ALL, "Russian");
  72. point a, b, c, d;
  73. point Coords[4] = { a,b,c,d };
  74. int N = 0;
  75. while (N != 10)
  76. {
  77. double SumOfX = 0;
  78. double SumOfY = 0;
  79. double Max = 0;
  80. double SumOfZnach = 0;
  81. Crossover(Coords);
  82. N++;
  83. cout <<endl<< "--------------------------------------------------------------------------------";
  84. cout << endl << "Номер популяции :" << N << endl;
  85. for (int i = 0; i < 4; i++)
  86. {
  87. cout << "|" << "x = " << Coords[i].x << "||" << " y = " << Coords[i].y << "||" << " f = " << Coords[i].Getfunc() << "|" << endl << endl;
  88. if (Coords[i].Getfunc() > Max)
  89. {
  90. Max = Coords[i].Getfunc();
  91. }
  92. SumOfX += Coords[i].x;
  93. SumOfY += Coords[i].y;
  94. SumOfZnach += Coords[i].Getfunc();
  95. }
  96. cout << "------------------------------";
  97. cout << endl <<fixed << setw(10)<< "Среднее x=" << SumOfX / 4 << setw(10) << " Среднее y = " << SumOfY / 4 << endl;
  98. cout << setw(9) << "FIT=" << F(SumOfX / 4, SumOfY / 4);
  99. cout << setw(9) << "MaxFIT=" << Max;
  100. cout << setw(9) << "SrednFIT=" << (SumOfZnach) / 4;
  101. }
  102. cout << endl << "максимум равен F = " << Coords[0].Getfunc();
  103. cout << endl << endl;
  104. system("pause");
  105. return (0);
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement