{"id":318871,"date":"2021-03-02T09:01:13","date_gmt":"2021-03-02T09:01:13","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=318871"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=318871","title":{"rendered":"\u0413\u0435\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u043b\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0439 \u0441\u0442\u0440\u043e\u043a \u0432 \u0440\u0443\u043a\u043e\u043f\u0438\u0441\u043d\u043e\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p><strong>\u0413\u0435\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c (GA)<\/strong><\/p>\n<p>\u0413\u0435\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c &#8212; \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440.&nbsp;\u041f\u043e\u0434 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c GA, \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c \u043a \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u043e\u0432\u044b\u0445.&nbsp;GA \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 \u0442\u0435\u043e\u0440\u0438\u0438 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438 \u0414\u0430\u0440\u0432\u0438\u043d\u0430.&nbsp;\u042d\u0442\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0443\u0442\u0435\u043c \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0438 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.&nbsp;\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, GA \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0432\u043d\u043e\u0441\u0438\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0441\u0432\u043e\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u043b\u0443\u0447\u0448\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0437\u043d\u0430\u0442\u044c <a href=\"https:\/\/towardsdatascience.com\/introduction-to-optimization-with-genetic-algorithm-2f5001d9964b\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p><strong>\u0426\u0435\u043b\u044c<\/strong><\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u043b\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0439 \u0441\u0442\u0440\u043e\u043a \u0432 \u0440\u0443\u043a\u043e\u043f\u0438\u0441\u043d\u043e\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435(<a href=\"https:\/\/fooonts.at.ua\/_ph\/1\/802017170.jpg\" rel=\"noopener noreferrer nofollow\">\u0440\u0438\u0441. 1<\/a>), \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043e\u0431\u0440\u0435\u0437\u0430\u043d\u0438\u0439 \u0441\u0442\u0440\u043e\u043a, \u043d\u0435 \u043e\u0431\u0440\u0435\u0437\u0430\u043b\u0438 \u043d\u0438\u0436\u043d\u044e\u044e \u0438\u043b\u0438 \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0447\u0430\u0441\u0442\u044c \u0431\u0443\u043a\u0432 (\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u0440\u0443\u043a\u043e\u043f\u0438\u0441\u043d\u044b\u0435 \u0431\u0443\u043a\u0432\u044b \u0440, \u0432, \u0431, \u0434, \u0437 \u0438 \u0442.\u0434.).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d12\/0bb\/dfe\/d120bbdfe13f69f7d6fa000ce48ce2bd.jpg\" alt=\"\u0420\u0438\u0441. 1 \u041e\u0431\u0440\u0430\u0437\u0435\u0446\" title=\"\u0420\u0438\u0441. 1 \u041e\u0431\u0440\u0430\u0437\u0435\u0446\" width=\"1131\" height=\"1600\"><figcaption>\u0420\u0438\u0441. 1 \u041e\u0431\u0440\u0430\u0437\u0435\u0446<\/figcaption><\/figure>\n<h2>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p><strong>Preprocessing <\/strong><\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043d\u0443\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u0433\u0434\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u043d\u0438\u044e(\u0438\u043d\u0434\u0438\u0432\u0438\u0434). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043b \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438(\u0440\u0438\u0441. 2. \u041f\u043e \u0441\u0443\u043c\u043c\u0435 \u0446\u0432\u0435\u0442\u043e\u0432 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u0435\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 <strong>\u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0431\u0435\u043b\u0430\u044f, <\/strong>\u0442\u043e \u0441\u0443\u043c\u043c\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u0430 255) \u043f\u043e \u0432\u044b\u0441\u043e\u0442\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438. \u0427\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u044e, \u0442\u043e\u0433\u0434\u0430 \u0431\u0435\u043b\u044b\u0439 \u0446\u0432\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d \u043d\u0443\u043b\u044e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9a4\/fe4\/570\/9a4fe457057e0aa6cfc7e67ed141cc3a.png\" alt=\"\u0420\u0438\u0441. 2\" title=\"\u0420\u0438\u0441. 2\" width=\"549\" height=\"467\"><figcaption>\u0420\u0438\u0441. 2<\/figcaption><\/figure>\n<p>\u042d\u0442\u043e \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0441\u0443\u043c\u043c\u0443 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043f\u0438\u043a\u043e\u0432. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c(\u0440\u0438\u0441. 3) \u044d\u0442\u0443 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%93%D0%B0%D1%83%D1%81%D1%81%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0433\u0430\u0443\u0441\u0441\u0430<\/a>(\u0435\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u044b). \u0422\u0430\u043a \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u043e\u0447\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0433\u0434\u0435 \u043f\u0440\u0435\u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0447\u0435\u0440\u043d\u044b\u0439 \u0438\u043b\u0438 \u0431\u0435\u043b\u044b\u0439 \u0446\u0432\u0435\u0442.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/86e\/981\/823\/86e9818235b54bb455f01f3092efcd95.png\" alt=\"\u0420\u0438\u0441. 3\" title=\"\u0420\u0438\u0441. 3\" width=\"549\" height=\"471\"><figcaption>\u0420\u0438\u0441. 3<\/figcaption><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u043d\u0438\u0438 \u043f\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c(\u0441\u0438\u043d\u044f\u044f) \u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c(\u0437\u0435\u043b\u0435\u043d\u0430\u044f) \u0442\u043e\u0447\u043a\u0430\u043c \u043f\u043e \u044d\u0442\u043e\u0439 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043d\u0438\u0436\u043d\u044f\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430(\u0440\u0438\u0441. 4)<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/28c\/804\/ba4\/28c804ba4e7a4d70d3f2275860439144.jpg\" alt=\"\u0420\u0438\u0441. 4\" title=\"\u0420\u0438\u0441. 4\" width=\"2480\" height=\"3508\"><figcaption>\u0420\u0438\u0441. 4<\/figcaption><\/figure>\n<p>\u041c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u0437\u0435\u043b\u0435\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438, \u043d\u043e \u043a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u043e\u043d\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442 \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0438\u043b\u0438 \u043d\u0438\u0436\u043d\u044e\u044e \u0447\u0430\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u043a\u0432, \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0433\u0435\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b. \u0421\u0438\u043d\u0438\u0435 \u043b\u0438\u043d\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043b\u0443\u0436\u0438\u0442\u044c \u043d\u0430\u043c, \u043a\u0430\u043a \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0434\u043b\u044f \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u043e\u0432, \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u043d\u0438\u0438.<\/p>\n<p><strong>\u0413\u0435\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c<\/strong><\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u0442\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <a href=\"https:\/\/habr.com\/ru\/post\/37576\/#:~:text=%D0%95%D1%81%D0%BB%D0%B8%20%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%D0%B8%D1%82%D1%8C%20%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%BE%2C%20%D0%BF%D0%BE%D0%BB%D0%B8%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC%20%E2%80%94%20%D1%8D%D1%82%D0%BE,%D1%80%D0%B0%D1%81%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B8%D0%BC%20%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BF%D0%BE%D0%BB%D0%B8%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC%D0%B0%20%D0%BD%D0%B0%20%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B5.\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c<\/a>:<\/p>\n<pre><code class=\"python\">from abc import abstractmethod, abstractproperty   class GeneticAlgorithm():     \"\"\"Genetic Algorithm Interface.\"\"\"      @abstractmethod     def create_population(self):         pass      @abstractmethod     def selection(self):         pass      @abstractmethod     def mutation(self):         pass      @abstractmethod     def cross(self):         pass       @abstractmethod     def call(self):         pass<\/code><\/pre>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<ul>\n<li>\n<p>create_population &#8212; \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p>selection &#8212; \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0442\u0431\u043e\u0440\u0430;<\/p>\n<\/li>\n<li>\n<p>mutation &#8212; \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043c\u0443\u0442\u0430\u0446\u0438\u0438;<\/p>\n<\/li>\n<li>\n<p>cross &#8212; \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>call &#8212; \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u0435\u0434\u0443\u0449\u0438\u0435 3 \u0444\u0443\u043d\u043a\u0446\u0438\u0439;<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0430. \u0418\u043d\u0434\u0438\u0432\u0438\u0434 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">import numpy as np import random  class Individ:     \"\"\"Generate a new individ.\"\"\"          def __init__(self, y1, y2, length):            self.length = length            self.A=np.random.randint(y1, y2, self.length)    # Declare the attribute \"A\" of our individ (this will be the line 010..101).         self.fit=0                                       # Declare the attribute \"fit\" of the individ (this will be the sum of the elements of our line 010..101) (for now, we will assign it the value 0)     <\/code><\/pre>\n<p>\u041a\u043b\u0430\u0441\u0441 Individ \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440 \u0445\u0440\u043e\u043c\u043e\u0441\u043e\u043c, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u044f.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9D%D0%B0%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)#:~:text=inheritance)%20%E2%80%94%20%D0%BA%D0%BE%D0%BD%D1%86%D0%B5%D0%BF%D1%86%D0%B8%D1%8F%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%2D%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE,%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D0%BD%D0%BE%D0%BC%D1%83%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8E%20%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F.\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435<\/a> \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u0438, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u043e\u0432, \u0434\u043b\u0438\u043d\u0443 \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u043e\u0432 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445 \u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0432 \u0441\u0435\u0440\u044b\u0445 \u0442\u043e\u043d\u0430\u0445.<\/p>\n<pre><code class=\"python\">class SimpleSegmentationGA(GeneticAlgorithm):     \"\"\"Genetic Algorithm Implementation.\"\"\"      def __init__(self, pop_num, lenght, delta_x, gray):         self.pop_num = pop_num         self.lenght = lenght    # Length of individ.         self.delta_x =  delta_x # Value of h.         self.gray = 256 - gray # Inversion. <\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f create_population \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u0438.<\/p>\n<pre><code class=\"python\">def create_population(self, y1, y2):   \"\"\"Creates a population, Dad, Mom and 4 sons\"\"\"    self.y1 = y1   self.y2 = y2   self.population = []                                               # Declare an array \"population\" in which we will store a population of 5 individuals.   for i in range(self.pop_num):                c=Individ(self.y1, self.y2, self.lenght)                       # Create a new individual.     self.population.append(c)                                      # Add the i-th unique individual to the array (fill in our population)       self.mother = Individ(self.y1, self.y2, self.lenght)               # Initialize the variables with which we will work: mom, dad, 4 sons ..     self.father = Individ(self.y1, self.y2, self.lenght)                          self.son1 = Individ(self.y1, self.y2, self.lenght)                            self.son2 = Individ(self.y1, self.y2, self.lenght)     self.son3 = Individ(self.y1, self.y2, self.lenght)     self.son4 = Individ(self.y1, self.y2, self.lenght)     self.par_and_sons = []                                             #.. and an array of individs \"Parents and Children\" in which we will store      for j in range(self.pop_num*3):                                    # Initialize our array of \"Parents and Sons\" with random individs.       self.par_and_sons.append(Individ(self.y1, self.y2, self.lenght))<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f create_population \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 4 \u0441\u044b\u043d\u043e\u0432\u0435\u0439.<\/p>\n<p> \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0431\u044b\u043b\u0438 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u00ab\u0441\u0435\u043c\u044c\u0438\u00bb \u0438\u0437 \u043e\u0441\u043e\u0431\u0435\u0439, \u0434\u043b\u044f \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u044f, \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u0440\u0435\u0441\u0442\u0438\u0442\u044c \u0438\u0445 \u0445\u0440\u043e\u043c\u043e\u0441\u043e\u043c\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0435\u0442\u0435\u0439 \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u0445\u0440\u043e\u043c\u043e\u0441\u043e\u043c\u0430\u043c\u0438. \u0424\u0443\u043d\u043a\u0446\u0438\u044f cross \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">def cross(self):   \"\"\"Crosses the best individs with each other.\"\"\"    for i in range(self.pop_num):                                      # Put in the first pop_num elements of the \"Parents and Sons\" array our entire input population.     self.par_and_sons[i].A=self.population[i].A.copy()      random.shuffle(self.population)                                    # Shuffle population.      tt=0                                                               # The counter that is needed to implement a non-trivial crossing.     for s in range(0,self.pop_num,2):                                  # From 0 to pop_num with step 2. That is. here we take pop_num \/ 2 pairs of parents.       self.mother.A=self.population[tt+int(self.pop_num\/2)].A        # Let the last pop_num \/ 2 individuals of our population be our mothers.       self.father.A=self.population[tt].A                            # And let first pop_num \/ 2 individuals of our population be dads.        tt=tt+1           ran=random.random()        for n in range(self.lenght):                                   # Crossover.         if random.random()&gt;0.5:           self.son1.A[n] = self.father.A[n]           self.son2.A[self.lenght-1-n] = self.father.A[n]           self.son3.A[n] = self.mother.A[n]           self.son4.A[self.lenght-1-n] = self.mother.A[n]         else:           self.son1.A[n] = self.mother.A[n]           self.son2.A[self.lenght-1-n] = self.mother.A[n]           self.son3.A[n] = self.father.A[n]           self.son4.A[self.lenght-1-n] = self.father.A[n]          self.par_and_sons[self.pop_num+2*s].A = self.son1.A.copy()         self.par_and_sons[self.pop_num+2*s+1].A = self.son2.A.copy()         self.par_and_sons[self.pop_num+2*s+2].A = self.son3.A.copy()         self.par_and_sons[self.pop_num+2*s+3].A = self.son4.A.copy()<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043c\u0443\u0442\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0434\u0435\u0442\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435 \u0445\u0440\u043e\u043c\u043e\u0441\u043e\u043c, \u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u044f \u043d\u0435 \u0441\u043a\u0430\u0442\u0438\u043b\u0430\u0441\u044c \u043a \u0432\u044b\u0440\u043e\u0436\u0434\u0435\u043d\u043d\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e. \u041c\u0435\u0442\u043e\u0434 mutation \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">def mutation(self):   \"\"\"Mutates individuals with a 20% probability.\"\"\"    for r in range(self.pop_num*3, 5):                                 # Mutation.     for w in range(0,self.lenght):                     if random.random()&lt;0.2:                           self.par_and_sons[r].A[w] = self.par_and_sons[r].A[w] + np.random.randint(-20, 20)  # Offset + -20 pixels. <\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 mutation \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0445\u0440\u043e\u043c\u043e\u0441\u043e\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043a \u043d\u0435\u043c\u0443. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043c\u0443\u0442\u0430\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b\u0438\u0441\u044c \u0445\u0440\u043e\u043c\u043e\u0441\u043e\u043c\u044b, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439 \u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443\u043b\u0443\u0447\u0448\u0430\u043b\u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u044e.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u043c\u0443\u0442\u0430\u0446\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u044d\u0442\u0430\u043f \u043e\u0442\u0431\u043e\u0440\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u044e\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u0435 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 selection, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">def selection(self):   \"\"\"Sorts by fit and selects the best pop_num individs.\"\"\"    for i in range(self.pop_num*3):                                    # It is important. Next, we will rank the array of parents and children in ascending order of survivability (sum (fit)).     self.par_and_sons[i].fit = SimpleSegmentationGA.fitness_function(self.gray, self.delta_x, self.lenght, self.par_and_sons[i].A)      #  Sort.     self.par_and_sons = sorted(self.par_and_sons, key=lambda individ: individ.fit)        self.population=self.par_and_sons[:self.pop_num].copy()<\/code><\/pre>\n<p>\u0412 \u043c\u0435\u0442\u043e\u0434\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0441\u0447\u0435\u0442 \u0444\u0438\u0442\u043d\u0435\u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u043d\u0435\u043c\u0443. \u041f\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0435 pop_num \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0438\u043c\u0438 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0424\u0438\u0442\u043d\u0435\u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">def fitness(image, delta_x, length, individ):                           \"\"\"Responsible for calculating the \"fit\" (counts the amount).\"\"\"          summa = 0     sum_vrt = 0     for i in range(length):                          sum_ = np.sum(image[individ[i], i*delta_x:i*delta_x+delta_x])         if i&gt;0:             if individ[i]&gt;individ[i-1]:                 sum_vrt = np.sum(image[individ[i-1]:individ[i], i*delta_x])             else:                 sum_vrt = np.sum(image[individ[i]:individ[i-1], i*delta_x])         summa=summa + sum_ + sum_vrt            return summa<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043c\u044b \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0443\u043c\u043c\u0443 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0438\u0445 \u043b\u0438\u043d\u0438\u0438. \u0423 \u043d\u0430\u0441 \u0431\u0435\u043b\u044b\u0439 \u0446\u0432\u0435\u0442 \u0438\u043c\u0435\u0435\u0442 \u0432\u0435\u0441 1, \u0430 \u0447\u0435\u0440\u043d\u044b\u0439 256.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 call \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u0440\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">def call(self):   \"\"\"Calls other functions and returns the selected population.\"\"\"    self.cross()   self.mutation()   self.selection()    return  self.population[0]<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 call \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u044e.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0431\u044b\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432\u0441\u043f\u043e\u043c\u0430\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0438\u043d\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0434\u043b\u044f \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u043e\u0432, \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432, \u0434\u043b\u044f \u043e\u0431\u0440\u0435\u0437\u043a\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0433\u0435\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430.<\/p>\n<pre><code class=\"python\">import numpy as np import random, time import cv2  from scipy.ndimage import gaussian_filter from scipy.signal import find_peaks from numba import njit import pymp  @njit def fitness(image, delta_x, length, individ):                           \"\"\"Responsible for calculating the \"fit\" (counts the amount).\"\"\"          summa = 0     sum_vrt = 0     for i in range(length):                          sum_ = np.sum(image[individ[i], i*delta_x:i*delta_x+delta_x])         if i&gt;0:             if individ[i]&gt;individ[i-1]:                 sum_vrt = np.sum(image[individ[i-1]:individ[i], i*delta_x])             else:                 sum_vrt = np.sum(image[individ[i]:individ[i-1], i*delta_x])         summa=summa + sum_ + sum_vrt            return summa   def find_peaks_(image):     \"\"\"Calculates ranges of random numbers for our individs.\"\"\"      height, width = image.shape[:2]     img_matrix = [sum(i)\/len(i) for i in image]     x=[i for i in range(height)]     y = [255-i for i in img_matrix]     y = gaussian_filter(y, sigma=20)     maxs, _ = find_peaks(y)     maxs = maxs.tolist()      return maxs  def run(gaObj, peaks, epoch, parallel=True, number_cpu=4):     \"\"\"Can choose how to run.\"\"\"         gen_lines = pymp.shared.list()     if parallel:         with pymp.Parallel(number_cpu) as p:             range_peaks = p.range(len(peaks)-1)             gen_lines = run_genetic_algorithm(gaObj, peaks, epoch, range_peaks, gen_lines)     else:         range_peaks = range(len(peaks)-1)         gen_lines = run_genetic_algorithm(gaObj, peaks, epoch, range_peaks, gen_lines)                    return np.moveaxis(np.array(gen_lines), 0, 1)    # Swap line and epoch axes.   def draw_lines(image, lines, delta_x, imagename, epoch='last', color=(0,0,255), thickness = 3, IMG_FOLDER='output'):     \"\"\"Draws the result of a genetic algorithm.\"\"\"          image_copy = image.copy()     for j in lines:         for i in range(len(j)):             x1 = i*delta_x             x2 = i*delta_x+delta_x             y1 = j[i]             y2 = j[i]             start_point = (x1, y1)              if i&gt;0:                 cv2.line(image_copy, preview_point, start_point, color, thickness)             end_point = (x2, y2)              cv2.line(image_copy, start_point, end_point, color, thickness)             preview_point = end_point     cv2.imwrite(f\"{IMG_FOLDER}\/{imagename[:-4]}_gen_line_{epoch}.jpg\", image_copy)   def run_genetic_algorithm(gaObj, peaks, epoch, range_peaks, gen_lines):     \"\"\"Runs a genetic alghoritm.\"\"\"      for line in range_peaks:         gaObj.create_population(peaks[line], peaks[line+1])         epoch_line = pymp.shared.list()         for p in range(epoch):               st_time = time.time()                               gen_line = gaObj.call()             epoch_line.append(gen_line.A)            # For draw results each epoch, add results of each epoch.             print(f'Line = {line}, Epoch = {p}, fit = {gen_line.fit}, Time = {time.time()-st_time}')          gen_lines.append(epoch_line)          return gen_lines  def crop_lines(image, lines, delta_x, imagename, IMG_FOLDER='crops'):     \"\"\"Crop the lines.\"\"\"      for i in range(-1,len(lines)):         height, width = image.shape[:2]          if i == (-1):             first_line = [[i*delta_x, 0] for i, el in enumerate(lines[i])]         else:             first_line = [[i*delta_x, el] for i, el in enumerate(lines[i])]          first_line = first_line[::-1] # Reverse first line.                  if i &lt; len(lines)-1:             second_line = [[i*delta_x, el] for i, el in enumerate(lines[i+1])]         else:             second_line = [[i*delta_x, height] for i, el in enumerate(lines[i])]          points = np.array([first_line + second_line])         mask = np.zeros((height, width), dtype=np.uint8)         cv2.fillPoly(mask, points, (255))          res = cv2.bitwise_and(image,image,mask = mask)          rect = cv2.boundingRect(points) # Returns (x,y,w,h) of the rect         im2 = np.full((res.shape[0], res.shape[1], 3), (0, 255, 0), dtype=np.uint8 ) # You can also use other colors or simply load another image of the same size         maskInv = cv2.bitwise_not(mask)         colorCrop = cv2.bitwise_or(im2,im2,mask = maskInv)         finalIm = res + colorCrop         cropped = finalIm[rect[1]: rect[1] + rect[3], rect[0]: rect[0] + rect[2]]          cv2.imwrite(f\"{IMG_FOLDER}\/croped_{imagename[:-4]}_{i}.png\", cropped)  <\/code><\/pre>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a, \u0433\u0435\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439, \u043e\u043d \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u0430\u0441\u0447\u0435\u0442 \u0444\u0438\u0442\u043d\u0435\u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0427\u0442\u043e\u0431\u044b \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"https:\/\/numba.pydata.org\/\" rel=\"noopener noreferrer nofollow\">numba<\/a> \u0434\u043b\u044f \u0444\u0438\u0442\u043d\u0435\u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0443\u043c\u0435\u043d\u0448\u0438\u043b\u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 27 \u0440\u0430\u0437(190sec VS 7sec  \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f). \u0422\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"https:\/\/github.com\/classner\/pymp\" rel=\"noopener noreferrer nofollow\">pymp<\/a> \u0434\u043b\u044f &nbsp;\u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044f, \u0438\u0442\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043b\u0430\u0441\u044c \u0434\u043e 3,5 \u0441\u0435\u043a. \u043d\u0430 \u043e\u0434\u043d\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435.<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">import cv2  import glob, os from utils import * from SimpleSegmentationGA import SimpleSegmentationGA    if __name__ == '__main__':      # Hyper parameters for genetic alghoritms.     POP_NUM=80     DELTAX=50 # Value of h.     EPOCH=100     IMAGES_PATH = 'input'     # IMAGE_PATH = '7.jpg'           images = glob.glob(f'{IMAGES_PATH}\/*.jpg')     for imagename in images:         fstart_time = time.time()         # Image operations.          image = cv2.imread(imagename)         height, width = image.shape[:2]         gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)          # Calculate individ's lenght.         length_individ = int(width\/DELTAX)          # Calculate the range of random numbers for an individ.         peaks = find_peaks_(gray)                   # Create object of class.         ssga = SimpleSegmentationGA(POP_NUM, length_individ, DELTAX, gray)          start_time = time.time()         # Run genetic algorithm.         lines = run(ssga, peaks, EPOCH, parallel=True)         print('Time run =', time.time()-start_time)          last_epoch_lines = sorted(lines[-1], key = lambda x:x[0]) # Sort for crop. Because when using parallel, the lines lose consistency.          start_time = time.time()         # Draw the result of the genetic alghoritm. lines[-1] -&gt; result of last epoch.         draw_lines(image, last_epoch_lines, DELTAX, os.path.basename(imagename))         print('Time draw_lines =', time.time()-start_time)          start_time = time.time()         # Crop the result of genetic alghoritm.         crop_lines(image, last_epoch_lines, DELTAX, os.path.basename(imagename))         print('Time crop_lines =', time.time()-start_time)         print('Time for one image =', time.time()-fstart_time)         <\/code><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043b \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2b8\/d3d\/773\/2b8d3d773476ffa0447cf7000cc5eca1.jpg\" alt=\"\u0420\u0438\u0441. 5\" title=\"\u0420\u0438\u0441. 5\" width=\"2480\" height=\"3508\"><figcaption>\u0420\u0438\u0441. 5<\/figcaption><\/figure>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/github.com\/GalymzhanAbdimanap\/GeneticAlgorithm\/tree\/main\/genetic_alghoritm_v4_1\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/544648\/\"> https:\/\/habr.com\/ru\/post\/544648\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<p><strong>\u0413\u0435\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c (GA)<\/strong><\/p>\n<p>\u0413\u0435\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c &#8212; \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440.&nbsp;\u041f\u043e\u0434 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c GA, \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u0438\u0441\u044c \u043a \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u043e\u0432\u044b\u0445.&nbsp;GA \u043e\u0441\u043d\u043e\u0432\u0430\u043d \u043d\u0430 \u0442\u0435\u043e\u0440\u0438\u0438 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438 \u0414\u0430\u0440\u0432\u0438\u043d\u0430.&nbsp;\u042d\u0442\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0443\u0442\u0435\u043c \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0438 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.&nbsp;\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, GA \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0432\u043d\u043e\u0441\u0438\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0441\u0432\u043e\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u043b\u0443\u0447\u0448\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0437\u043d\u0430\u0442\u044c <a href=\"https:\/\/towardsdatascience.com\/introduction-to-optimization-with-genetic-algorithm-2f5001d9964b\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p><strong>\u0426\u0435\u043b\u044c<\/strong><\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u043b\u044f \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0439 \u0441\u0442\u0440\u043e\u043a \u0432 \u0440\u0443\u043a\u043e\u043f\u0438\u0441\u043d\u043e\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435(<a href=\"https:\/\/fooonts.at.ua\/_ph\/1\/802017170.jpg\" rel=\"noopener noreferrer nofollow\">\u0440\u0438\u0441. 1<\/a>), \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438 \u043e\u0431\u0440\u0435\u0437\u0430\u043d\u0438\u0439 \u0441\u0442\u0440\u043e\u043a, \u043d\u0435 \u043e\u0431\u0440\u0435\u0437\u0430\u043b\u0438 \u043d\u0438\u0436\u043d\u044e\u044e \u0438\u043b\u0438 \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0447\u0430\u0441\u0442\u044c \u0431\u0443\u043a\u0432 (\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u0440\u0443\u043a\u043e\u043f\u0438\u0441\u043d\u044b\u0435 \u0431\u0443\u043a\u0432\u044b \u0440, \u0432, \u0431, \u0434, \u0437 \u0438 \u0442.\u0434.).<\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441. 1 \u041e\u0431\u0440\u0430\u0437\u0435\u0446<\/figcaption><\/figure>\n<h2>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p><strong>Preprocessing <\/strong><\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u043d\u0443\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u0433\u0434\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u043d\u0438\u044e(\u0438\u043d\u0434\u0438\u0432\u0438\u0434). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e, \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043b \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438(\u0440\u0438\u0441. 2. \u041f\u043e \u0441\u0443\u043c\u043c\u0435 \u0446\u0432\u0435\u0442\u043e\u0432 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u0435\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 <strong>\u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0431\u0435\u043b\u0430\u044f, <\/strong>\u0442\u043e \u0441\u0443\u043c\u043c\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u0430 255) \u043f\u043e \u0432\u044b\u0441\u043e\u0442\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438. \u0427\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u044e, \u0442\u043e\u0433\u0434\u0430 \u0431\u0435\u043b\u044b\u0439 \u0446\u0432\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d \u043d\u0443\u043b\u044e.<\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441. 2<\/figcaption><\/figure>\n<p>\u042d\u0442\u043e \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u0430\u0435\u0442 \u043d\u0430\u043c \u0441\u0443\u043c\u043c\u0443 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043f\u0438\u043a\u043e\u0432. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c(\u0440\u0438\u0441. 3) \u044d\u0442\u0443 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%93%D0%B0%D1%83%D1%81%D1%81%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u0433\u0430\u0443\u0441\u0441\u0430<\/a>(\u0435\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u044b). \u0422\u0430\u043a \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u043e\u0447\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0433\u0434\u0435 \u043f\u0440\u0435\u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0447\u0435\u0440\u043d\u044b\u0439 \u0438\u043b\u0438 \u0431\u0435\u043b\u044b\u0439 \u0446\u0432\u0435\u0442.<\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441. 3<\/figcaption><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u043d\u0438\u0438 \u043f\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c(\u0441\u0438\u043d\u044f\u044f) \u0438 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c(\u0437\u0435\u043b\u0435\u043d\u0430\u044f) \u0442\u043e\u0447\u043a\u0430\u043c \u043f\u043e \u044d\u0442\u043e\u0439 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u043d\u0438\u0436\u043d\u044f\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430(\u0440\u0438\u0441. 4)<\/p>\n<figure class=\"full-width\"><figcaption>\u0420\u0438\u0441. 4<\/figcaption><\/figure>\n<p>\u041c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u0437\u0435\u043b\u0435\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438, \u043d\u043e \u043a\u0430\u043a \u0432\u0438\u0434\u0438\u043c, \u043e\u043d\u0438 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442 \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u0438\u043b\u0438 \u043d\u0438\u0436\u043d\u044e\u044e \u0447\u0430\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u043a\u0432, \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0433\u0435\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0431\u0443\u043a\u0432\u044b. \u0421\u0438\u043d\u0438\u0435 \u043b\u0438\u043d\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043b\u0443\u0436\u0438\u0442\u044c \u043d\u0430\u043c, \u043a\u0430\u043a \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0434\u043b\u044f \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u043e\u0432, \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u043d\u0438\u0438.<\/p>\n<p><strong>\u0413\u0435\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c<\/strong><\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u0442\u0430\u043a \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <a href=\"https:\/\/habr.com\/ru\/post\/37576\/#:~:text=%D0%95%D1%81%D0%BB%D0%B8%20%D0%B3%D0%BE%D0%B2%D0%BE%D1%80%D0%B8%D1%82%D1%8C%20%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%BE%2C%20%D0%BF%D0%BE%D0%BB%D0%B8%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC%20%E2%80%94%20%D1%8D%D1%82%D0%BE,%D1%80%D0%B0%D1%81%D1%81%D0%BC%D0%BE%D1%82%D1%80%D0%B8%D0%BC%20%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BF%D0%BE%D0%BB%D0%B8%D0%BC%D0%BE%D1%80%D1%84%D0%B8%D0%B7%D0%BC%D0%B0%20%D0%BD%D0%B0%20%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B5.\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u043b\u0438\u043c\u043e\u0440\u0444\u0438\u0437\u043c<\/a>:<\/p>\n<pre><code class=\"python\">from abc import abstractmethod, abstractproperty   class GeneticAlgorithm():     \"\"\"Genetic Algorithm Interface.\"\"\"      @abstractmethod     def create_population(self):         pass      @abstractmethod     def selection(self):         pass      @abstractmethod     def mutation(self):         pass      @abstractmethod     def cross(self):         pass       @abstractmethod     def call(self):         pass<\/code><\/pre>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0442\u0430\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439:<\/p>\n<ul>\n<li>\n<p>create_population &#8212; \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p>selection &#8212; \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0442\u0431\u043e\u0440\u0430;<\/p>\n<\/li>\n<li>\n<p>mutation &#8212; \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043c\u0443\u0442\u0430\u0446\u0438\u0438;<\/p>\n<\/li>\n<li>\n<p>cross &#8212; \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>call &#8212; \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u0435\u0434\u0443\u0449\u0438\u0435 3 \u0444\u0443\u043d\u043a\u0446\u0438\u0439;<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0430. \u0418\u043d\u0434\u0438\u0432\u0438\u0434 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">import numpy as np import random  class Individ:     \"\"\"Generate a new individ.\"\"\"          def __init__(self, y1, y2, length):            self.length = length            self.A=np.random.randint(y1, y2, self.length)    # Declare the attribute \"A\" of our individ (this will be the line 010..101).         self.fit=0                                       # Declare the attribute \"fit\" of the individ (this will be the sum of the elements of our line 010..101) (for now, we will assign it the value 0)     <\/code><\/pre>\n<p>\u041a\u043b\u0430\u0441\u0441 Individ \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440 \u0445\u0440\u043e\u043c\u043e\u0441\u043e\u043c, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u044f.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9D%D0%B0%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)#:~:text=inheritance)%20%E2%80%94%20%D0%BA%D0%BE%D0%BD%D1%86%D0%B5%D0%BF%D1%86%D0%B8%D1%8F%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%2D%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE,%D0%BF%D0%BE%D0%B2%D1%82%D0%BE%D1%80%D0%BD%D0%BE%D0%BC%D1%83%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8E%20%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D0%BE%D0%B2%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%BE%D0%B1%D0%B5%D1%81%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D1%8F.\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435<\/a> \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u0412 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439, \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u0438, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u043e\u0432, \u0434\u043b\u0438\u043d\u0443 \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u043e\u0432 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445 \u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0432 \u0441\u0435\u0440\u044b\u0445 \u0442\u043e\u043d\u0430\u0445.<\/p>\n<pre><code class=\"python\">class SimpleSegmentationGA(GeneticAlgorithm):     \"\"\"Genetic Algorithm Implementation.\"\"\"      def __init__(self, pop_num, lenght, delta_x, gray):         self.pop_num = pop_num         self.lenght = lenght    # Length of individ.         self.delta_x =  delta_x # Value of h.         self.gray = 256 - gray # Inversion. <\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f create_population \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u0438.<\/p>\n<pre><code class=\"python\">def create_population(self, y1, y2):   \"\"\"Creates a population, Dad, Mom and 4 sons\"\"\"    self.y1 = y1   self.y2 = y2   self.population = []                                               # Declare an array \"population\" in which we will store a population of 5 individuals.   for i in range(self.pop_num):                c=Individ(self.y1, self.y2, self.lenght)                       # Create a new individual.     self.population.append(c)                                      # Add the i-th unique individual to the array (fill in our population)       self.mother = Individ(self.y1, self.y2, self.lenght)               # Initialize the variables with which we will work: mom, dad, 4 sons ..     self.father = Individ(self.y1, self.y2, self.lenght)                          self.son1 = Individ(self.y1, self.y2, self.lenght)                            self.son2 = Individ(self.y1, self.y2, self.lenght)     self.son3 = Individ(self.y1, self.y2, self.lenght)     self.son4 = Individ(self.y1, self.y2, self.lenght)     self.par_and_sons = []                                             #.. and an array of individs \"Parents and Children\" in which we will store      for j in range(self.pop_num*3):                                    # Initialize our array of \"Parents and Sons\" with random individs.       self.par_and_sons.append(Individ(self.y1, self.y2, self.lenght))<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f create_population \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 4 \u0441\u044b\u043d\u043e\u0432\u0435\u0439.<\/p>\n<p> \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0431\u044b\u043b\u0438 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u00ab\u0441\u0435\u043c\u044c\u0438\u00bb \u0438\u0437 \u043e\u0441\u043e\u0431\u0435\u0439, \u0434\u043b\u044f \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u044f, \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u0440\u0435\u0441\u0442\u0438\u0442\u044c \u0438\u0445 \u0445\u0440\u043e\u043c\u043e\u0441\u043e\u043c\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0435\u0442\u0435\u0439 \u0441 \u043d\u043e\u0432\u044b\u043c\u0438 \u0445\u0440\u043e\u043c\u043e\u0441\u043e\u043c\u0430\u043c\u0438. \u0424\u0443\u043d\u043a\u0446\u0438\u044f cross \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">def cross(self):   \"\"\"Crosses the best individs with each other.\"\"\"    for i in range(self.pop_num):                                      # Put in the first pop_num elements of the \"Parents and Sons\" array our entire input population.     self.par_and_sons[i].A=self.population[i].A.copy()      random.shuffle(self.population)                                    # Shuffle population.      tt=0                                                               # The counter that is needed to implement a non-trivial crossing.     for s in range(0,self.pop_num,2):                                  # From 0 to pop_num with step 2. That is. here we take pop_num \/ 2 pairs of parents.       self.mother.A=self.population[tt+int(self.pop_num\/2)].A        # Let the last pop_num \/ 2 individuals of our population be our mothers.       self.father.A=self.population[tt].A                            # And let first pop_num \/ 2 individuals of our population be dads.        tt=tt+1           ran=random.random()        for n in range(self.lenght):                                   # Crossover.         if random.random()&gt;0.5:           self.son1.A[n] = self.father.A[n]           self.son2.A[self.lenght-1-n] = self.father.A[n]           self.son3.A[n] = self.mother.A[n]           self.son4.A[self.lenght-1-n] = self.mother.A[n]         else:           self.son1.A[n] = self.mother.A[n]           self.son2.A[self.lenght-1-n] = self.mother.A[n]           self.son3.A[n] = self.father.A[n]           self.son4.A[self.lenght-1-n] = self.father.A[n]          self.par_and_sons[self.pop_num+2*s].A = self.son1.A.copy()         self.par_and_sons[self.pop_num+2*s+1].A = self.son2.A.copy()         self.par_and_sons[self.pop_num+2*s+2].A = self.son3.A.copy()         self.par_and_sons[self.pop_num+2*s+3].A = self.son4.A.copy()<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043c\u0443\u0442\u0430\u0446\u0438\u044e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0434\u0435\u0442\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435 \u0445\u0440\u043e\u043c\u043e\u0441\u043e\u043c, \u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u044f \u043d\u0435 \u0441\u043a\u0430\u0442\u0438\u043b\u0430\u0441\u044c \u043a \u0432\u044b\u0440\u043e\u0436\u0434\u0435\u043d\u043d\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e. \u041c\u0435\u0442\u043e\u0434 mutation \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">def mutation(self):   \"\"\"Mutates individuals with a 20% probability.\"\"\"    for r in range(self.pop_num*3, 5):                                 # Mutation.     for w in range(0,self.lenght):                     if random.random()&lt;0.2:                           self.par_and_sons[r].A[w] = self.par_and_sons[r].A[w] + np.random.randint(-20, 20)  # Offset + -20 pixels. <\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 mutation \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0445\u0440\u043e\u043c\u043e\u0441\u043e\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043a \u043d\u0435\u043c\u0443. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043c\u0443\u0442\u0430\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b\u0438\u0441\u044c \u0445\u0440\u043e\u043c\u043e\u0441\u043e\u043c\u044b, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439 \u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443\u043b\u0443\u0447\u0448\u0430\u043b\u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u044e.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u043c\u0443\u0442\u0430\u0446\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u044d\u0442\u0430\u043f \u043e\u0442\u0431\u043e\u0440\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u044e\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u0435 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0435 \u043e\u0441\u043e\u0431\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 selection, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">def selection(self):   \"\"\"Sorts by fit and selects the best pop_num individs.\"\"\"    for i in range(self.pop_num*3):                                    # It is important. Next, we will rank the array of parents and children in ascending order of survivability (sum (fit)).     self.par_and_sons[i].fit = SimpleSegmentationGA.fitness_function(self.gray, self.delta_x, self.lenght, self.par_and_sons[i].A)      #  Sort.     self.par_and_sons = sorted(self.par_and_sons, key=lambda individ: individ.fit)        self.population=self.par_and_sons[:self.pop_num].copy()<\/code><\/pre>\n<p>\u0412 \u043c\u0435\u0442\u043e\u0434\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0441\u0447\u0435\u0442 \u0444\u0438\u0442\u043d\u0435\u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u043d\u0435\u043c\u0443. \u041f\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0431\u0435\u0440\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0435 pop_num \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0438\u043c\u0438 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0424\u0438\u0442\u043d\u0435\u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">def fitness(image, delta_x, length, individ):                           \"\"\"Responsible for calculating the \"fit\" (counts the amount).\"\"\"          summa = 0     sum_vrt = 0     for i in range(length):                          sum_ = np.sum(image[individ[i], i*delta_x:i*delta_x+delta_x])         if i&gt;0:             if individ[i]&gt;individ[i-1]:                 sum_vrt = np.sum(image[individ[i-1]:individ[i], i*delta_x])             else:                 sum_vrt = np.sum(image[individ[i]:individ[i-1], i*delta_x])         summa=summa + sum_ + sum_vrt            return summa<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043c\u044b \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u0443\u043c\u043c\u0443 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0438\u0445 \u043b\u0438\u043d\u0438\u0438. \u0423 \u043d\u0430\u0441 \u0431\u0435\u043b\u044b\u0439 \u0446\u0432\u0435\u0442 \u0438\u043c\u0435\u0435\u0442 \u0432\u0435\u0441 1, \u0430 \u0447\u0435\u0440\u043d\u044b\u0439 256.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 call \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u0440\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">def call(self):   \"\"\"Calls other functions and<\/code><\/pre>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-318871","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/318871","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=318871"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/318871\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=318871"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=318871"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=318871"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}