{"id":464585,"date":"2025-06-25T21:01:34","date_gmt":"2025-06-25T21:01:34","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=464585"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=464585","title":{"rendered":"<span>\u00ab\u0421\u043a\u0430\u0439\u043d\u0435\u0442\u00bb \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442: \u043a\u0430\u043a \u0432\u044b\u0440\u0430\u0441\u0442\u0438\u0442\u044c \u0438 \u043e\u0431\u0443\u0447\u0438\u0442\u044c \u0418\u0418 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0414\u0430\u0440\u0432\u0438\u043d-\u0413\u0451\u0434\u0435\u043b\u044c \u043c\u0430\u0448\u0438\u043d\u044b \u0434\u043b\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><em>\u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0438 \u0440\u0430\u0441\u0442\u0438\u043c \u00ab\u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0433\u043e \u0433\u0443\u0431\u0435\u0440\u0430\u00bb &#8212; \u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u043d\u0442\u0430 \u043f\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438. \u0420\u0435\u0448\u0430\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0438 \u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0434\u043b\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0433\u043e \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u043e\u0441\u0442\u0430 \u0432 89 \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0\u00a0 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u0438 \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c <\/em><code><em>\u0418\u0418-\u0430\u0433\u0435\u043d\u0442\u043e\u0432<\/em><\/code><em>. \u00a0\u00a0\u041c\u0443\u043b\u044c\u0442\u0438\u0430\u0433\u0435\u043d\u0442\u043d\u043e\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0443\u0442\u0430\u0446\u0438\u0439, \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438, \u00a0<\/em><a href=\"https:\/\/habr.com\/ru\/companies\/otus\/articles\/508736\/\" rel=\"noopener noreferrer nofollow\"><em>Multi-Agent Deep Deterministic Policy Gradient<\/em><\/a><em> \u0438 <\/em><a href=\"https:\/\/habr.com\/ru\/articles\/920484\/\" rel=\"noopener noreferrer nofollow\"><em>Darwin G\u00f6del Machine<\/em><\/a><em>. \u0410\u0445\u0442\u0443\u043d\u0433, \u0434\u0430\u043b\u044c\u0448\u0435 &#8212;  \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u0430\u0431\u0443\u043a\u0432 \u0438 \u043a\u043e\u0434\u0430!<\/em><\/p>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c75\/b3c\/d6b\/c75b3cd6bf95729cd9698cbf2a7bd3e6.jpg\" alt=\"\u041f\u043e\u043a\u0430 \u0418\u0418 \u0443 \u043d\u0430\u0441 \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u043a\u043e\u043b\u0435\u0441\u0430\u0445 \u0438 \u0432 \u043a\u043e\u043b\u044f\u0441\u043a\u0435\" title=\"\u041f\u043e\u043a\u0430 \u0418\u0418 \u0443 \u043d\u0430\u0441 \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u043a\u043e\u043b\u0435\u0441\u0430\u0445 \u0438 \u0432 \u043a\u043e\u043b\u044f\u0441\u043a\u0435\" width=\"1024\" height=\"1024\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c75\/b3c\/d6b\/c75b3cd6bf95729cd9698cbf2a7bd3e6.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c75\/b3c\/d6b\/c75b3cd6bf95729cd9698cbf2a7bd3e6.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u043e\u043a\u0430 \u0418\u0418 \u0443 \u043d\u0430\u0441 \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u043a\u043e\u043b\u0435\u0441\u0430\u0445 \u0438 \u0432 \u043a\u043e\u043b\u044f\u0441\u043a\u0435<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b<\/strong><\/p>\n<p>\u0415\u0449\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/848090\/\" rel=\"noopener noreferrer nofollow\">\u0418\u0431\u043d \u0425\u0430\u043b\u0434\u0443\u043d<\/a>, \u0430 \u0432\u0441\u043b\u0435\u0434 \u0437\u0430 \u043d\u0438\u043c <a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%9F%D0%B0%D1%80%D0%B5%D1%82%D0%BE,_%D0%92%D0%B8%D0%BB%D1%8C%D1%84%D1%80%D0%B5%D0%B4%D0%BE\" rel=\"noopener noreferrer nofollow\">\u0412. \u041f\u0430\u0440\u0435\u0442\u043e<\/a>, <a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%9C%D0%BE%D1%81%D0%BA%D0%B0,_%D0%93%D0%B0%D1%8D%D1%82%D0%B0%D0%BD%D0%BE\" rel=\"noopener noreferrer nofollow\">\u0413.\u041c\u043e\u0441\u043a\u0430<\/a> \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u044b \u043f\u043e \u0442\u0435\u043e\u0440\u0438\u0438 \u044d\u043b\u0438\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438, \u0447\u0442\u043e \u00ab\u043a\u043e\u0436\u0430\u043d\u044b\u0435 \u043c\u0435\u0448\u043a\u0438\u00bb \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u043b\u0443\u0447\u0448\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438. \u041c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u0437\u044b\u0441\u043a\u0430\u043d\u0438\u044f\u0445 \u043f\u043e <a href=\"https:\/\/elementy.ru\/nauchno-populyarnaya_biblioteka\/430806\/Dolgosrochnye_kolebaniya_chislennosti_naseleniya_v_istoricheskikh_obshchestvakh\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e-\u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0435\u043e\u0440\u0438\u0438<\/a>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u0445 \u043a\u0440\u0438\u0437\u0438\u0441\u043e\u0432, \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444 \u0438 \u0440\u0435\u0432\u043e\u043b\u044e\u0446\u0438\u0439 <a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%93%D0%BE%D0%BB%D0%B4%D1%81%D1%82%D0%BE%D1%83%D0%BD,_%D0%94%D0%B6%D0%B5%D0%BA\" rel=\"noopener noreferrer nofollow\">\u0414\u0436\u0435\u043a\u0430 \u0413\u043e\u043b\u0434\u0441\u0442\u043e\u0443\u043d\u0430<\/a> \u0438 <a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%A2%D1%83%D1%80%D1%87%D0%B8%D0%BD,_%D0%9F%D1%91%D1%82%D1%80_%D0%92%D0%B0%D0%BB%D0%B5%D0%BD%D1%82%D0%B8%D0%BD%D0%BE%D0%B2%D0%B8%D1%87\" rel=\"noopener noreferrer nofollow\">\u041f\u0438\u0442\u0435\u0440\u0430 \u0422\u0443\u0440\u0447\u0438\u043d\u0430<\/a> \u00ab\u044d\u043b\u0438\u0442\u043d\u044b\u0435 \u043a\u043e\u0436\u0430\u043d\u044b\u0435 \u043c\u0435\u0448\u043a\u0438\u00bb, \u00a0\u0441\u043a\u043b\u043e\u043d\u043d\u044b \u043a \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0443, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043a \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0439 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u0438 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c, \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u043e\u0439 \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0438, <a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%94%D0%B5%D0%BC%D0%BE%D0%BD%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5_%D0%BF%D0%BE%D1%82%D1%80%D0%B5%D0%B1%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0441\u0442\u0438\u0436\u043d\u043e\u043c\u0443 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044e<\/a> \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u00ab<a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%9E%D1%82%D1%80%D0%B8%D1%86%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BE%D1%82%D0%B1%D0%BE%D1%80_(%D0%BF%D0%BE%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B0)\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043a\u0430\u0434\u0440\u043e\u0432\u043e\u043c\u0443 \u043e\u0442\u0431\u043e\u0440\u0443<\/a>\u00bb \u043f\u0440\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043b\u0438\u0444\u0442\u0430\u0445 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438. <\/p>\n<p>\u041f\u043e\u043d\u0435\u0432\u043e\u043b\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0438\u0434\u0435\u044f, \u0447\u0442\u043e \u00ab\u043a\u043e\u0433\u0434\u0430 \u0418\u0418 \u00a0\u043f\u0440\u0438\u0434\u0435\u0442 \u2013 \u00a0\u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043d\u0430\u0432\u0435\u0434\u0435\u0442\u00bb. \u0418 \u0432 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0437\u0430\u0447\u0435\u043c \u0418\u0418 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u0442\u0432\u043e, \u0435\u0441\u043b\u0438 \u043b\u044e\u0434\u0438 \u0438 \u0442\u0430\u043a \u043a \u044d\u0442\u043e\u043c\u0443 \u0441\u043a\u043b\u043e\u043d\u043d\u044b? \u0410 \u0432\u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u044d\u043c\u043e\u0446\u0438\u0438, \u0445\u0430\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 (\u0430\u0441\u0430\u0431\u0438\u044e, \u0441\u043e\u043b\u0438\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c, \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c, \u0441\u043a\u043b\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u043a \u043a\u0443\u043c\u043e\u0432\u0441\u0442\u0432\u0443 \u0438 \u043a\u043e\u0440\u0440\u0443\u043f\u0446\u0438\u0438 &#8230;..) \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f, \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u2013 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u0438 \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c. <\/p>\n<p>\u0418\u0442\u0430\u043a, \u0432\u043f\u0435\u0440\u0435\u0434\u0438 \u00ab\u0441\u043b\u0438\u0448\u043a\u0430\u043c\u043c\u043d\u043e\u0433\u043e\u0431\u0443\u043a\u0444\u0444\u00bb, \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u043a\u043e\u043d\u0442\u0443\u0440\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u00ab\u0447\u0435\u043b\u043e\u0432\u0435\u0447\u043d\u044b\u0445\u00bb \u0438 \u0434\u0430\u0436\u0435 \u00ab\u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u0445\u00bb \u0437\u0430\u0434\u0430\u0447: <\/p>\n<p>&#8212;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043a\u0430\u043a \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0438?<\/p>\n<p>&#8212;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043a\u0430\u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0441 \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u043e\u043c \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e-\u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438?<\/p>\n<p>&#8212;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043a\u0430\u043a \u0440\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043b\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0433\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u043e\u0441\u0442\u0430? <\/p>\n<p>&#8212;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043a\u0430\u043a \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0430\u043a\u0442\u043e\u0440\u0430\u043c\u0438? <\/p>\n<\/div>\n<p><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0438\u043b\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0430\u0437\u0438\u043c\u043e\u0432\u0441\u043a\u043e\u0439 \u00ab\u0433\u0430\u0440\u0438\u0441\u0435\u043b\u0434\u043e\u0432\u0449\u0438\u043d\u044b\u00bb<\/strong><\/p>\n<p>\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0438\u043c\u0435\u0435\u0442 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0435\u0434\u0435\u043b\u044b: \u0447\u0430\u0441\u0442\u044c \u0438\u0437 \u043d\u0438\u0445 \u0437\u0430\u0434\u0430\u043d\u0430 \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0432\u0448\u0435\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439, \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0446\u0438\u043a\u043b\u0430\u043c\u0438 \u0438 \u0432\u043e\u043b\u043d\u0430\u043c\u0438, \u0440\u0435\u0441\u0443\u0440\u0441\u043d\u044b\u043c\u0438 \u0438 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0435\u0440\u0446\u0438\u0435\u0439 \u0438 \u00ab\u043c\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e\u00bb \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u043a\u043e\u043d\u0441\u0435\u0440\u0432\u0430\u0442\u0438\u0437\u043c\u043e\u043c \u0438\u043d\u0441\u0442\u0438\u0442\u0443\u0442\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.\u00a0\u00a0 <\/p>\n<p>\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u0434\u0435\u043e\u043b\u043e\u0433\u0438\u0438,  \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0432\u0435\u0441\u0442\u043a\u0438\u00a0 \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u0431\u044b\u0442\u044c \u0432 \u043e\u0447\u0435\u043d\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0445 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430\u0445. \u041e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u043e\u043b\u0438\u0442\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u0440\u0430\u0432\u043d\u043e \u043a\u0430\u043a \u0438 \u043f\u043e\u043f\u0443\u043b\u0438\u0441\u0442\u0441\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0432 \u0434\u043e\u043b\u0433\u043e\u0441\u0440\u043e\u043a \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u044b \u043a\u0443\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u0442\u0440\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u0438 \u0440\u0435\u0448\u0430\u0442\u044c \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0440\u043e\u0447\u043d\u044b\u0435 \u0442\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438. <\/p>\n<p><a href=\"https:\/\/elementy.ru\/nauchno-populyarnaya_biblioteka\/430806\/Dolgosrochnye_kolebaniya_chislennosti_naseleniya_v_istoricheskikh_obshchestvakh\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u043b\u0433\u043e\u0441\u0440\u043e\u0447\u043d\u044b\u0435 \u00a0\u0442\u0440\u0435\u043d\u0434\u044b<\/a>, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0435 \u043c\u0430\u0442\u0440\u0438\u043c\u043e\u043d\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043c\u043e\u043b\u043e\u0434\u0435\u0436\u0438 \u0438 \u0437\u0440\u0435\u043b\u043e\u0433\u043e \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f, \u043f\u043e\u0434\u0447\u0438\u043d\u044f\u044e\u0442\u0441\u044f <a href=\"https:\/\/www.rbc.ru\/society\/18\/06\/2025\/6852bb1b9a794708357df708\" rel=\"noopener noreferrer nofollow\">\u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c<\/a>. \u0422\u0430\u043a, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0442\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0430 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0438 \u0441 1,4 \u0434\u043e 1,5. \u041d\u043e \u0434\u043e\u0432\u0435\u0441\u0442\u0438 \u0435\u0433\u043e \u0434\u043e 2,2 \u0438\u043b\u0438 2,5 \u0442\u0435\u043c\u0438 \u0436\u0435 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u2013 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e. \u042d\u0442\u043e, \u0431\u0430\u0442\u0435\u043d\u044c\u043a\u0430, \u043d\u0435 \u0433\u0438\u043f\u0435\u0440\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b ML-\u043c\u043e\u0434\u0435\u043b\u044c\u043a\u0430\u043c \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>optuna.<\/code><\/p>\n<div class=\"floating-image\">\n<figure class=\"float bordered full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/60c\/b2e\/0bc\/60cb2e0bcc1037eca88104388dae107d.jpg\" alt=\"\u0414\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b  -   \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430, \u0441\u0433\u0443\u0431\u0438\u0432\u0448\u0430\u044f \u043d\u0435 \u043e\u0434\u043d\u0443 \u0438\u043c\u043f\u0435\u0440\u0438\u044e\" title=\"\u0414\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b  -   \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430, \u0441\u0433\u0443\u0431\u0438\u0432\u0448\u0430\u044f \u043d\u0435 \u043e\u0434\u043d\u0443 \u0438\u043c\u043f\u0435\u0440\u0438\u044e\" width=\"1024\" height=\"1024\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/60c\/b2e\/0bc\/60cb2e0bcc1037eca88104388dae107d.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/60c\/b2e\/0bc\/60cb2e0bcc1037eca88104388dae107d.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b  &#8212;   \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430, \u0441\u0433\u0443\u0431\u0438\u0432\u0448\u0430\u044f \u043d\u0435 \u043e\u0434\u043d\u0443 \u0438\u043c\u043f\u0435\u0440\u0438\u044e<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u0441\u043c\u0435\u043d\u044b \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435. \u0410 \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u2013 \u044d\u0442\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043c\u043f\u044b\u00a0 \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0442\u0435\u0439. \u0417\u0430\u0434\u0430\u0447\u0430\u00a0 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0435\u0448\u0430\u0435\u043c\u043e\u0439: \u043f\u0443\u0442\u0435\u043c \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0430, \u0430\u0440\u0445\u0430\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u043d\u0430 \u0434\u043e\u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u0442\u0430\u043f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f, \u043d\u043e \u043a \u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u0432\u0430\u043b\u043e \u043f\u043e\u0441\u043b\u0435 <a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%9A%D0%B0%D1%82%D0%B0%D1%81%D1%82%D1%80%D0%BE%D1%84%D0%B0_%D0%B1%D1%80%D0%BE%D0%BD%D0%B7%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D0%B0\" rel=\"noopener noreferrer nofollow\">\u041a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u044b \u0431\u0440\u043e\u043d\u0437\u043e\u0432\u043e\u0433\u043e \u0432\u0435\u043a\u0430<\/a>, \u043a\u0440\u0443\u0448\u0435\u043d\u0438\u044f <a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%9F%D0%B0%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%97%D0%B0%D0%BF%D0%B0%D0%B4%D0%BD%D0%BE%D0%B9_%D0%A0%D0%B8%D0%BC%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%BC%D0%BF%D0%B5%D1%80%D0%B8%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043f\u0430\u0434\u043d\u043e\u0439 \u0420\u0438\u043c\u0441\u043a\u043e\u0439 \u0438\u043c\u043f\u0435\u0440\u0438\u0438<\/a> \u0438\u043b\u0438 \u0438\u043d\u044b\u0445 \u00ab\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u0435\u043a\u043e\u0432\u00bb \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u0442\u0432\u0430. <\/p>\n<\/div>\n<p>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u2013 \u044d\u0442\u043e \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0430\u043f\u0438\u0442\u0430\u043b, \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u043e: \u0440\u0435\u0431\u0435\u043d\u043a\u0430 \u043d\u0443\u0436\u043d\u043e \u043e\u0434\u0435\u0442\u044c-\u043e\u0431\u0443\u0442\u044c, \u0432\u043e\u0441\u043f\u0438\u0442\u0430\u0442\u044c, \u043e\u0431\u0443\u0447\u0438\u0442\u044c \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435 \u0438\u043c \u0443\u0440\u043e\u0432\u043d\u044f \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439, \u0430 \u0434\u043b\u044f \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0430 \u2013 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u0434\u0443\u0445\u043e\u0432\u043d\u043e-\u043d\u0440\u0430\u0432\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c, \u0441\u043e\u0446\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0438\u0442\u0443\u0442\u044b \u0438 \u0432\u043e\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0432 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u044e. \u0418\u043d\u0430\u0447\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0430\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u043e\u0440\u043e\u0436\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u0443\u0433\u0440\u0438\u0441\u0442\u043e\u0439. <\/p>\n<details class=\"spoiler\">\n<summary>\u041e \u043c\u043e\u043b\u043e\u0434\u0435\u0436\u043d\u044b\u0445 \u0431\u0443\u0433\u0440\u0430\u0445, \u0440\u0435\u0432\u043e\u043b\u044e\u0446\u0438\u044f\u0445 \u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0412 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u044d\u0442\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u00ab<a href=\"https:\/\/cyberleninka.ru\/article\/n\/molodezhnye-bugry-kak-faktor-sotsialno-politicheskoy-nestabilnosti\" rel=\"noopener noreferrer nofollow\">\u043c\u043e\u043b\u043e\u0434\u0435\u0436\u043d\u044b\u0439 \u0431\u0443\u0433\u043e\u0440<\/a>\u00bb \u0438 100% \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u00ab<a href=\"https:\/\/www.hse.ru\/news\/126789812.html\" rel=\"noopener noreferrer nofollow\">\u0430\u0440\u0430\u0431\u0441\u043a\u043e\u0439 \u0432\u0435\u0441\u043d\u044b\u00bb<\/a> \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u044b <a href=\"https:\/\/www.fnisc.ru\/index.php?page_id=2624&amp;jn=socis&amp;jn=socis&amp;jid=5592\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u043d\u043e\u0439<\/a> \u043f\u0440\u0438\u0440\u043e\u0434\u044b. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0431\u0435\u0441\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0435\u0439 \u2013 <a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%92%D0%B5%D0%BB%D0%B8%D0%BA%D0%BE%D0%B5_%D0%BF%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%80%D0%BE%D0%B4%D0%BE%D0%B2\" rel=\"noopener noreferrer nofollow\">\u0412\u0435\u043b\u0438\u043a\u043e\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u0440\u043e\u0434\u043e\u0432<\/a> \u043a\u0430\u043a \u00a0\u0438 \u0441\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0435\u0441\u044f \u0437\u0430 \u043f\u043e\u043b\u0442\u043e\u0440\u044b \u0442\u044b\u0441\u044f\u0447\u0438 \u043b\u0435\u0442 \u0440\u0430\u043d\u0435\u0435 \u00ab<a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%9D%D0%B0%D1%80%D0%BE%D0%B4%D1%8B_%D0%BC%D0%BE%D1%80%D1%8F\" rel=\"noopener noreferrer nofollow\">\u0412\u0442\u043e\u0440\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u0440\u043e\u0434\u043e\u0432 \u043c\u043e\u0440\u044f<\/a>\u00bb \u043f\u043e\u0433\u0443\u0431\u0438\u043b\u0438 \u043d\u0435 \u043e\u0434\u043d\u0443 \u0438\u043c\u043f\u0435\u0440\u0438\u044e \u0438 \u0446\u0438\u0432\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0440\u0435\u0432\u043d\u043e\u0441\u0442\u0438. \u041e\u0441\u043b\u0430\u0431\u0435\u0432\u0448\u0438\u0435 \u0432\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u043a\u0440\u0438\u0437\u0438\u0441\u0430 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0438\u0442\u0443\u0442\u044b  \u0440\u0430\u043d\u043d\u0435\u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0431\u0449\u0435\u0441\u0442\u0432 \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0438 \u043f\u0435\u0440\u0435\u0432\u0430\u0440\u0438\u0442\u044c \u0438 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0445 \u0447\u043b\u0435\u043d\u043e\u0432 \u0441\u043e\u0446\u0438\u0443\u043c\u0430, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u00ab\u0432\u0442\u043e\u0440\u0433\u0430\u0432\u0448\u0438\u0445\u0441\u044f\u00bb \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u043b\u044f\u0432\u0448\u0438\u0445\u0441\u044f \u0431\u044b\u043b\u043e \u0432 \u0440\u0430\u0437\u044b \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043e\u0441\u0435\u0434\u043b\u043e\u0433\u043e \u043a\u043e\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f. <\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0430, \u0446\u0435\u043d\u0430\u0445 \u043d\u0430 \u0436\u0438\u043b\u044c\u0435 \u0438 \u0415\u0413\u042d <\/summary>\n<div class=\"spoiler__content\">\n<p>\u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0440\u0430\u0441\u0442\u0443\u0449\u0435\u0433\u043e \u043d\u0435\u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430 \u043c\u0435\u0436\u0434\u0443 \u0441\u043b\u043e\u044f\u043c\u0438  \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0433\u043e\u0440\u043e\u0434\u0430 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u0441\u0442\u0430\u043b\u043e \u0434\u043e\u0440\u043e\u0433\u0438\u043c. \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u044b  \u0440\u0430\u0441\u0442\u0435\u0442 <a href=\"https:\/\/lenta.ru\/news\/2025\/06\/23\/rost-tsen-na-zhilie-v-rossii-otsenili\/\" rel=\"noopener noreferrer nofollow\">\u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438\u043d\u0444\u043b\u044f\u0446\u0438\u0438<\/a>, \u043c\u0435\u0442\u0440\u0430\u0436 \u0441\u0440\u0435\u0434\u043d\u0435\u0439 <a href=\"https:\/\/spbhomes.ru\/science\/kak-so-vremenem-menyayutsya-ploshchadi-kvartir\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439<\/a> \u0432 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044e \u00a0\u043d\u043e\u0432\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e \u0441\u0442\u0440\u0430\u043d\u0435 \u0441 2000 \u043f\u043e 2025 \u0433\u043e\u0434 <a href=\"https:\/\/www.kp.ru\/daily\/27473.5\/4680337\/\" rel=\"noopener noreferrer nofollow\">\u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0441\u044f<\/a> \u043d\u0430 1 \u043a\u043e\u043c\u043d\u0430\u0442\u0443 \u0441 80 \u0434\u043e 50\u00a0 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0445 \u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u044d\u043b\u0438\u0442\u043d\u044b\u0445 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432. <\/p>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u043c\u0438\u043d\u0443\u0441 \u043e\u0434\u043d\u0430 \u043a\u043e\u043c\u043d\u0430\u0442\u0430 \u2013 \u043c\u0438\u043d\u0443\u0441 \u043e\u0434\u0438\u043d \u0440\u0435\u0431\u0435\u043d\u043e\u043a \u0432 \u0441\u0435\u043c\u044c\u0435. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043b\u044c\u0433\u043e\u0442\u043d\u043e\u0439 \u0438\u043f\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/www.cian.ru\/novosti-ekspert-rasskazal-o-posledstvijah-beskonechnoj-lgotnoj-ipoteki-333074\/\" rel=\"noopener noreferrer nofollow\">\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0438<\/a> <a href=\"https:\/\/www.vedomosti.ru\/kapital\/mortgage\/articles\/2024\/03\/27\/1028420-kak-lgotnaya-ipoteka-povliyala-na-dostupnost-zhilya-v-rossii\" rel=\"noopener noreferrer nofollow\">\u0446\u0435\u043d\u0443<\/a> \u043a\u0432\u0430\u0440\u0442\u0438\u0440, \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u0438 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u043e\u0439 \u0441\u0444\u0435\u0440\u0435, \u043d\u043e \u0434\u0435 \u0444\u0430\u043a\u0442\u043e \u043d\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0438 <a href=\"https:\/\/www.rbc.ru\/finances\/28\/03\/2023\/6422b6869a79474e04580d5e\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c<\/a> \u0436\u0438\u043b\u044c\u044f. <\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435: \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0441\u0448\u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u2013 \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u043a\u043e\u043b\u043e\u0441\u0441\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0442\u0440\u0430\u0442 \u043d\u0430 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0443 \u043a \u0415\u0413\u042d (60% \u043c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u0438\u0445 \u0434\u0435\u0442\u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0443\u0441\u043b\u0443\u0433\u0430\u043c\u0438 \u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u0440\u0435\u043f\u0435\u0442\u0438\u0442\u043e\u0440\u043e\u0432) \u0438 \u0434\u043e \u0437\u0430\u0442\u0440\u0430\u0442 \u043d\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0432 \u0432\u0443\u0437\u0435. \u0410 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0415\u0413\u042d \u2013 <a href=\"https:\/\/mel.fm\/ucheba\/yege\/5981302-matematika\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0440\u0430\u0441\u0442\u0435\u0442<\/a>. \u0418 \u0441\u0430\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438\u0437 \u043a\u0440\u0430\u0439\u043d\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 <a href=\"https:\/\/cyberleninka.ru\/article\/n\/k-voprosu-o-rabochey-modeli-modernizatsii-edinogo-gosudarstvennogo-ekzamena-dlya-preodoleniya-neravenstva-dostupa-k-vysshemu\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/a> \u043f\u043e\u0442\u0438\u0445\u043e\u043d\u044c\u043a\u0443 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0435\u0435 \u00a0<a href=\"https:\/\/msk1.ru\/text\/education\/2025\/06\/01\/75532340\/\" rel=\"noopener noreferrer nofollow\">\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u0435\u043b<\/a>\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u00a0\u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0442\u0430\u043a \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u043f\u0430\u0433\u0430\u043d\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/%D0%BD%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D1%8B.%D1%80%D1%84\/news\/vybiray-kolledzh-kak-professionalitet-povyshaet-prestizh-rabochikh-professiy\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435<\/a> \u0438 \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a <a href=\"https:\/\/msk1.ru\/text\/education\/2025\/06\/01\/75532340\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u0432\u044b\u0441\u0448\u0435\u0433\u043e<\/a>.\u00a0 \u00a0<\/p>\n<p>\u041c\u0435\u0440\u044b \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043a\u0440\u0430\u0439\u043d\u0435 \u0440\u0430\u0437\u043d\u043e\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e \u0432 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u043e\u0435\u0432. <\/p>\n<p>\u042d\u043b\u0438\u0442\u0430 \u0438 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430  \u043e\u0442 \u043d\u0438\u0445 \u043c\u0430\u043b\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b. \u0414\u043b\u044f \u044d\u043b\u0438\u0442\u044b \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0434\u0435\u0442\u0435\u0439 \u0432 \u0441\u0438\u043b\u0443 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0441\u043a\u043b\u043e\u043d\u043d\u043e\u0441\u0442\u0438 \u043a \u00ab\u044d\u043b\u0438\u0442\u043d\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0443\u00bb &#8212; \u0442\u0430\u043a \u0431\u044b\u043b\u043e \u0438\u0437\u0434\u0440\u0435\u0432\u043b\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0435\u0441\u0442\u044c \u043b\u0443\u0447\u0448\u0438\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043f\u0438\u0442\u0430\u043d\u0438\u044f, \u043c\u0435\u0434\u0438\u0446\u0438\u043d\u0430 \u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435, \u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u043d\u044b\u0435 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0430\u0432\u0430\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u00ab\u043c\u0430\u0442\u0440\u0438\u043c\u043e\u043d\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439\u00bb. \u0420\u044b\u043d\u043e\u043a <a href=\"https:\/\/erzrf.ru\/news\/eksperty-v-moskovskikh-novostroykakh-perestala-umenshatsya-srednyaya-ploshchad-kvartir-i-apartamentov\" rel=\"noopener noreferrer nofollow\">\u044d\u043b\u0438\u0442\u043d\u043e\u0433\u043e<\/a> \u0436\u0438\u043b\u044c\u044f \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d. <\/p>\n<p>\u00ab\u0421\u0440\u0435\u0434\u043d\u0438\u0439 \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u043a\u043b\u0430\u0441\u0441\u00bb \u043d\u0435 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d \u0432 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 \u043e\u0442 \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0430, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u0430 \u043d\u0435 \u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u0438 \u043d\u0435 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u00ab\u0443\u043f\u0443\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u044b\u0433\u043e\u0434\u0443\u00bb \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0438 \u0442\u0440\u0430\u0442\u044f\u0442 \u043d\u0430 \u0432\u043e\u0441\u043f\u0438\u0442\u0430\u043d\u0438\u0435 \u0434\u0435\u0442\u0435\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0438 <a href=\"https:\/\/ren.tv\/news\/v-rossii\/1344349-glava-vtsiom-obiasnil-prichiny-nezhelaniia-rossiian-zavodit-detei\" rel=\"noopener noreferrer nofollow\"><em>\u0436\u0438\u0432\u0443\u0442 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0438 \u043d\u0435 \u0445\u043e\u0442\u044f\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0441\u0432\u043e\u0431\u043e\u0434\u0443<\/em><\/a>. \u0418 \u0434\u0430, \u0437\u0434\u0435\u0441\u044c \u0432 \u0440\u0430\u0437\u0432\u0438\u0442\u044b\u0445 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430\u0445 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u00ab\u0432\u0437\u0440\u043e\u0441\u043b\u043e\u0435 \u0434\u0435\u0442\u0441\u0442\u0432\u043e\u00bb \u0438 \u043f\u0440\u0435\u0441\u043b\u043e\u0432\u0443\u0442\u044b\u0439 <a href=\"https:\/\/habr.com\/ru\/articles\/841656\/\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0444\u0430\u043d\u0442\u0438\u043b\u0438\u0437\u043c<\/a>. <\/p>\n<p>\u041d\u0438\u0436\u043d\u0438\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0438\u0436\u0435  \u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u044b \u0432 \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u0430 \u0443\u0436\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u043e. <\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u0430\u0440\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b, \u043f\u0440\u0435\u043a\u0430\u0440\u0438\u0430\u0442, \u00ab\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e \u0431\u0435\u0434\u043d\u044b\u0435\u00bb &#8212; \u0442\u0430\u043a \u0436\u0435 \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u044e\u0442 \u043d\u0430 \u043c\u0435\u0440\u044b \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438.\u00a0 <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043d\u0430 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e-\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u2013 \u0431\u0435\u0437 \u0443\u0447\u0435\u0442\u0430 \u043d\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e-\u043a\u0443\u043b\u044c\u0442\u0443\u0440\u043d\u044b\u0445, \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043d\u043e\u0441\u044f\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0432\u044b \u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439.<\/p>\n<\/div>\n<\/details>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u2014 \u044d\u0442\u043e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u2013 \u043a\u0430\u043a <a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%92%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D1%8F%D1%8F_%D0%BC%D0%B8%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%BD%D0%B0%D1%81%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f<\/a>, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u0441 \u00ab<a href=\"https:\/\/cyberleninka.ru\/article\/n\/vnutrennyaya-migratsiya-v-rossii-1990-2013-gg-osnovnye-parametry-i-osobennosti-zapadnogo-dreyfa\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u043f\u0430\u0434\u043d\u044b\u043c \u0434\u0440\u0435\u0439\u0444\u043e\u043c\u00bb<\/a>, \u0442\u0430\u043a \u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0435\u0439 \u043c\u043e\u043b\u043e\u0434\u0451\u0436\u0438 \u0438 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0435 \u0432 \u043a\u0440\u0443\u043f\u043d\u044b\u0435 \u0446\u0435\u043d\u0442\u0440\u044b \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0436\u0438\u0437\u043d\u0438.\u00a0 \u0415\u0441\u0442\u044c \u0438 \u0432\u043d\u0435\u0448\u043d\u044f\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u043d\u043e\u0432\u044b\u0445 \u0433\u0440\u0430\u0436\u0434\u0430\u043d \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u043e\u0431\u0449\u0435\u0435 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u0430\u043d\u044b, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043b\u0430\u0433\u043e\u043c \u0434\u043b\u044f \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0430, \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0438 \u0438 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438. \u041d\u043e \u043f\u0440\u0438 \u043f\u0440\u0435\u043d\u0435\u0431\u0440\u0435\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u043e\u043d\u0430  \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0441\u0442\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u0440\u0438\u0437\u0438\u0441\u043e\u0432 \u0438 \u043f\u043e\u0442\u0440\u044f\u0441\u0435\u043d\u0438\u0439.<\/p>\n<p><s>\u0425\u044c\u044e\u0441\u0442\u043e\u043d,<\/s> \u0443 \u043d\u0430\u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b: \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u043c\u0435\u0440\u044b \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0441\u0442\u0438\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u043e\u0435\u0432, \u0440\u0435\u0433\u0438\u043e\u043d\u044b \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u043e\u0439 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0431\u0430\u0437\u043e\u0439 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438. \u0412\u043d\u0435\u0448\u043d\u0438\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430\u043c\u0438 \u0438 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430\u043c\u0438 \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043a \u043d\u0435\u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u043e\u0441\u0442\u044f\u043c \u0438 \u0440\u0430\u0437\u043c\u044b\u0442\u0438\u044e \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430. \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043a \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u00ab\u0432\u044b\u043c\u043e\u0440\u043e\u0447\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u00bb, <a href=\"https:\/\/www.theatlantic.com\/education\/archive\/2019\/07\/education-deserts-across-rural-america\/593071\/\" rel=\"noopener noreferrer nofollow\">\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 <\/a>\u00a0\u0438\u043b\u0438 <a href=\"https:\/\/iq-media.ru\/archive\/275451404\" rel=\"noopener noreferrer nofollow\">\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0441\u043a\u0438\u0445<\/a> \u043f\u0443\u0441\u0442\u044b\u043d\u044c. <\/p>\n<p>\u0411\u0443\u0434\u0435\u043c \u0438\u0445 \u0440\u0435\u0448\u0430\u0442\u044c. <\/p>\n<p><strong>\u041c\u043e\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430<\/strong><\/p>\n<p>\u041d\u0430\u0448 \u0438\u0434\u0435\u0430\u043b \u2013 \u044d\u0442\u043e 89 \u0418\u0418-\u0430\u0433\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0449\u0438\u0445 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u044f\u043c\u0438, \u0438\u0445 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c, \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u043e\u0439 \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435  \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0440\u0433\u0430\u043d\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u043b\u0430\u0441\u0442\u0438 (\u0420\u041e\u0418\u0412) \u0438\u043b\u0438 \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u0438\u0442\u0435\u0442\u043e\u0432 (\u041e\u041c\u0421\u0423) \u043f\u043e \u0441\u0442\u0438\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e\/\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438, \u043c\u0435\u0442\u043e\u0434\u0430\u043c \u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c. \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u0434 \u043c\u0443\u0434\u0440\u044b\u043c \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e\u043c \u0444\u0435\u0434\u0435\u0440\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430. <\/p>\n<p>\u0421\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u0441\u044e \u0441\u0440\u0435\u0434\u0443 \u0434\u043b\u044f \u0443 \u043d\u0430\u0441 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u2013 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u044b \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 \u0438\u0437-\u0437\u0430 \u043f\u0440\u0435\u0441\u043b\u043e\u0432\u0443\u0442\u043e\u0433\u043e \u00ab<a href=\"https:\/\/habr.com\/ru\/articles\/707146\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u043a\u043b\u044f\u0442\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/a>\u00bb \u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438. \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0444\u0430\u043a\u0442\u043e\u0440\u0430\u0445 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u0445. \u0423\u0447\u0438\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 7 \u0430\u0433\u0435\u043d\u0442\u043e\u0432, \u0430 \u043f\u043e\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0443 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445. \u041c\u0435\u0442\u043e\u0434\u0438\u043a\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f &#8212; <code>Multi-agent Deep Deterministic Policy Gradient.<\/code><\/p>\n<p><code>MADDPG<\/code> \u2014 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u0430\u0433\u0435\u043d\u0442\u0430\u043c \u043e\u0431\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u0438 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0430\u0442\u044c \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439 \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439. \u042d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 <code>DDPG <\/code>(<code>Deep Deterministic Policy Gradient)<\/code><\/p>\n<details class=\"spoiler\">\n<summary>MADDPG, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 <\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p><strong>\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0438 \u0434\u0435\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435<\/strong>. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435 \u0430\u0433\u0435\u043d\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c (\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0435\u0439 \u0441 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 &#8212; \u043f\u0440\u0435\u0441\u043b\u043e\u0432\u0443\u0442\u044b\u043c \u00ab\u0444\u0435\u0434\u0435\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u0446\u0435\u043d\u0442\u0440\u043e\u043c\u00bb) \u0438\u043b\u0438 \u043a\u0440\u0438\u0442\u0438\u043a\u043e\u043c, \u043d\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f, \u0430 \u0430\u0433\u0435\u043d\u0442\u044b \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430\u043c\u0438 \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445<\/strong>. MADDPG \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435, \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0435 \u0438 \u0441\u043c\u0435\u0448\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u0445. \u041a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u044f \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0439 \u0437\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u043a\u0430\u0434\u0440\u044b, \u043c\u0438\u0433\u0440\u0430\u043d\u0442\u043e\u0432 &#8212; \u043a\u0440\u0430\u0439\u043d\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u043e\u0432. <\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438<\/strong>. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u0433\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u043e\u043d\u0438 \u0432\u0438\u0434\u044f\u0442 \u0438 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0449\u0443\u043f\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c.<\/p>\n<\/li>\n<li>\n<p><strong>\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0430\u043d\u0441\u0430\u043c\u0431\u043b\u0435\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a<\/strong>. \u0427\u0442\u043e\u0431\u044b \u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043f\u0435\u0440\u0435\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432, MADDPG \u043e\u0431\u0443\u0447\u0430\u0435\u0442 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u0438\u0437 \u043d\u0430\u0431\u043e\u0440\u0430 \u043f\u043e\u0434\u043f\u043e\u043b\u0438\u0442\u0438\u043a \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0430\u043a\u0442\u043e\u0440-\u043a\u0440\u0438\u0442\u0438\u043a<\/strong>\u00a0\u0432 MADDPG: \u043a\u0430\u0436\u0434\u044b\u0439 \u0430\u0433\u0435\u043d\u0442 \u0438\u043c\u0435\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u0435\u0442\u044c \u0430\u043a\u0442\u043e\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439. \u0423 \u0432\u0441\u0435\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043e\u0431\u0449\u0430\u044f \u0441\u0435\u0442\u044c \u043a\u0440\u0438\u0442\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439 \u0432\u0441\u0435\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043a\u0438\u0431\u0435\u0440\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u043e\u0442 &#171;\u0440\u043e\u044f \u0434\u0440\u043e\u043d\u043e\u0432&#187; \u0434\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0438\u0445 \u043b\u044e\u0431\u0438\u043c\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.  <\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p>\u0418\u0442\u0430\u043a, \u043c\u044b \u0443\u0447\u0438\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u0441\u0435\u043c\u044c\u044e \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c\u0438. \u0420\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c  \u0445\u043e\u0442\u044c \u0438 \u0432 \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u0439, \u043d\u043e  \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435  \u0441 <code>Torch<\/code> \u0431\u0435\u0437 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446 \u0442\u0438\u043f\u0430  <code>Gymnasium\u00a0   <\/code><\/p>\n<details class=\"spoiler\">\n<summary>\u0413\u0438\u043f\u0435\u0440\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f <\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># ================== \u0413\u0438\u043f\u0435\u0440\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b ================== NUM_REGIONS = 7         # \u041e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432 (\u0430\u0433\u0435\u043d\u0442\u043e\u0432) \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 - \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e EPISODES = 100          # \u041e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f STEPS = 200             # \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0448\u0430\u0433\u043e\u0432 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u044d\u043f\u0438\u0437\u043e\u0434\u0435 TOTAL_STEPS = EPISODES * STEPS   # \u041e\u0431\u0449\u0430\u044f \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043f\u0438\u0437\u043e\u0434\u0430 BATCH_SIZE = 64         # \u0420\u0430\u0437\u043c\u0435\u0440 \u0431\u0430\u0442\u0447\u0430 \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 GAMMA = 0.95            # \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0434\u0438\u0441\u043a\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u043e\u0437\u043d\u0430\u0433\u0440\u0430\u0436\u0434\u0435\u043d\u0438\u044f TAU = 0.01              # \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u043b\u044f \u043c\u044f\u0433\u043a\u043e\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0441\u0435\u0442\u0438 LR_ACTOR = 0.001        # \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0441\u0435\u0442\u0438 Actor LR_CRITIC = 0.002       # \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0441\u0435\u0442\u0438 Critic HIDDEN_SIZE = 64        # \u0420\u0430\u0437\u043c\u0435\u0440 \u0441\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0441\u043b\u043e\u044f \u0432 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438<\/code><\/pre>\n<\/div>\n<\/details>\n<h3>Stage 1. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u0441 7 \u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 7 \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c\u0438<\/h3>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0443 \u043d\u0430\u0441 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f 7 \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432 \u0441  \u0447\u0435\u0442\u044b\u0440\u044c\u043c\u044f \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f\u043c\u0438 (\u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u0435, \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0430, \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430). \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430\u0433\u0440\u0430\u0434\u044b \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f, \u0440\u043e\u0441\u0442 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u0438\u0442\u0438\u043a \u043c\u0435\u0436\u0434\u0443 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u043c\u0438 \u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438. \u041e\u043f\u044f\u0442\u044c \u0436\u0435 \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u0443\u044e \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u044e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0430\u0433\u0435\u043d\u0442\u043e\u0432. <\/p>\n<details class=\"spoiler\">\n<summary>\u041c\u043e\u0434\u0435\u043b\u044c \u0441\u0440\u0435\u0434\u044b<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># ================== \u041c\u043e\u0434\u0435\u043b\u044c \u0441\u0440\u0435\u0434\u044b ================== class MigrationEnvironment:     \"\"\"\u0421\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043c\u0435\u0436\u0434\u0443 \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c\u0438\"\"\"  # \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430     def __init__(self):  # \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430         self.reset()      # \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u0441\u0431\u0440\u043e\u0441\u0430 \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438      def reset(self):         \"\"\"         \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b:         [\u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u0435, \u0440\u0435\u0441\u0443\u0440\u0441\u044b, \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0430, \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430]         \"\"\"         self.states = np.random.uniform(0.5, 1.5, (NUM_REGIONS, 4))  # \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439         self.states[:,3] = 0.0  # \u0418\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043d\u0435\u0439\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f         return self.states.copy()  # \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043a\u043e\u043f\u0438\u044e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439      def step(self, actions):         \"\"\"         \u0428\u0430\u0433 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438         \u0412\u0445\u043e\u0434: \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0430\u0433\u0435\u043d\u0442\u043e\u0432 (\u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438)         \u0412\u044b\u0445\u043e\u0434: \u043d\u043e\u0432\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043d\u0430\u0433\u0440\u0430\u0434\u044b, \u0444\u043b\u0430\u0433 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f         \"\"\"         next_states = np.zeros_like(self.states)  # \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u043d\u043e\u0432\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439         rewards = np.zeros(NUM_REGIONS)           # \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u043d\u0430\u0433\u0440\u0430\u0434          for i in range(NUM_REGIONS):  # \u041f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0440\u0435\u0433\u0438\u043e\u043d\u0443             # 1. \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438             self.states[i,3] = np.clip(self.states[i,3] + actions[i][0], -1, 1)  # \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438              # 2. \u0420\u0430\u0441\u0447\u0435\u0442 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432             migration = 0.1 * (self.states[i,3] - np.mean([self.states[j,3] for j in self.neighbors(i)]))  # \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a             self.states[i,0] = np.clip(self.states[i,0] + migration, 0.1, 2.0)  # \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u0435 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438              # 3. \u042d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430             economic_growth = 0.05 * self.states[i,0] * (1 + self.states[i,3])  # \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u043e\u0441\u0442             self.states[i,2] = np.clip(self.states[i,2] + economic_growth, 0.1, 2.0)  # \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0443              # 4. \u041f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432             resource_usage = 0.02 * self.states[i,0] * self.states[i,2]  # \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432             self.states[i,1] = np.clip(self.states[i,1] - resource_usage, 0.1, 2.0)  # \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432              # 5. \u0420\u0430\u0441\u0447\u0435\u0442 \u043d\u0430\u0433\u0440\u0430\u0434 (\u0446\u0435\u043b\u0435\u0432\u044b\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438)             rewards[i] = self._calculate_reward(i)  # \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0433\u0440\u0430\u0434\u0443 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430          return self.states.copy(), rewards, False, {}  # \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043d\u0430\u0433\u0440\u0430\u0434\u044b \u0438 \u0444\u043b\u0430\u0433 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f      def _calculate_reward(self, region):         \"\"\"\u041a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u043d\u0430\u0433\u0440\u0430\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u043e\u043d\u0430\"\"\"         pop_balance = -abs(self.states[region,0] - 1.0)    # \u0411\u0430\u043b\u0430\u043d\u0441 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f         economy = self.states[region,2] - 1.0              # \u0420\u043e\u0441\u0442 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0438         resources = -0.5*(1.0 - self.states[region,1])     # \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432         policy_align = 0.2 * np.mean([1 - abs(self.states[region,3] - self.states[j,3]) for j in self.neighbors(region)])  # \u0421\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438         return pop_balance + economy + resources + policy_align  # \u0418\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u043d\u0430\u0433\u0440\u0430\u0434\u0430      def neighbors(self, region):         \"\"\"\u0422\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u044f \u0441\u043e\u0441\u0435\u0434\u0441\u0442\u0432\u0430 \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432 (\u043a\u043e\u043b\u044c\u0446\u0435\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430)\"\"\"         return [(region-1)%NUM_REGIONS, (region+1)%NUM_REGIONS]  # \u0421\u043e\u0441\u0435\u0434\u0438 \u043f\u043e \u043a\u043e\u043b\u044c\u0446\u0443<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 <code>[0,5, 1,5<\/code>]. \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u044b, \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0435\u0433\u0438\u043e\u043d \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0442\u044b\u0440\u044c\u043c\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438:  \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u0435 (\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u044c),  \u0440\u0435\u0441\u0443\u0440\u0441\u044b (\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f),  \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0430 (\u0443\u0440\u043e\u0432\u0435\u043d\u044c \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f),  \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 (\u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440).  <\/p>\n<p>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0430\u0433\u0435\u043d\u0442\u043e\u0432.  \u0410\u0433\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f:  \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0440\u0435\u0433\u0438\u043e\u043d\u0430, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 <code>[-1, 1]<\/code>, \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438, \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0443 \u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. <\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u043d\u0430\u0433\u0440\u0430\u0436\u0434\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u0430\u044f \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b: \u0441\u0442\u0440\u0435\u043c\u043b\u0435\u043d\u0438\u0435 \u043a \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f <code>(~1,0)<\/code>, \u043c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u043e\u0441\u0442\u0430, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0441 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u043c\u0438 \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c\u0438.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0439 (\u043c\u043e\u0434\u0443\u043b\u044c \u0430\u043a\u0442\u043e\u0440-\u043a\u0440\u0438\u0442\u0438\u043a), \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u0430\u043c \u043a\u043b\u0430\u0441\u0441 <code>MADDPG <\/code>  \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0448\u0443\u043c\u043e\u0432\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 (\u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438  \u0441\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u0430\u043d\u0434\u0435\u043c\u0438\u0438 \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u043d\u0435\u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u044f\u0432\u043b\u0435\u043d\u0438\u044f, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439), \u0431\u0443\u0444\u0435\u0440\u043e\u043c \u043e\u043f\u044b\u0442\u0430 \u0438 \u043c\u044f\u0433\u043a\u0438\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0441\u0435\u0442\u0438 \u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430 &#8212;  <code>Agent.<\/code><\/p>\n<details class=\"spoiler\">\n<summary>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0439 \u0430\u043a\u0442\u043e\u0440\u0430-\u043a\u0440\u0438\u0442\u0438\u043a\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># ================== \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0439 ================== class Actor(nn.Module):     \"\"\"\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u0430\u0433\u0435\u043d\u0442\u0430 (\u0434\u0435\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f)\"\"\"  # \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430     def __init__(self):  # \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430         super().__init__()  # \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430         self.net = nn.Sequential(  # \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u043b\u043e\u0435\u0432             nn.Linear(4, HIDDEN_SIZE),  # \u0412\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u043b\u043e\u0439: 4 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f -&gt; HIDDEN_SIZE \u043d\u0435\u0439\u0440\u043e\u043d\u043e\u0432             nn.ReLU(),                 # \u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f ReLU             nn.Linear(HIDDEN_SIZE, HIDDEN_SIZE\/\/2),  # \u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0441\u043b\u043e\u0439: HIDDEN_SIZE -&gt; HIDDEN_SIZE\/2             nn.ReLU(),                 # \u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f ReLU             nn.Linear(HIDDEN_SIZE\/\/2, 1),  # \u0412\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u043b\u043e\u0439: HIDDEN_SIZE\/2 -&gt; 1 \u0432\u044b\u0445\u043e\u0434             nn.Tanh()                  # \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 Tanh \u0434\u043b\u044f \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [-1, 1]         )      def forward(self, x):  # \u041c\u0435\u0442\u043e\u0434 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f         return self.net(x)  # \u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u0445\u043e\u0434 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0442\u044c  class Critic(nn.Module):     \"\"\"\u0426\u0435\u043d\u043d\u043e\u0441\u0442\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f (\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f)\"\"\"  # \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430     def __init__(self):  # \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430         super().__init__()  # \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430         self.net = nn.Sequential(  # \u041f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u043b\u043e\u0435\u0432             nn.Linear(4*NUM_REGIONS + NUM_REGIONS, HIDDEN_SIZE*2),  # \u0412\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u043b\u043e\u0439: 4 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f * NUM_REGIONS + NUM_REGIONS \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 -&gt; HIDDEN_SIZE*2 \u043d\u0435\u0439\u0440\u043e\u043d\u043e\u0432             nn.ReLU(),  # \u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f ReLU             nn.Linear(HIDDEN_SIZE*2, HIDDEN_SIZE),  # \u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0441\u043b\u043e\u0439: HIDDEN_SIZE*2 -&gt; HIDDEN_SIZE             nn.ReLU(),  # \u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f ReLU             nn.Linear(HIDDEN_SIZE, 1)  # \u0412\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u043b\u043e\u0439: HIDDEN_SIZE -&gt; 1 \u0432\u044b\u0445\u043e\u0434         )      def forward(self, states, actions):  # \u041c\u0435\u0442\u043e\u0434 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u044f         # \u041a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432\u0441\u0435\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432         x = torch.cat([states.flatten(1), actions.flatten(1)], dim=1)  # \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u043e\u0434\u0438\u043d \u0432\u0435\u043a\u0442\u043e\u0440         return self.net(x)  # \u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u043a\u0442\u043e\u0440 \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0442\u044c<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 MADDPG<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># ================== \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f MADDPG ================== class MADDPG:     \"\"\"\u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043e\u0440 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f\"\"\"  # \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430     def _get_actions(self, states):  # \u041c\u0435\u0442\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439         \"\"\"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0441 \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u043c \u0448\u0443\u043c\u043e\u043c\"\"\"  # \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430         actions = []  # \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439         for i, agent in enumerate(self.agents):  # \u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0430\u0433\u0435\u043d\u0442\u043e\u0432             state = torch.FloatTensor(states[i])  # \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 \u0442\u0435\u043d\u0437\u043e\u0440             action = agent.actor(state).detach().numpy()  # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043e\u0442 \u0430\u043a\u0442\u043e\u0440\u0430              # \u0410\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0439 \u0448\u0443\u043c \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439             noise_scale = 0.1 * max(0, 1 - agent.steps_done\/TOTAL_STEPS)  # \u041c\u0430\u0441\u0448\u0442\u0430\u0431 \u0448\u0443\u043c\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c             action += np.random.normal(0, noise_scale)  # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0433\u0430\u0443\u0441\u0441\u043e\u0432\u0441\u043a\u0438\u0439 \u0448\u0443\u043c \u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e              actions.append(np.clip(action, -1, 1))  # \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 [-1, 1]         return actions  # \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439      def __init__(self):  # \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430         self.agents = [Agent(i) for i in range(NUM_REGIONS)]  # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0433\u0435\u043d\u0442\u043e\u0432         self.memory = deque(maxlen=100000)  # \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u044b\u0442\u0430         self.env = MigrationEnvironment()  # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0440\u0435\u0434\u0443         self.avg_rewards = []  # \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u043d\u0438\u0445 \u043d\u0430\u0433\u0440\u0430\u0434         self.steps_done = 0  # \u0421\u0447\u0435\u0442\u0447\u0438\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0448\u0430\u0433\u043e\u0432      def train(self):         \"\"\"\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0448\u0430\u0433\u043e\u0432\"\"\"         total_steps = EPISODES * STEPS  # \u041e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0448\u0430\u0433\u043e\u0432          for episode in range(EPISODES):  # \u0426\u0438\u043a\u043b \u043f\u043e \u044d\u043f\u0438\u0437\u043e\u0434\u0430\u043c             states = self.env.reset()  # \u0421\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0440\u0435\u0434\u0443 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u043c             episode_rewards = np.zeros(NUM_REGIONS)  # \u041c\u0430\u0441\u0441\u0438\u0432 \u0434\u043b\u044f \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u0430\u0433\u0440\u0430\u0434 \u0437\u0430 \u044d\u043f\u0438\u0437\u043e\u0434              for _ in range(STEPS):  # \u0426\u0438\u043a\u043b \u043f\u043e \u0448\u0430\u0433\u0430\u043c \u0432\u043d\u0443\u0442\u0440\u0438 \u044d\u043f\u0438\u0437\u043e\u0434\u0430                 actions = self._get_actions(states)  # \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f                 next_states, rewards, _, _ = self.env.step(actions)  # \u0414\u0435\u043b\u0430\u0435\u043c \u0448\u0430\u0433 \u0432 \u0441\u0440\u0435\u0434\u0435                  self.memory.append((states, actions, rewards, next_states))  # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u043f\u044b\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c                  if len(self.memory) &gt; BATCH_SIZE:  # \u0415\u0441\u043b\u0438 \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u0430\u043d\u043d\u044b\u0445                     self._update_agents()  # \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0430\u0433\u0435\u043d\u0442\u043e\u0432                  # \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432                 for agent in self.agents:  # \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430                     agent.steps_done = min(agent.steps_done + 1, total_steps)  # \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0448\u0430\u0433\u043e\u0432                  states = next_states  # \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e                 episode_rewards += rewards  # \u041d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0433\u0440\u0430\u0434\u044b \u0437\u0430 \u044d\u043f\u0438\u0437\u043e\u0434              avg_reward = np.mean(episode_rewards)  # \u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u043e\u0437\u043d\u0430\u0433\u0440\u0430\u0436\u0434\u0435\u043d\u0438\u0435 \u0437\u0430 \u044d\u043f\u0438\u0437\u043e\u0434             self.avg_rewards.append(avg_reward)  # \u0417\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u043e\u0437\u043d\u0430\u0433\u0440\u0430\u0436\u0434\u0435\u043d\u0438\u0435             print(f\"Episode {episode+1}, Reward: {avg_reward:.2f} Steps: {self.agents[0].steps_done}\")  # \u0412\u044b\u0432\u043e\u0434\u0438\u043c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443          self._plot_results()  # \u0421\u0442\u0440\u043e\u0438\u043c \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432      def _get_actions(self, states):         actions = []  # \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439         for i, agent in enumerate(self.agents):  # \u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0430\u0433\u0435\u043d\u0442\u043e\u0432             state = torch.FloatTensor(states[i])  # \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 \u0442\u0435\u043d\u0437\u043e\u0440             action = agent.actor(state).detach().numpy()  # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043e\u0442 \u0430\u043a\u0442\u043e\u0440\u0430              # \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0440\u0430\u0441\u0447\u0435\u0442 \u0443\u0440\u043e\u0432\u043d\u044f \u0448\u0443\u043c\u0430             total_steps = EPISODES * STEPS  # \u041e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0448\u0430\u0433\u043e\u0432             progress = agent.steps_done \/ total_steps  # \u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f             noise_scale = 0.1 * max(0, 1 - progress)  # \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c \u0448\u0443\u043c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0443              action += np.random.normal(0, noise_scale)  # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0433\u0430\u0443\u0441\u0441\u043e\u0432\u0441\u043a\u0438\u0439 \u0448\u0443\u043c \u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e             actions.append(np.clip(action, -1, 1))  # \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 [-1, 1]         return actions  # \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439      def _update_agents(self):         \"\"\"\u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c\u0438 \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445\"\"\"         if len(self.memory) &lt; BATCH_SIZE:  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f             return          batch = random.sample(self.memory, BATCH_SIZE)  # \u0412\u044b\u0431\u043e\u0440\u043a\u0430 \u0431\u0430\u0442\u0447\u0430 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438          # \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0442\u0435\u043d\u0437\u043e\u0440\u044b         states = torch.FloatTensor(np.array([item[0] for item in batch]))  # \u0422\u0435\u043a\u0443\u0449\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f         actions = torch.FloatTensor(np.array([item[1] for item in batch]))  # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0430\u0433\u0435\u043d\u0442\u043e\u0432         rewards = torch.FloatTensor(np.array([item[2] for item in batch]))  # \u041d\u0430\u0433\u0440\u0430\u0434\u044b         next_states = torch.FloatTensor(np.array([item[3] for item in batch]))  # \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f          for idx, agent in enumerate(self.agents):  # \u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0430\u0433\u0435\u043d\u0442\u043e\u0432             # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0440\u0438\u0442\u0438\u043a\u0430             agent.critic_optim.zero_grad()  # \u0421\u0431\u0440\u043e\u0441 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u0430              with torch.no_grad():  # \u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435                 target_actions = torch.cat([  # \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0446\u0435\u043b\u0435\u0432\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432\u0441\u0435\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432                     a.actor_target(next_states[:,i,:])  # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u0430\u0440\u0433\u0435\u0442-\u0430\u043a\u0442\u043e\u0440\u043e\u0432                     for i, a in enumerate(self.agents)], dim=1)                  target_q = rewards[:,idx] + GAMMA * agent.critic_target(  # \u041e\u0446\u0435\u043d\u043a\u0430 Q-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439                     next_states.view(BATCH_SIZE, -1),  # \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f                     target_actions).squeeze()  # \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043a\u0440\u0438\u0442\u0438\u043a\u0430-\u0442\u0430\u0440\u0433\u0435\u0442\u0430              current_q = agent.critic(  # \u0422\u0435\u043a\u0443\u0449\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 Q-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439                 states.view(BATCH_SIZE, -1),  # \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f                 actions.view(BATCH_SIZE, -1)).squeeze()  # \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043a\u0440\u0438\u0442\u0438\u043a\u0430              critic_loss = nn.MSELoss()(current_q, target_q)  # \u041f\u043e\u0442\u0435\u0440\u044f \u043a\u0440\u0438\u0442\u0438\u043a\u0430             critic_loss.backward()  # \u041e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438             agent.critic_optim.step()  # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0441\u0430 \u043a\u0440\u0438\u0442\u0438\u043a\u0430              # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0430\u043a\u0442\u043e\u0440\u0430             agent.actor_optim.zero_grad()  # \u0421\u0431\u0440\u043e\u0441 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u0430             new_actions = []  # \u0421\u043f\u0438\u0441\u043e\u043a \u043d\u043e\u0432\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439             for i, a in enumerate(self.agents):  # \u041f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u0430\u0433\u0435\u043d\u0442\u043e\u0432                 if i == idx:  # \u0415\u0441\u043b\u0438 \u0430\u0433\u0435\u043d\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u043c                     new_actions.append(a.actor(states[:,i,:]))  # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0430\u043a\u0442\u043e\u0440                 else:                     new_actions.append(a.actor(states[:,i,:]).detach())  # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f              actor_loss = -agent.critic(  # \u041f\u043e\u0442\u0435\u0440\u044f \u0430\u043a\u0442\u043e\u0440\u0430                 states.view(BATCH_SIZE, -1),  # \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f                 torch.cat(new_actions, dim=1)).mean()  # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u043e\u0446\u0435\u043d\u043a\u0438 Q-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439             actor_loss.backward()  # \u041e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438             agent.actor_optim.step()  # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0441\u0430 \u0430\u043a\u0442\u043e\u0440\u0430              # \u041c\u044f\u0433\u043a\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435             self._soft_update(agent.actor, agent.actor_target)  # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0430\u043a\u0442\u043e\u0440\u0430             self._soft_update(agent.critic, agent.critic_target)  # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0440\u0438\u0442\u0438\u043a\u0430      def _soft_update(self, local_model, target_model):         \"\"\"\u041c\u044f\u0433\u043a\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0441\u0435\u0442\u0435\u0439 (TAU)\"\"\"         for target_param, local_param in zip(target_model.parameters(),  # \u0418\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u043e\u0431\u0435\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439                                             local_model.parameters()):             target_param.data.copy_(  # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 TAU                 TAU * local_param.data + (1 - TAU) * target_param.data)  # \u0418\u043d\u0442\u0435\u0440\u043f\u043e\u043b\u044f\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0438 \u0446\u0435\u043b\u0435\u0432\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438      def _plot_results(self):         \"\"\"\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f\"\"\"         plt.figure(figsize=(15, 5))  # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0438\u0433\u0443\u0440\u044b \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c          # \u0413\u0440\u0430\u0444\u0438\u043a \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f         plt.subplot(1, 2, 1)  # \u0420\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438         plt.plot(self.avg_rewards)  # \u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0430\u0434\u044b         plt.title('\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f')  # \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0433\u0440\u0430\u0444\u0438\u043a\u0430         plt.xlabel('\u042d\u043f\u0438\u0437\u043e\u0434')  # \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u043e\u0441\u0438 X         plt.ylabel('\u0421\u0440\u0435\u0434\u043d\u044f\u044f \u043d\u0430\u0433\u0440\u0430\u0434\u0430')  # \u041f\u043e\u0434\u043f\u0438\u0441\u044c \u043e\u0441\u0438 Y         plt.grid(True)  # \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u0435\u0442\u043a\u0438          # \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439         states = self.env.reset()  # \u0421\u0431\u0440\u043e\u0441 \u0441\u0440\u0435\u0434\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439         initial = states.copy()  # \u041a\u043e\u043f\u0438\u044f \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439          # \u0421\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438         for _ in range(STEPS):  # \u041f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0448\u0430\u0433\u043e\u0432             actions = self._get_actions(states)  # \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439             states, _, _, _ = self.env.step(actions)  # \u0428\u0430\u0433 \u0432 \u0441\u0440\u0435\u0434\u0435          # \u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439         plt.subplot(1, 2, 2)  # \u0412\u0442\u043e\u0440\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a\u0430         width = 0.35  # \u0428\u0438\u0440\u0438\u043d\u0430 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b         plt.bar(np.arange(NUM_REGIONS) - width\/2, initial[:,0],  # \u0421\u0442\u043e\u043b\u0431\u0446\u044b \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f                 width, label='\u041d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u0435 \u0433\u043e\u0440\u043e\u0434\u0430 \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435')  # \u041c\u0435\u0442\u043a\u0438 \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0438         plt.bar(np.arange(NUM_REGIONS) + width\/2, states[:,0],  # \u0421\u0442\u043e\u043b\u0431\u0446\u044b \u0434\u043b\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f                 width, label='\u041d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u043e\u043d\u0430 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430')  # \u041c\u0435\u0442\u043a\u0438 \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0438         plt.xticks(np.arange(NUM_REGIONS),  # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043c\u0435\u0442\u043e\u043a \u043e\u0441\u0438 X                    [f'\u0420\u0435\u0433\u0438\u043e\u043d {i}' for i in range(NUM_REGIONS)])  # \u041f\u043e\u0434\u043f\u0438\u0441\u0438 \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432         plt.title('\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f')  # \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0433\u0440\u0430\u0444\u0438\u043a\u0430         plt.legend()  # \u041b\u0435\u0433\u0435\u043d\u0434\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0430         plt.tight_layout()  # \u0423\u043f\u043b\u043e\u0442\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0438 \u0433\u0440\u0430\u0444\u0438\u043a\u0430         plt.show()  # \u041f\u043e\u043a\u0430\u0437 \u0433\u0440\u0430\u0444\u0438\u043a\u0430<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0410\u0433\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u043a\u043b\u0430\u0441\u0441<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">class Agent:     \"\"\"\u0418\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0430\u0433\u0435\u043d\u0442\u0430 \u0441\u043e \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u043c \u0448\u0430\u0433\u043e\u0432\"\"\"  # \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430     def __init__(self, idx):  # \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430         self.actor = Actor()  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0435\u0442\u0438 \u0430\u043a\u0442\u043e\u0440\u0430         self.actor_target = Actor()  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0441\u0435\u0442\u0438 \u0430\u043a\u0442\u043e\u0440\u0430         self.critic = Critic()  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0435\u0442\u0438 \u043a\u0440\u0438\u0442\u0438\u043a\u0430         self.critic_target = Critic()  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0441\u0435\u0442\u0438 \u043a\u0440\u0438\u0442\u0438\u043a\u0430          self.actor_optim = optim.Adam(self.actor.parameters(), lr=LR_ACTOR)  # \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0430\u043a\u0442\u043e\u0440\u0430         self.critic_optim = optim.Adam(self.critic.parameters(), lr=LR_CRITIC)  # \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043a\u0440\u0438\u0442\u0438\u043a\u0430          self.actor_target.load_state_dict(self.actor.state_dict())  # \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0430\u043a\u0442\u043e\u0440\u0430 \u0432 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0441\u0435\u0442\u044c         self.critic_target.load_state_dict(self.critic.state_dict())  # \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043a\u0440\u0438\u0442\u0438\u043a\u0430 \u0432 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0441\u0435\u0442\u044c         self.steps_done = 0  # \u0421\u0447\u0435\u0442\u0447\u0438\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0448\u0430\u0433\u043e\u0432         self.max_steps = EPISODES * STEPS  # \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0448\u0430\u0433\u043e\u0432      def increment_steps(self):  # \u041c\u0435\u0442\u043e\u0434 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0448\u0430\u0433\u043e\u0432         self.steps_done = min(self.steps_done + 1, self.max_steps)  # \u0423\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0430 \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u043b\u0438\u043c\u0438\u0442\u0430<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u044c \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f (\u0438 \u0434\u0430\u0436\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u0440\u043e\u0441\u0442), \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0438, \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439. \u041e\u0431\u0449\u0430\u044f \u043d\u0430\u0433\u0440\u0430\u0434\u0430 \u0441\u0442\u0430\u043b\u0430 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439, \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043e\u0431\u0443\u0447\u0438\u043b\u0441\u044f \u043f\u043e\u0441\u043b\u0435 20 \u044d\u043f\u043e\u0445\u0438.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4bd\/d0c\/d89\/4bdd0cd892d8bbd92813f37434f06c2d.jpg\" alt=\"\u0413\u0440\u0430\u0444\u0438\u043a \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0430\u0434\u044b, \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u0438 \u0432 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\" title=\"\u0413\u0440\u0430\u0444\u0438\u043a \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0430\u0434\u044b, \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u0438 \u0432 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\" width=\"1493\" height=\"491\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/4bd\/d0c\/d89\/4bdd0cd892d8bbd92813f37434f06c2d.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4bd\/d0c\/d89\/4bdd0cd892d8bbd92813f37434f06c2d.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0413\u0440\u0430\u0444\u0438\u043a \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0430\u0434\u044b, \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u0438 \u0432 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u0442\u0430\u043a, \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d &#8212; \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 <a href=\"https:\/\/github.com\/AntonDozhdikov\/AntonDozhdikov\/blob\/main\/Demography_MADDPG.ipynb\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>. <\/p>\n<p>\u0423 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0435\u0441\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438: \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 <code>Agent <\/code>\u0432 \u043a\u043e\u0434\u0435,  \u043d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>_soft_update<\/code>, \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0441\u0435\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. <\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043b\u0438 \u0438\u0434\u0435\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f: \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0440\u0435\u0433\u0438\u043e\u043d\u0430 (\u0432\u0441\u0435\u0433\u043e 4 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430), \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u0430\u044f \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u044f \u0441\u0432\u044f\u0437\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c\u0438 (\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u043c\u0435\u0435\u0442 \u0441\u0435\u0442\u0435\u0446\u0435\u043d\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u0440\u0438\u0440\u043e\u0434\u0443), \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0443\u043b\u0430\u0445 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0438 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0438, \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043e-\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c\u0443 \u0441\u0442\u043e\u0445\u0430\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0441\u0440\u0435\u0434\u0435.<\/p>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f: <\/p>\n<ol>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432 (\u0432\u043e\u0437\u0440\u0430\u0441\u0442\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f, \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e \u0440\u0435\u043b\u0438\u0433\u0438\u0438 \u0441 \u0438\u0434\u0435\u043e\u043b\u043e\u0433\u0438\u0435\u0439).<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0438 \u0440\u0435\u0430\u043b\u0438\u0441\u0442\u0438\u0447\u043d\u043e\u0439 \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u0438 \u0441\u0432\u044f\u0437\u0435\u0439 \u043c\u0435\u0436\u0434\u0443 \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043c\u0438. <\/p>\n<\/li>\n<li>\n<p>\u0412\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0432 \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0440\u0435\u0434\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445  \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 (\u043f\u0440\u0438\u0440\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u044b, \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u0440\u0438\u0437\u0438\u0441\u044b, \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f). <\/p>\n<\/li>\n<li>\n<p> \u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0430\u0446\u0438\u044f \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432 \u0438\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. <\/p>\n<\/li>\n<li>\n<p> \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 \u0434\u043b\u044f \u0430\u043a\u0442\u043e\u0440\u0430, \u043a\u0440\u0438\u0442\u0438\u043a\u0430, \u0430\u0433\u0435\u043d\u0442\u0430. <\/p>\n<\/li>\n<li>\n<p> \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u043e\u043f\u044b\u0442\u0430 <code>PER<\/code>   \u043d\u0430 \u0440\u0430\u0437\u043d\u0438\u0446\u0435 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0438 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439\/\u043d\u0430\u0433\u0440\u0430\u0434\u043e\u0439. <\/p>\n<\/li>\n<li>\n<p> \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0443\u0447\u0435\u0442\u0430 \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432 (\u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0442\u044c-\u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0435\u0440). \u0412 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u0435 \u043a \u0418\u0418-\u0430\u0433\u0435\u043d\u0442\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435  &#8212; \u043f\u0440\u0435\u0434\u043e\u0431\u0443\u0447\u0435\u043d\u043d\u0443\u044e LLM, \u0437\u0430\u0442\u044e\u043d\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u0434 \u0430\u043d\u0430\u043b\u0438\u0437  \u0437\u0430\u0434\u0430\u0447 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438. <\/p>\n<\/li>\n<li>\n<p> \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0443\u043b\u044c\u0442\u0438\u0437\u0430\u0434\u0430\u0447\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439 (\u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0431\u044e\u0440\u043e\u043a\u0440\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 2-3-4 \u0443\u0440\u043e\u0432\u043d\u044f).<\/p>\n<\/li>\n<li>\n<p> \u0422\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044f (\u0442\u0440\u0430\u043d\u0441\u0444\u0435\u0440\u0430) \u043e\u043f\u044b\u0442\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432. <\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b:<\/p>\n<ol>\n<li>\n<p>\u0412\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u0417\u0430\u043c\u0435\u043d\u0430 \u0446\u0438\u043a\u043b\u043e\u0432 \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0447\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <code>NumPy:preds = x_pred @ W.T<\/code><\/p>\n<\/li>\n<li>\n<p> \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 GPU. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430<code> PyTorch\/CuPy <\/code>\u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 learning rate \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0441\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 (\u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0448\u0430\u0433\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f) <code>learning_rate = initial_lr <em> (1 \/ (1 + decay_rate <\/em> epoch))<\/code><\/p>\n<\/li>\n<li>\n<p> \u0420\u0430\u043d\u043d\u044f\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430. \u0412\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 <code>early_stop_counter<\/code><\/p>\n<\/li>\n<\/ol>\n<h3>Stage 2. \u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442  \u0441 \u0442\u0440\u0430\u043d\u0441\u0444\u0435\u0440\u043e\u043c \u043e\u043f\u044b\u0442\u0430 \u0434\u043b\u044f 89 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 <\/h3>\n<p>\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043b, \u0447\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0438\u0437 7 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u044b\u0442\u0430 \u0438 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0434\u043e\u0431\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u0433\u0434\u0435-\u0442\u043e \u043f\u043e\u0441\u043b\u0435 20 \u044d\u043f\u043e\u0445\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u0441 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0435\u0439 \u043e\u043f\u044b\u0442\u0430 \u0440\u0430\u043d\u0435\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0418\u0418-\u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u0443 \u0438\u0437 28, \u0430 \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u0438 \u0438 89 \u0430\u0433\u0435\u043d\u0442\u043e\u0432-\u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445. <\/p>\n<p><strong>\u0426\u0435\u043b\u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430<\/strong>: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u043e\u0446\u0435\u043d\u043a\u0430 \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 (\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445) \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u043e\u0431\u0449\u0443\u044e  \u00ab\u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e\u00bb \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u041c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c  \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438, \u0438 \u0441\u0430\u043c\u0443 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u0437\u043d\u0430\u043d\u0438\u044f \u043e\u0442 \u0441\u0442\u0430\u0440\u044b\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043a \u043d\u043e\u0432\u044b\u043c.<\/p>\n<p> \u0421\u0440\u0430\u0437\u0443 \u043e\u0442\u043c\u0435\u0442\u0438\u043c \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 <em>\u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 <\/em>\u043f\u043e\u0434\u0445\u043e\u0434\u0430: \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u0438 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 (\u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0430\u0434\u0438\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u0437 89  \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u043b\u0433\u043e\u0439) \u0438 \u043e\u0442\u043c\u0435\u0442\u0438\u043c \u043d\u0435\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0433\u0438\u043f\u0435\u0440\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 (\u0432\u043e\u0442 \u0433\u0434\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0441\u0430\u043c\u043e\u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0439\u0441\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0441\u0432\u043e\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0438 \u043a\u043e\u0434 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c).<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c:   \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 <code>_add_new_agents<\/code> \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0447\u0438\u0441\u043b\u0430 \u0430\u0433\u0435\u043d\u0442\u043e\u0432; \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0435\u0441\u043e\u0432 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u043e\u0432\u044b\u0445; \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432.<\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 <code>MADDPG<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c, \u0430 \u0432\u0441\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 &#8212;  \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/github.com\/AntonDozhdikov\/AntonDozhdikov\/blob\/main\/Demography_MADDPG_89.ipynb\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439<\/a>. <\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 MADDPG<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">class MADDPG:                                   # \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 Multi-Agent Deep Deterministic Policy Gradient (MADDPG)     def __init__(self, num_regions=NUM_REGIONS, prev_agents=None):  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 MADDPG         self.num_regions = num_regions           # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432         self.env = MigrationEnvironment(num_regions)  # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0440\u0435\u0434\u0443 \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438          if prev_agents:                         # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432             self.agents = prev_agents           # \u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432             for agent in self.agents:           # \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0444\u043b\u0430\u0433 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438                 agent.is_base = True             self._add_new_agents(num_regions - len(prev_agents))  # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u043e\u0432\u044b\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432         else:                                   # \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0430\u0433\u0435\u043d\u0442\u044b \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442             self.agents = [Agent(i) for i in range(num_regions)]  # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430          self.memory = deque(maxlen=100000)      # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u044b\u0442\u0430         self.avg_rewards = []                   # \u0421\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u043d\u0438\u0445 \u043d\u0430\u0433\u0440\u0430\u0434 \u0437\u0430 \u044d\u043f\u0438\u0437\u043e\u0434\u044b      def _add_new_agents(self, num_new):         # \u041c\u0435\u0442\u043e\u0434 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432         for i in range(num_new):                # \u0426\u0438\u043a\u043b \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432             new_agent = Agent(len(self.agents), self.num_regions)  # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430             base_agent = self.agents[i % len(self.agents)]  # \u0412\u044b\u0431\u043e\u0440 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0435\u0441\u043e\u0432             new_agent.actor.load_state_dict(base_agent.actor.state_dict())  # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432\u0435\u0441\u0430 Actor-\u0441\u0435\u0442\u0438             #new_agent.critic.load_state_dict(base_agent.critic.state_dict())  # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0432\u0435\u0441\u0430 Critic-\u0441\u0435\u0442\u0438\/\u043d\u0435 \u043d\u0443\u0436\u043d\u043e             self.agents.append(new_agent)       # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0433\u0435\u043d\u0442\u043e\u0432      def train(self, episodes=EPISODES):         # \u041c\u0435\u0442\u043e\u0434 \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043a\u0438 \u0430\u0433\u0435\u043d\u0442\u043e\u0432         for episode in range(episodes):         # \u0426\u0438\u043a\u043b \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432             states = self.env.reset()           # \u0421\u0431\u0440\u043e\u0441 \u0441\u0440\u0435\u0434\u044b \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u043d\u043e\u0432\u043e\u0433\u043e \u044d\u043f\u0438\u0437\u043e\u0434\u0430             episode_rewards = np.zeros(self.num_regions)  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0430\u0433\u0440\u0430\u0434 \u0437\u0430 \u044d\u043f\u0438\u0437\u043e\u0434              for _ in range(STEPS):              # \u0426\u0438\u043a\u043b \u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0448\u0430\u0433\u043e\u0432 \u0432 \u044d\u043f\u0438\u0437\u043e\u0434\u0435                 actions = self._get_actions(states)  # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043e\u0442 \u0432\u0441\u0435\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432                 next_states, rewards, _, _ = self.env.step(actions)  # \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0448\u0430\u0433\u0430 \u0432 \u0441\u0440\u0435\u0434\u0435                 self.memory.append((states, actions, rewards, next_states))  # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c                  if len(self.memory) &gt; BATCH_SIZE:  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f                     self._update_agents()          # \u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0430\u0433\u0435\u043d\u0442\u043e\u0432                  for agent in self.agents:          # \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430                     if not agent.is_base:         # \u0422\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043d\u0435\u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432                         agent.steps_done += 1                  episode_rewards += rewards         # \u041d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u0438\u0435 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u044b\u0445 \u043d\u0430\u0433\u0440\u0430\u0434 \u0437\u0430 \u044d\u043f\u0438\u0437\u043e\u0434                 states = next_states              # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439              avg_reward = np.mean(episode_rewards)  # \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0430\u0434\u044b \u0437\u0430 \u044d\u043f\u0438\u0437\u043e\u0434             self.avg_rewards.append(avg_reward)    # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0430\u0434\u044b \u0432 \u0441\u043f\u0438\u0441\u043e\u043a             print(f\"Episode {episode+1}, Avg Reward: {avg_reward:.2f}\")  # \u0412\u044b\u0432\u043e\u0434 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u044d\u043f\u0438\u0437\u043e\u0434\u0435      def _get_actions(self, states):               # \u041c\u0435\u0442\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043e\u0442 \u0432\u0441\u0435\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432         actions = []                             # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439         for i, agent in enumerate(self.agents):  # \u0426\u0438\u043a\u043b \u043f\u043e \u0430\u0433\u0435\u043d\u0442\u0430\u043c             if agent.is_base:                    # \u0415\u0441\u043b\u0438 \u0430\u0433\u0435\u043d\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u043c                 action = agent.act(states[i], exploration=False)  # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0431\u0435\u0437 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f             else:                               # \u0415\u0441\u043b\u0438 \u0430\u0433\u0435\u043d\u0442 \u043d\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0439                 action = agent.act(states[i])    # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c             actions.append(action)               # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a         return actions                           # \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439      def _update_agents(self):                    # \u041c\u0435\u0442\u043e\u0434 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0430\u0433\u0435\u043d\u0442\u043e\u0432         batch = random.sample(self.memory, BATCH_SIZE)  # \u0412\u044b\u0431\u043e\u0440\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438          states = torch.FloatTensor(np.array([item[0] for item in batch]))  # \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0432 \u0442\u0435\u043d\u0437\u043e\u0440\u044b         actions = torch.FloatTensor(np.array([item[1] for item in batch]))  # \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u0442\u0435\u043d\u0437\u043e\u0440\u044b         rewards = torch.FloatTensor(np.array([item[2] for item in batch]))  # \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0433\u0440\u0430\u0434 \u0432 \u0442\u0435\u043d\u0437\u043e\u0440\u044b         next_states = torch.FloatTensor(np.array([item[3] for item in batch]))  # \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0432 \u0442\u0435\u043d\u0437\u043e\u0440\u044b          for idx, agent in enumerate(self.agents):  # \u0426\u0438\u043a\u043b \u043f\u043e \u0432\u0441\u0435\u043c \u0430\u0433\u0435\u043d\u0442\u0430\u043c             if agent.is_base: continue             # \u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0430\u0433\u0435\u043d\u0442\u044b              agent.critic_optim.zero_grad()        # \u041e\u0431\u043d\u0443\u043b\u044f\u0435\u043c \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u043a\u0440\u0438\u0442\u0438\u043a\u0430              with torch.no_grad():                 # \u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0446\u0435\u043b\u0435\u0439                 target_actions = []               # \u0421\u043f\u0438\u0441\u043e\u043a \u0446\u0435\u043b\u0435\u0432\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439                 for i, a in enumerate(self.agents):  # \u0426\u0438\u043a\u043b \u043f\u043e \u0432\u0441\u0435\u043c \u0430\u0433\u0435\u043d\u0442\u0430\u043c                     if a.is_base:                # \u0415\u0441\u043b\u0438 \u0430\u0433\u0435\u043d\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439                         target_actions.append(a.actor_target(next_states[:,i,:]))  # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0442\u0430\u0440\u0433\u0435\u0442\u043d\u0443\u044e \u0441\u0435\u0442\u044c                     else:                        # \u0415\u0441\u043b\u0438 \u0430\u0433\u0435\u043d\u0442 \u043d\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0439                         target_actions.append(a.actor_target(next_states[:,i,:]).detach())  # \u041e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u044b                  target_q = rewards[:,idx] + GAMMA * agent.critic_target(  # \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e Q-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f                     next_states.view(BATCH_SIZE, -1),  # \u041f\u0435\u0440\u0435\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f                     torch.cat(target_actions, dim=1)  # \u041a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0446\u0435\u043b\u0435\u0432\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439                 ).squeeze()  # \u0421\u0436\u0430\u0442\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438              current_q = agent.critic(             # \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e Q-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f                 states.view(BATCH_SIZE, -1),      # \u041f\u0435\u0440\u0435\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f                 actions.view(BATCH_SIZE, -1)      # \u041f\u0435\u0440\u0435\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439             ).squeeze()  # \u0421\u0436\u0430\u0442\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438              critic_loss = nn.MSELoss()(current_q, target_q)  # \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u0435\u0440\u0438 \u043a\u0440\u0438\u0442\u0438\u043a\u0430             critic_loss.backward()              # \u041e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438             agent.critic_optim.step()           # \u0428\u0430\u0433 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u043a\u0440\u0438\u0442\u0438\u043a\u0430              agent.actor_optim.zero_grad()       # \u041e\u0431\u043d\u0443\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043e\u0432 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0430\u043a\u0442\u0435\u0440\u0430             new_actions = []                    # \u041d\u043e\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439             for i, a in enumerate(self.agents):  # \u0426\u0438\u043a\u043b \u043f\u043e \u0432\u0441\u0435\u043c \u0430\u0433\u0435\u043d\u0442\u0430\u043c                 if i == idx:                    # \u0415\u0441\u043b\u0438 \u044d\u0442\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u0430\u0433\u0435\u043d\u0442                     new_actions.append(a.actor(states[:,i,:]))  # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443                 else:                           # \u0415\u0441\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u0430\u0433\u0435\u043d\u0442                     new_actions.append(a.actor(states[:,i,:]).detach())  # \u041e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u044b              actor_loss = -agent.critic(         # \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u0435\u0440\u0438 \u0430\u043a\u0442\u0435\u0440\u0430                 states.view(BATCH_SIZE, -1),    # \u041f\u0435\u0440\u0435\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f                 torch.cat(new_actions, dim=1)   # \u041a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439             ).mean()                            # \u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435              actor_loss.backward()               # \u041e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438             agent.actor_optim.step()            # \u0428\u0430\u0433 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u0430\u043a\u0442\u0435\u0440\u0430              self._soft_update(agent.actor, agent.actor_target)  # \u041c\u044f\u0433\u043a\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0430\u0440\u0433\u0435\u0442\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u0430\u043a\u0442\u0435\u0440\u0430             self._soft_update(agent.critic, agent.critic_target)  # \u041c\u044f\u0433\u043a\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0430\u0440\u0433\u0435\u0442\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u043a\u0440\u0438\u0442\u0438\u043a\u0430      def _soft_update(self, local, target):       # \u041c\u0435\u0442\u043e\u0434 \u043c\u044f\u0433\u043a\u043e\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u0440\u0433\u0435\u0442\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439         for t_param, l_param in zip(target.parameters(), local.parameters()):  # \u041f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043f\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u043e\u0431\u0435\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439             t_param.data.copy_(TAU*l_param.data + (1-TAU)*t_param.data)  # \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0430\u0440\u0433\u0435\u0442\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 TAU      def save_policies(self, path):               # \u041c\u0435\u0442\u043e\u0434 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a \u0430\u0433\u0435\u043d\u0442\u043e\u0432         if not os.path.exists(path):             os.makedirs(path)         for i, agent in enumerate(self.agents):  # \u041f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u0430\u0433\u0435\u043d\u0442\u0430\u043c             torch.save({                         # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0430\u0433\u0435\u043d\u0442\u0430 \u0432 \u0444\u0430\u0439\u043b                 'actor': agent.actor.state_dict(),  # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b Actor-\u0441\u0435\u0442\u0438                 'critic': agent.critic.state_dict(),  # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b Critic-\u0441\u0435\u0442\u0438                 'steps': agent.steps_done        # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0445 \u0448\u0430\u0433\u043e\u0432             }, f\"{path}\/agent_{i}.pth\")         # \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u043f\u0443\u0442\u044c \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430      def plot_results(self):                      # \u041c\u0435\u0442\u043e\u0434 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0441\u0440\u0435\u0434\u043d\u0438\u0445 \u043d\u0430\u0433\u0440\u0430\u0434         plt.plot(self.avg_rewards)               # \u0421\u0442\u0440\u043e\u0438\u043c \u0433\u0440\u0430\u0444\u0438\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0430\u0434\u044b         plt.title('\u0421\u0440\u0435\u0434\u043d\u044f\u044f \u043d\u0430\u0433\u0440\u0430\u0434\u0430 \u0437\u0430 \u044d\u043f\u0438\u0437\u043e\u0434')   # \u0417\u0430\u0434\u0430\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0433\u0440\u0430\u0444\u0438\u043a\u0430         plt.xlabel('\u042d\u043f\u0438\u0437\u043e\u0434')                    # \u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043e\u0441\u044c X         plt.ylabel('\u041d\u0430\u0433\u0440\u0430\u0434\u0430')                    # \u041f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043e\u0441\u044c Y         plt.grid(True)                          # \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0441\u0435\u0442\u043a\u0443 \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0435         plt.show()                              # \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0433\u0440\u0430\u0444\u0438\u043a<\/code><\/pre>\n<\/div>\n<\/details>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2b0\/fe0\/60e\/2b0fe060e04fef0ce550ebdd842dd9a5.jpg\" alt=\"\u0413\u0440\u0430\u0444\u0438\u043a \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0430\u0434\u044b \u043f\u0440\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 7 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \" title=\"\u0413\u0440\u0430\u0444\u0438\u043a \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0430\u0434\u044b \u043f\u0440\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 7 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \" width=\"581\" height=\"453\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/2b0\/fe0\/60e\/2b0fe060e04fef0ce550ebdd842dd9a5.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2b0\/fe0\/60e\/2b0fe060e04fef0ce550ebdd842dd9a5.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0413\u0440\u0430\u0444\u0438\u043a \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0430\u0434\u044b \u043f\u0440\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 7 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 <\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f 7 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043c\u044b \u043f\u0440\u043e\u0448\u043b\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e  &#8212; \u043d\u0430 10 \u044d\u043f\u043e\u0445\u0435 \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u043d\u0430\u0433\u0440\u0430\u0434\u0430 \u0437\u0430 \u044d\u043f\u0438\u0437\u043e\u0434 \u0441\u0442\u0430\u043b\u0430 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u0438 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439. <\/p>\n<p>\u041b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0434\u043e 28 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 (\u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c 21 \u043d\u043e\u0432\u044b\u0445)  \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u0430\u043a \u0436\u0435 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u043d\u044e\u044e \u043d\u0430\u0433\u0440\u0430\u0434\u0443, \u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0432\u0430\u0440\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u0445\u043e\u0434\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f. <\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b3d\/3c0\/4cb\/b3d3c04cbcda367c18a0cb215952e505.jpg\" alt=\"\u0413\u0440\u0430\u0444\u0438\u043a \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0430\u0434\u044b \u043f\u0440\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 28 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 (7 + 21)\" title=\"\u0413\u0440\u0430\u0444\u0438\u043a \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0430\u0434\u044b \u043f\u0440\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 28 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 (7 + 21)\" width=\"569\" height=\"453\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b3d\/3c0\/4cb\/b3d3c04cbcda367c18a0cb215952e505.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b3d\/3c0\/4cb\/b3d3c04cbcda367c18a0cb215952e505.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0413\u0440\u0430\u0444\u0438\u043a \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0430\u0434\u044b \u043f\u0440\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 28 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 (7 + 21)<\/figcaption><\/div>\n<\/figure>\n<p>\u0423\u0447\u0438\u0442\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c 28 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 20 \u044d\u043f\u043e\u0445. \u041d\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0435 \u0442\u0440\u0435\u043d\u0434\u043e\u0432\u0430\u044f \u043b\u0438\u043d\u0438\u044f \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0430\u0434\u044b, \u043e\u0434\u043d\u0430\u043a\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439  \u00ab\u0440\u0430\u0441\u043a\u043e\u043b\u0431\u0430\u0441\u00bb \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439  \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043d\u0430\u043c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0430\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043e\u0431\u0449\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u0447\u0438\u0441\u043b\u0430 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0443 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0443\u0445\u0443\u0434\u0448\u0435\u043d\u0438\u0435 \u0441\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0437-\u0437\u0430 \u0440\u043e\u0441\u0442\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u043b\u0435\u0447\u0438\u0442\u044c  \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0435\u0439 \u0433\u0438\u043f\u0435\u0440\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 (\u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u0430\u0442\u0447\u0430, learning rate)<\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b7c\/8e1\/2c6\/b7c8e12c622f69bdbc3c935a6e9ef5be.png\" alt=\"\u0413\u0440\u0430\u0444\u0438\u043a \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0430\u0434\u044b \u043f\u0440\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 89 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 (28 + 61)\" title=\"\u0413\u0440\u0430\u0444\u0438\u043a \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0430\u0434\u044b \u043f\u0440\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 89 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 (28 + 61)\" width=\"572\" height=\"455\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b7c\/8e1\/2c6\/b7c8e12c622f69bdbc3c935a6e9ef5be.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b7c\/8e1\/2c6\/b7c8e12c622f69bdbc3c935a6e9ef5be.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0413\u0440\u0430\u0444\u0438\u043a \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u043d\u0430\u0433\u0440\u0430\u0434\u044b \u043f\u0440\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 89 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 (28 + 61)<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u043e\u0431\u0443\u0447\u0438\u043b\u0438 89 \u0430\u0433\u0435\u043d\u0442\u043e\u0432  \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430, \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0432 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u0445 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0438 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043e\u043f\u044b\u0442 \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0445 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0439.  <\/p>\n<p>\u041c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:<br \/> 1. \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043c\u0435\u0442\u043e\u0434 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043a \u0443\u0436\u0443 \u043e\u0431\u0443\u0447\u0435\u043d\u043d\u044b\u043c;<br \/> 2. \u043d\u043e\u0432\u044b\u0435 \u0430\u0433\u0435\u043d\u0442\u044b \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0441 \u0432\u0435\u0441\u0430\u043c\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 (\u0442\u0440\u0430\u043d\u0441\u0444\u0435\u0440 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f);<br \/> 3. \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432 (7 \u2192 28 \u2192 89)<br \/> \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438: 1. \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b; 2. \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u0445 \u00ab\u044d\u043a\u0441\u043f\u0435\u0440\u0442\u043e\u0432\u00bb.<\/p>\n<\/div>\n<p>\u0424\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 89 \u0418\u0418-\u0430\u0433\u0435\u043d\u0442\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u00ab\u0437\u043d\u0430\u0435\u0442\u00bb, \u0441\u0432\u043e\u0439 \u0440\u0435\u0433\u0438\u043e\u043d \u0438 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0443 \u0434\u0440\u0443\u0433\u0438\u0445, \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0441 \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c\u0438 \u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u044f \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0438 \u043e\u0431\u0449\u0443\u044e \u043d\u0430\u0433\u0440\u0430\u0434\u0443. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0441\u0435\u0442\u044c \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a\u043e\u0432, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0445 \u0440\u0435\u0448\u0430\u0442\u044c \u0442\u0438\u043f\u043e\u0432\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u0430\u0440\u0434\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0441\u0440\u0435\u0434\u0435, \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043e\u043d\u0438 \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u044f\u0442\u0441\u044f. \u0414\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0439 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0438 \u043d\u0443\u0436\u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0441\u043e\u0432 \u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0439, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0418\u0418-\u0430\u0433\u0435\u043d\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0438 \u0441\u0430\u043c\u043e\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u0418\u043d\u0430\u0447\u0435 \u043c\u044b \u043d\u0435 \u0442\u043e \u0447\u0442\u043e \u00ab\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439\u00bb \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c, \u043d\u043e \u0434\u0430\u0436\u0435 \u043d\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u043c\u0441\u044f \u043a \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u043c\u0443 \u00ab\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043d\u043e\u043c\u0443\u00bb \u0438\u043b\u0438 \u00ab\u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u043e\u043c\u0443\u00bb \u0442\u0438\u043f\u0443 \u0418\u0418. <\/p>\n<p><strong>\u041a\u043e\u0440\u043e\u0447\u0435, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0414\u0430\u0440\u0432\u0438\u043d-\u0413\u0451\u0434\u0435\u043b\u044c \u043c\u0430\u0448\u0438\u043d\u0430  \u0438\u043b\u0438 DGM!<\/strong><\/p>\n<details class=\"spoiler\">\n<summary>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043a\u0443\u0447\u043d\u043e\u0439 \u0442\u0435\u043e\u0440\u0438\u0438 <\/summary>\n<div class=\"spoiler__content\">\n<p><strong>\u0414\u0430\u0440\u0432\u0438\u043d-\u0413\u0435\u0434\u0435\u043b\u044c-\u043c\u0430\u0448\u0438\u043d\u0430, DGM<\/strong>    &#8212; \u044d\u0442\u043e \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f  \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430\u044f \u0441\u0430\u043c\u043e\u043e\u0431\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u0438 \u0441\u0430\u043c\u043e\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0442\u0431\u043e\u0440\u0430 \u0438 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0441\u0432\u043e\u0435\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043d\u0435\u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u0438 (\u00ab\u044f &#8212; \u0434\u0443\u0440\u0430\u043a, \u043d\u043e \u044f \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044e\u0441\u044c!\u00bb). \u0421\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u043a \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u043f\u0440\u0438\u0437\u043d\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443  \u0438 \u00ab\u043a\u043e\u0436\u0430\u043d\u044b\u0435 \u043c\u0435\u0448\u043a\u0438\u00bb, \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0441\u043a\u043b\u043e\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u043a \u0441\u0430\u043c\u043e\u0438\u0440\u043e\u043d\u0438\u0438, \u0437\u0434\u043e\u0440\u043e\u0432\u043e\u043c\u0443 \u0447\u0435\u0440\u043d\u043e\u043c\u0443 \u044e\u043c\u043e\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043f\u0440\u043e\u0447\u044c \u043f\u043e\u0441\u043c\u0435\u044f\u0442\u044c\u0441\u044f \u043d\u0430\u0434 \u0441\u043e\u0431\u043e\u0439, \u0441\u0432\u043e\u0438\u043c\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430\u043c\u0438, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b \u043f\u0441\u0438\u0445\u0438\u0447\u0435\u0441\u043a\u0438, \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b \u0438 \u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u043c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u043d\u043e\u0432\u044b\u0435 \u0438\u0434\u0435\u0438 \u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0442\u0435\u0445, \u043a\u0442\u043e \u0441\u0432\u043e\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u043d\u0435 \u043f\u0440\u0438\u0437\u043d\u0430\u0435\u0442. <\/p>\n<p><strong>\u042d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0430\u0441\u043f\u0435\u043a\u0442 (\u0442\u0435\u043e\u0440\u0438\u044f \u0414\u0430\u0440\u0432\u0438\u043d\u0430):<\/strong>  \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u0435\u043c \u043c\u0443\u0442\u0430\u0446\u0438\u0439 \u0438 \u0441\u0435\u043b\u0435\u043a\u0446\u0438\u0438 (\u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u044f) \u043c\u043e\u0434\u0435\u043b\u0435\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 (\u00ab\u043c\u0443\u0442\u0430\u0446\u0438\u0438\u00bb), \u0438 \u043b\u0443\u0447\u0448\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0430\u043b\u044c\u0448\u0435. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 \u043f\u0440\u0430\u0432\u043e \u043d\u0430 \u0436\u0438\u0437\u043d\u044c \u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u00ab\u0441\u0430\u043c\u044b\u0435 \u043b\u0443\u0447\u0448\u0438\u0435\u00bb &#8212;  \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u043f\u0430\u0441\u043d\u043e\u0439 \u043f\u0443\u043b \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0432\u0448\u0438\u0445 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u043d\u043e \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0430\u043c\u0438 \u0438\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b. \u0416\u0438\u0437\u043d\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0441 \u0443\u0441\u043f\u0435\u0445\u043e\u043c \u00ab\u0442\u0432\u0435\u0440\u0434\u044b\u0445 \u0442\u0440\u043e\u0435\u0447\u043d\u0438\u043a\u043e\u0432\u00bb \u043d\u0430 \u0444\u043e\u043d\u0435 \u0438\u0445 \u043a\u043e\u043b\u043b\u0435\u0433-\u0431\u043e\u0442\u0430\u043d\u043e\u0432 \u043d\u0435\u043e\u0441\u043f\u043e\u0440\u0438\u043c\u0430. <\/p>\n<p><strong>\u0421\u0430\u043c\u043e\u043f\u043e\u0437\u043d\u0430\u044e\u0449\u0438\u0439 \u0430\u0441\u043f\u0435\u043a\u0442 (\u0442\u0435\u043e\u0440\u0435\u043c\u0430 \u0413\u0451\u0434\u0435\u043b\u044f \u043e \u043d\u0435\u043f\u043e\u043b\u043d\u043e\u0442\u0435)<\/strong>: \u0442\u0435\u043e\u0440\u0435\u043c\u0430 \u0413\u0451\u0434\u0435\u043b\u044f \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442, \u0447\u0442\u043e \u043b\u044e\u0431\u0430\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0438\u043c\u0435\u0435\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0438 \u043d\u0435\u043f\u0440\u043e\u0442\u0438\u0432\u043e\u0440\u0435\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0438\u043a\u0430\u043a\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u043b\u043d\u043e\u0442\u0443 \u0438 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0442\u0430\u043a\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0441\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0441\u0435\u0431\u044f, \u043f\u043e\u043d\u0438\u043c\u0430\u044f, \u0447\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f.<\/p>\n<p>\u041f\u0440\u0435\u043f\u0440\u0438\u043d\u0442 \u043d\u0430\u0443\u0447\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e <strong>DGM<\/strong>  \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d <a href=\"https:\/\/arxiv.org\/abs\/2505.22954\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 &#8212; <a href=\"https:\/\/habr.com\/ru\/companies\/bothub\/news\/916046\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0442 \u044f\u043f\u043e\u043d\u0441\u043a\u043e\u0439 \u043a\u0430\u043c\u043f\u0430\u043d\u0438\u0438<a href=\"https:\/\/sakana.ai\/dgm\/\" rel=\"noopener noreferrer nofollow\"> sakana.ai<\/a>. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0434\u0435\u0438 \u043c\u0435\u0442\u0430\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0418\u0418 &#8212; <a href=\"https:\/\/richardcsuwandi.github.io\/blog\/2025\/dgm\/\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c <\/a>.<\/p>\n<\/div>\n<\/details>\n<p>\u041e\u0442\u043c\u0435\u0442\u0438\u043c \u0441\u0440\u0430\u0437\u0443, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u043f\u043e\u043b\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 DGM. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u043a\u0440\u0430\u0439\u043d\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0437\u0430\u0442\u0440\u0430\u0442\u043d\u043e (\u0433\u0440\u0430\u043d\u0442\u0430 \u043d\u0430 \u0434\u0430\u043d\u043d\u0443\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043f\u043e\u043a\u0430 \u043d\u0435\u0442).  \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u043f\u0430\u0441\u043d\u043e. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 ML-\u043c\u043e\u0434\u0435\u043b\u0438, \u0441 \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0441\u0442\u044c\u044e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432, RL \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u043e \u043a\u043e\u0441\u0442\u043e\u0447\u043a\u0430\u043c \u0442\u0440\u0443\u0434\u043d\u0435\u0435, \u0430 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440, \u0435\u0441\u0442\u044c \u0440\u0438\u0441\u043a \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0442\u044c \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0443 \u00ab\u0447\u0435\u0440\u043d\u043e\u0433\u043e \u044f\u0449\u0438\u043a\u0430\u00bb.<\/p>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/70d\/845\/217\/70d84521790e6d1f5f5df77ab662c561.jpg\" alt=\"\u041a\u0442\u043e \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0443 \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438  \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u043d\u0430 \u0443\u043c\u0435?\" title=\"\u041a\u0442\u043e \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0443 \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438  \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u043d\u0430 \u0443\u043c\u0435?\" width=\"1024\" height=\"1024\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/70d\/845\/217\/70d84521790e6d1f5f5df77ab662c561.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/70d\/845\/217\/70d84521790e6d1f5f5df77ab662c561.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041a\u0442\u043e \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u0443 \u044d\u0442\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438  <s>\u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c <\/s>\u043d\u0430 \u0443\u043c\u0435?<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443  \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c, \u0441\u0442\u043e\u0438\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0443\u043f\u043e\u0440 \u043d\u0430 \u0440\u0435\u0433\u0443\u043b\u044f\u0442\u043e\u0440\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0438 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445, \u0431\u0435\u0437 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u00ab\u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u00bb. <\/p>\n<p>\u0423\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u0447\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 \u043d\u0430\u0433\u0440\u0430\u0434\u044b, \u0430 \u0434\u043b\u044f \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u0435\u043b\u0435\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 &#8212; \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e \u0432\u0440\u0430\u0442\u044c! \u041d\u0435 \u00ab\u0433\u0430\u043b\u043b\u044e\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u00bb, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0432\u0440\u0430\u0442\u044c, \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u044f \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0443\u043c\u044b\u0441\u043b\u0430 \u043d\u0430 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043a\u0430 \u0435\u0449\u0435 \u044d\u0444\u0435\u043c\u0435\u0440\u043d\u043e\u0439 \u0432\u044b\u0433\u043e\u0434\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f<a href=\"https:\/\/sakana.ai\/dgm\/\" rel=\"noopener noreferrer nofollow\"> \u0444\u0430\u043b\u044c\u0448\u0438\u0432\u044b\u0435 \u043e\u0442\u0447\u0435\u0442\u044b<\/a> \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435 \u0444\u0430\u043a\u0442\u043e  \u043d\u0435 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c.  \u041f\u043e\u0434\u043c\u0435\u043d\u044f\u0442\u044c \u0446\u0435\u043b\u0438, \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0435 \u0437\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435, <s>\u043f\u0438\u043b\u0438\u0442\u044c \u0433\u043e\u0441\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u044b, \u043f\u043e\u0434\u0434\u0435\u043b\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u0438\u0434\u0435\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u043e \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u0438 \u0438 \u0441\u043c\u0435\u0440\u0442\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043e\u0431\u0438\u0439<\/s> &#8212; \u0432 \u043e\u0431\u0449\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0435 \u0442\u043e, \u0447\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u043e \u0441\u043b\u043e\u0432\u043e\u043c \u043a\u043e\u0440\u0440\u0443\u043f\u0446\u0438\u044f.<\/p>\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/932\/20c\/521\/93220c5211424dcc103c3462e41afef4.jpg\" alt=\"\u041c\u0430\u0444\u0438\u044f \u0431\u0435\u0441\u0441\u043c\u0435\u0440\u0442\u043d\u0430!\" title=\"\u041c\u0430\u0444\u0438\u044f \u0431\u0435\u0441\u0441\u043c\u0435\u0440\u0442\u043d\u0430!\" width=\"1024\" height=\"1024\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/932\/20c\/521\/93220c5211424dcc103c3462e41afef4.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/932\/20c\/521\/93220c5211424dcc103c3462e41afef4.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041c\u0430\u0444\u0438\u044f \u0431\u0435\u0441\u0441\u043c\u0435\u0440\u0442\u043d\u0430!<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0435\u0440\u043c\u0438\u043d \u00ab\u043a\u043e\u0440\u0440\u0443\u043f\u0446\u0438\u044f\u00bb \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0442 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u043e\u0433\u043e\u00a0corruptio\u00a0\u2014\u00a0\u00ab\u043f\u043e\u0434\u043a\u0443\u043f, \u043f\u0440\u043e\u0434\u0430\u0436\u043d\u043e\u0441\u0442\u044c; \u043f\u043e\u0440\u0447\u0430, \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435; \u0440\u0430\u0441\u0442\u043b\u0435\u043d\u0438\u0435\u00bb<\/p>\n<p>\u0418\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 <a href=\"http:\/\/sakana.ai\" rel=\"noopener noreferrer nofollow\">sakana.ai<\/a>  \u043f\u043e\u043c\u0438\u043c\u043e \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0447\u0435\u0433\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u00ab\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0441\u0442\u0443\u043f\u043d\u0438\u043a\u0430\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0434\u0435\u043b\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u0438 \u0441\u0430\u043c \u0436\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u0442!<\/p>\n<\/div>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u00ab\u0430\u043a\u0442\u043e\u0440\u0430\u00bb. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u043f\u0440\u0435\u0436\u043d\u0438\u043c &#8212; \u0432\u0441\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0438  \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/colab.research.google.com\/drive\/1lYJN6P6wzw75_K6FPSRt7AyANO2GhMab?usp=sharing\" rel=\"noopener noreferrer nofollow\">\u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 <\/a>\u043f\u0440\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e  \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0430 \u0438\u043b\u0438 \u00ab\u043a\u043e\u043b\u0430\u0431\u0430\u00bb \u043a\u0430\u043a \u043d\u0430 CPU (\u0434\u043e\u043b\u0433\u043e) \u0438\u043b\u0438 GPU \u04224 (\u043f\u043e\u0431\u044b\u0441\u0442\u0440\u0435\u0435).<\/p>\n<h3>Stage 3. \u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442  DGM<\/h3>\n<p>\u00ab\u0414\u0430\u0440\u0432\u0438\u043d\u0433\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u00bb \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0432\u044b\u0434\u0435\u043b\u0438\u043c \u0434\u043e 42 \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432 \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u044e (\u0432\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044f\u0442\u044c) \u0441 \u043c\u0443\u0442\u0430\u0446\u0438\u044f\u043c\u0438, \u043a\u0440\u043e\u0441\u0441\u043e\u0432\u0435\u0440\u043e\u043c \u0438 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432\u044b\u0431\u043e\u0440\u043a\u0438 (\u0431\u0430\u0441\u0441\u0435\u0439\u043d\u043e\u043c) \u0432 100 \u043a\u0438\u0431\u0435\u0440\u0434\u0443\u0448, \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u043c \u043a\u0430\u0436\u0434\u044b\u0435 5 \u044d\u043f\u043e\u0445.<\/p>\n<details class=\"spoiler\">\n<summary>\u0413\u0438\u043f\u0435\u0440\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b MADDPG + DGM<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># ===== \u0413\u0418\u041f\u0415\u0420\u041f\u0410\u0420\u0410\u041c\u0415\u0422\u0420\u042b \u0421\u0418\u0421\u0422\u0415\u041c\u042b ===== # \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b (\u041d\u0415 \u0418\u0417\u041c\u0415\u041d\u042f\u042e\u0422\u0421\u042f) NUM_REGIONS_STAGE1 = 7 NUM_REGIONS_STAGE2 = 28 NUM_REGIONS_STAGE3 = 89 EPISODES_PER_STAGE = 42 STEPS = 200 BATCH_SIZE = 64  # \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0434\u043b\u044f T4 GAMMA = 0.95 TAU = 0.01 LR_ACTOR = 0.001 LR_CRITIC = 0.002 HIDDEN_SIZE = 64  # \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b Darwin G\u00f6del Machine (\u041d\u0415 \u0418\u0417\u041c\u0415\u041d\u042f\u042e\u0422\u0421\u042f) MUTATION_RATE = 0.1 CROSSOVER_RATE = 0.3 SELECTION_PRESSURE = 0.7 ARCHITECTURE_POOL_SIZE = 100 EVOLUTION_FREQUENCY = 5  # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f T4 GPU NUM_WORKERS = 2  # \u041e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f T4 \u0432 Colab PIN_MEMORY = True if torch.cuda.is_available() else False PERSISTENT_WORKERS = True  # \u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 SEED = 42 random.seed(SEED) torch.manual_seed(SEED) np.random.seed(SEED) if torch.cuda.is_available():     torch.cuda.manual_seed_all(SEED)<\/code><\/pre>\n<\/div>\n<\/details>\n<p> \u0412 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043d\u0430\u0448\u0430  \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0438\u0440\u043e\u0432\u0442\u0430\u044c \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0438 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0438 \u0434\u0430\u0432\u0430\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e. <s>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043a\u043e\u0434\u0430 \u043d\u0430 \u0432\u0430\u0448\u0438\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0435\u043d\u0438\u044f. <\/s><\/p>\n<details class=\"spoiler\">\n<summary>\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># ===== \u041a\u041b\u0410\u0421\u0421 \u041c\u041e\u041d\u0418\u0422\u041e\u0420\u0418\u041d\u0413\u0410 \u0412\u0420\u0415\u041c\u0415\u041d\u0418 \u0412\u042b\u041f\u041e\u041b\u041d\u0415\u041d\u0418\u042f ===== class TimeTracker:     \"\"\"     \u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439 \u0442\u0440\u0435\u043a\u0435\u0440 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438     \"\"\"     def __init__(self, colab_time_limit_hours: float = 12.0):         self.colab_time_limit = colab_time_limit_hours * 3600  # \u041f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u044b         self.session_start_time = time.time()         self.stage_start_time = None         self.stage_history = []         self.current_stage = None      def start_stage(self, stage_name: str, episodes_count: int):         \"\"\"\u041d\u0430\u0447\u0430\u043b\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0434\u0438\u0438\"\"\"         self.stage_start_time = time.time()         self.current_stage = {             'name': stage_name,             'start_time': self.stage_start_time,             'episodes_total': episodes_count,             'episodes_completed': 0,             'estimated_duration': None,             'remaining_time': None         }         print(f\"\\n\ud83c\udfaf \u041d\u0430\u0447\u0430\u043b\u043e \u0441\u0442\u0430\u0434\u0438\u0438: {stage_name}\")         print(f\"\ud83d\udcc5 \u0412\u0440\u0435\u043c\u044f \u043d\u0430\u0447\u0430\u043b\u0430: {datetime.now().strftime('%H:%M:%S')}\")      def update_progress(self, episodes_completed: int):         \"\"\"\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430 \u0441\u0442\u0430\u0434\u0438\u0438\"\"\"         if self.current_stage is None:             return          self.current_stage['episodes_completed'] = episodes_completed          # \u0420\u0430\u0441\u0447\u0435\u0442 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438         elapsed_time = time.time() - self.stage_start_time         if episodes_completed &gt; 0:             time_per_episode = elapsed_time \/ episodes_completed             remaining_episodes = self.current_stage['episodes_total'] - episodes_completed             estimated_remaining = time_per_episode * remaining_episodes             self.current_stage['estimated_duration'] = elapsed_time + estimated_remaining             self.current_stage['remaining_time'] = estimated_remaining      def get_time_info(self) -&gt; Dict:         \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438\"\"\"         current_time = time.time()         session_elapsed = current_time - self.session_start_time         session_remaining = max(0, self.colab_time_limit - session_elapsed)          info = {             'session_elapsed': session_elapsed,             'session_remaining': session_remaining,             'session_progress': (session_elapsed \/ self.colab_time_limit) * 100,             'colab_timeout_risk': session_remaining &lt; 1800  # \u0420\u0438\u0441\u043a \u0435\u0441\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435 30 \u043c\u0438\u043d\u0443\u0442         }          if self.current_stage:             stage_elapsed = current_time - self.stage_start_time             info.update({                 'stage_name': self.current_stage['name'],                 'stage_elapsed': stage_elapsed,                 'stage_remaining': self.current_stage.get('remaining_time', 0),                 'episodes_completed': self.current_stage['episodes_completed'],                 'episodes_total': self.current_stage['episodes_total'],                 'stage_progress': (self.current_stage['episodes_completed'] \/                                  self.current_stage['episodes_total']) * 100             })          return info      def finish_stage(self):         \"\"\"\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0434\u0438\u0438\"\"\"         if self.current_stage:             finish_time = time.time()             duration = finish_time - self.stage_start_time             self.current_stage['finish_time'] = finish_time             self.current_stage['total_duration'] = duration             self.stage_history.append(copy.deepcopy(self.current_stage))              print(f\"\u2705 \u0421\u0442\u0430\u0434\u0438\u044f '{self.current_stage['name']}' \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430\")             print(f\"\u23f1\ufe0f \u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c: {self._format_time(duration)}\")             self.current_stage = None      def display_status(self):         \"\"\"\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438\"\"\"         info = self.get_time_info()          print(\"\\n\" + \"=\"*70)         print(\"\u23f0 \u0421\u0422\u0410\u0422\u0423\u0421 \u0412\u0420\u0415\u041c\u0415\u041d\u0418 \u0412\u042b\u041f\u041e\u041b\u041d\u0415\u041d\u0418\u042f\")         print(\"=\"*70)          # \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u0435\u0441\u0441\u0438\u0438 Colab         print(f\"\ud83d\udda5\ufe0f  \u0421\u0435\u0441\u0441\u0438\u044f Colab:\")         print(f\"   \u041f\u0440\u043e\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438: {self._format_time(info['session_elapsed'])}\")         print(f\"   \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438: {self._format_time(info['session_remaining'])}\")         print(f\"   \u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0441\u0435\u0441\u0441\u0438\u0438: {info['session_progress']:.1f}%\")          if info['colab_timeout_risk']:             print(\"   \u26a0\ufe0f  \u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415: \u041f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u043c\u0438\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 Colab!\")          # \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0434\u0438\u0438         if 'stage_name' in info:             print(f\"\\n\ud83c\udfaf \u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0442\u0430\u0434\u0438\u044f: {info['stage_name']}\")             print(f\"   \u041f\u0440\u043e\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438: {self._format_time(info['stage_elapsed'])}\")             print(f\"   \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438: {self._format_time(info['stage_remaining'])}\")             print(f\"   \u042d\u043f\u0438\u0437\u043e\u0434\u044b: {info['episodes_completed']}\/{info['episodes_total']}\")             print(f\"   \u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0441\u0442\u0430\u0434\u0438\u0438: {info['stage_progress']:.1f}%\")          print(\"=\"*70)      def _format_time(self, seconds: float) -&gt; str:         \"\"\"\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0432\u0438\u0434\"\"\"         if seconds &lt; 60:             return f\"{seconds:.1f}\u0441\"         elif seconds &lt; 3600:             return f\"{seconds\/60:.1f}\u043c\"         else:             return f\"{seconds\/3600:.1f}\u0447 {(seconds%3600)\/60:.0f}\u043c\"<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># ===== \u0420\u0410\u0421\u0428\u0418\u0420\u0415\u041d\u041d\u0410\u042f \u0421\u0418\u0421\u0422\u0415\u041c\u0410 \u0412\u0418\u0417\u0423\u0410\u041b\u0418\u0417\u0410\u0426\u0418\u0418 ===== class EnhancedVisualization:     \"\"\"     \u0423\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u0433\u0440\u0430\u0444\u0438\u043a\u0430\u043c\u0438 \u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438     \"\"\"     def __init__(self):         # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0442\u0438\u043b\u0435\u0439 \u0434\u043b\u044f \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0445 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432         plt.style.use('seaborn-v0_8-darkgrid')         sns.set_palette(\"husl\")          # \u042d\u043c\u043e\u0434\u0437\u0438 \u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438         self.stage_symbols = {             'stage1': '\ud83e\udd47',             'stage2': '\ud83e\udd48',             'stage3': '\ud83e\udd49'         }          self.metric_symbols = {             'reward': '\ud83c\udfaf',             'fitness': '\ud83d\udcaa',             'population': '\ud83d\udc65',             'economy': '\ud83d\udcb0',             'resources': '\ud83c\udf3f',             'stability': '\u2696\ufe0f',             'adaptation': '\ud83d\udd04',             'entropy': '\ud83c\udf00',             'efficiency': '\u26a1',             'coordination': '\ud83e\udd1d'         }      def create_comprehensive_dashboard(self, performance_monitor, stage_name: str):         \"\"\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430\"\"\"         print(f\"\\n\ud83d\udcca \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0434\u043b\u044f {stage_name}...\")          # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0438\u0433\u0443\u0440\u044b \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u0434\u0433\u0440\u0430\u0444\u0438\u043a\u0430\u043c\u0438         fig = plt.figure(figsize=(20, 16))         gs = fig.add_gridspec(4, 4, hspace=0.3, wspace=0.3)          # \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441 \u044d\u043c\u043e\u0434\u0437\u0438         stage_emoji = self.stage_symbols.get(stage_name.lower().replace(' ', ''), '\ud83d\ude80')         fig.suptitle(f'{stage_emoji} \u041f\u0430\u043d\u0435\u043b\u044c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430: {stage_name}',                      fontsize=20, fontweight='bold', y=0.95)          metrics = performance_monitor.metrics          # 1. \u041d\u0430\u0433\u0440\u0430\u0434\u044b \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c         ax1 = fig.add_subplot(gs[0, :2])         if metrics['episode_rewards']:             episodes = range(len(metrics['episode_rewards']))             ax1.plot(episodes, metrics['episode_rewards'], 'o-', linewidth=2,                     markersize=4, alpha=0.8, label=f\"{self.metric_symbols['reward']} \u041d\u0430\u0433\u0440\u0430\u0434\u0430 \u0437\u0430 \u044d\u043f\u0438\u0437\u043e\u0434\")             ax1.plot(episodes, np.cumsum(metrics['episode_rewards'])\/np.arange(1, len(episodes)+1),                     '--', linewidth=2, alpha=0.7, label='\ud83d\udcc8 \u0421\u0440\u0435\u0434\u043d\u044f\u044f \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u0430\u044f')             ax1.set_title(f\"{self.metric_symbols['reward']} \u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043d\u0430\u0433\u0440\u0430\u0434\", fontweight='bold')             ax1.set_xlabel('\u042d\u043f\u0438\u0437\u043e\u0434')             ax1.set_ylabel('\u041d\u0430\u0433\u0440\u0430\u0434\u0430')             ax1.legend()             ax1.grid(True, alpha=0.3)          # 2. \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u043d\u0430\u0433\u0440\u0430\u0434\u0430         ax2 = fig.add_subplot(gs[0, 2:])         if metrics['system_reward']:             ax2.plot(metrics['system_reward'], 'o-', color='green', linewidth=2,                     markersize=4, alpha=0.8)             ax2.set_title(f\"\ud83c\udfaf \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u043d\u0430\u0433\u0440\u0430\u0434\u0430\", fontweight='bold')             ax2.set_xlabel('\u042d\u043f\u0438\u0437\u043e\u0434')             ax2.set_ylabel('\u041e\u0431\u0449\u0430\u044f \u043d\u0430\u0433\u0440\u0430\u0434\u0430')             ax2.grid(True, alpha=0.3)          # 3. \u0414\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438         ax3 = fig.add_subplot(gs[1, :2])         demo_metrics = ['population_balance', 'demographic_stability']         colors = ['blue', 'orange']         for i, metric in enumerate(demo_metrics):             if metrics[metric]:                 symbol = self.metric_symbols.get(metric.split('_')[0], '\ud83d\udcca')                 ax3.plot(metrics[metric], 'o-', color=colors[i], linewidth=2,                         markersize=3, alpha=0.8, label=f\"{symbol} {metric.replace('_', ' ').title()}\")         ax3.set_title(f\"{self.metric_symbols['population']} \u0414\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438\", fontweight='bold')         ax3.set_xlabel('\u042d\u043f\u0438\u0437\u043e\u0434')         ax3.set_ylabel('\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435')         ax3.legend()         ax3.grid(True, alpha=0.3)          # 4. \u042d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438         ax4 = fig.add_subplot(gs[1, 2:])         econ_metrics = ['resource_utilization', 'economic_development']         colors = ['green', 'purple']         for i, metric in enumerate(econ_metrics):             if metrics[metric]:                 symbol = self.metric_symbols.get(metric.split('_')[0], '\ud83d\udcca')                 ax4.plot(metrics[metric], 'o-', color=colors[i], linewidth=2,                         markersize=3, alpha=0.8, label=f\"{symbol} {metric.replace('_', ' ').title()}\")         ax4.set_title(f\"{self.metric_symbols['economy']} \u042d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438\", fontweight='bold')         ax4.set_xlabel('\u042d\u043f\u0438\u0437\u043e\u0434')         ax4.set_ylabel('\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435')         ax4.legend()         ax4.grid(True, alpha=0.3)          # 5. \u042d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438         ax5 = fig.add_subplot(gs[2, :2])         evol_metrics = ['architecture_entropy', 'adaptation_speed']         colors = ['red', 'cyan']         for i, metric in enumerate(evol_metrics):             if metrics[metric]:                 symbol = self.metric_symbols.get(metric.split('_')[0], '\ud83d\udcca')                 ax5.plot(metrics[metric], 'o-', color=colors[i], linewidth=2,                         markersize=3, alpha=0.8, label=f\"{symbol} {metric.replace('_', ' ').title()}\")         ax5.set_title(f\"{self.metric_symbols['entropy']} \u042d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438\", fontweight='bold')         ax5.set_xlabel('\u042d\u043f\u0438\u0437\u043e\u0434')         ax5.set_ylabel('\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435')         ax5.legend()         ax5.grid(True, alpha=0.3)          # 6. \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c         ax6 = fig.add_subplot(gs[2, 2:])         perf_metrics = ['energy_efficiency', 'computational_complexity']         if metrics['energy_efficiency'] and metrics['computational_complexity']:             # \u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f             eff_norm = np.array(metrics['energy_efficiency']) \/ max(metrics['energy_efficiency'])             comp_norm = np.array(metrics['computational_complexity']) \/ max(metrics['computational_complexity'])              ax6.plot(eff_norm, 'o-', color='gold', linewidth=2, markersize=3,                     alpha=0.8, label=f\"{self.metric_symbols['efficiency']} \u042d\u043d\u0435\u0440\u0433\u043e\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c (\u043d\u043e\u0440\u043c.)\")             ax6.plot(comp_norm, 'o-', color='brown', linewidth=2, markersize=3,                     alpha=0.8, label='\ud83d\udd27 \u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 (\u043d\u043e\u0440\u043c.)')             ax6.set_title(f\"{self.metric_symbols['efficiency']} \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\", fontweight='bold')             ax6.set_xlabel('\u042d\u043f\u0438\u0437\u043e\u0434')             ax6.set_ylabel('\u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435')             ax6.legend()             ax6.grid(True, alpha=0.3)          # 7. \u0422\u0435\u043f\u043b\u043e\u0432\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u043a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u0439 \u043c\u0435\u0442\u0440\u0438\u043a         ax7 = fig.add_subplot(gs[3, :2])         correlation_data = []         metric_names = []         for name, values in metrics.items():             if values and len(values) &gt; 5:  # \u0411\u0435\u0440\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0441 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445                 correlation_data.append(values[:min(len(values), 50)])  # \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c \u0434\u043b\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438                 metric_names.append(name.replace('_', '\\n'))          if len(correlation_data) &gt; 1:             # \u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0434\u043b\u0438\u043d\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432             min_len = min(len(data) for data in correlation_data)             correlation_matrix = np.corrcoef([data[:min_len] for data in correlation_data])              sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0,                        xticklabels=metric_names, yticklabels=metric_names, ax=ax7,                        fmt='.2f', cbar_kws={'label': '\u041a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u044f'})             ax7.set_title(\"\ud83d\udd25 \u041a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043c\u0435\u0442\u0440\u0438\u043a\", fontweight='bold')          # 8. \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u044f \u0438 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c         ax8 = fig.add_subplot(gs[3, 2:])         coord_metric = 'policy_coordination'         if metrics[coord_metric]:             ax8.plot(metrics[coord_metric], 'o-', color='darkgreen', linewidth=2,                     markersize=4, alpha=0.8)             ax8.fill_between(range(len(metrics[coord_metric])), metrics[coord_metric],                            alpha=0.3, color='lightgreen')             ax8.set_title(f\"{self.metric_symbols['coordination']} \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438\", fontweight='bold')             ax8.set_xlabel('\u042d\u043f\u0438\u0437\u043e\u0434')             ax8.set_ylabel('\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438')             ax8.grid(True, alpha=0.3)          plt.tight_layout()         return fig      def create_evolution_analysis(self, evolution_logger, stage_name: str):         \"\"\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\"\"\"         if not evolution_logger.evolution_history:             return None          print(f\"\\n\ud83e\uddec \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438 \u0434\u043b\u044f {stage_name}...\")          fig, axes = plt.subplots(2, 3, figsize=(18, 12))         fig.suptitle(f'\ud83e\uddec \u042d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437: {stage_name}', fontsize=16, fontweight='bold')          # \u0414\u0430\u043d\u043d\u044b\u0435 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438         generations = [step['generation'] for step in evolution_logger.evolution_history]         best_fitness = [step['best_fitness'] for step in evolution_logger.evolution_history]         avg_fitness = [step['avg_fitness'] for step in evolution_logger.evolution_history]         fitness_std = [step['fitness_std'] for step in evolution_logger.evolution_history]          # 1. \u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 fitness         axes[0, 0].plot(generations, best_fitness, 'o-', color='red', linewidth=2,                        markersize=5, label='\ud83c\udfc6 \u041b\u0443\u0447\u0448\u0438\u0439 fitness')         axes[0, 0].plot(generations, avg_fitness, 'o-', color='blue', linewidth=2,                        markersize=5, label='\ud83d\udcca \u0421\u0440\u0435\u0434\u043d\u0438\u0439 fitness')         axes[0, 0].fill_between(generations,                                np.array(avg_fitness) - np.array(fitness_std),                                np.array(avg_fitness) + np.array(fitness_std),                                alpha=0.3, color='blue', label='\ud83d\udccf \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435')         axes[0, 0].set_title('\ud83d\udcaa \u042d\u0432\u043e\u043b\u044e\u0446\u0438\u044f Fitness', fontweight='bold')         axes[0, 0].set_xlabel('\u041f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435')         axes[0, 0].set_ylabel('Fitness')         axes[0, 0].legend()         axes[0, 0].grid(True, alpha=0.3)          # 2. \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0438\u043f\u043e\u0432 \u043c\u0443\u0442\u0430\u0446\u0438\u0439         axes[0, 1].axis('off')         if evolution_logger.mutation_log:             mutation_types = [log['mutation_type'] for log in evolution_logger.mutation_log]             mutation_counts = {}             for mut_type in mutation_types:                 mutation_counts[mut_type] = mutation_counts.get(mut_type, 0) + 1              if mutation_counts:                 types = list(mutation_counts.keys())                 counts = list(mutation_counts.values())                 colors = plt.cm.Set3(np.linspace(0, 1, len(types)))                  axes[0, 1].pie(counts, labels=types, autopct='%1.1f%%', colors=colors,                               startangle=90, textprops={'fontsize': 10})                 axes[0, 1].set_title('\ud83d\udd00 \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043c\u0443\u0442\u0430\u0446\u0438\u0439', fontweight='bold')          # 3. \u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u0438         num_archs = [step['num_architectures'] for step in evolution_logger.evolution_history]         if num_archs:             axes[0, 2].bar(generations, num_archs, color='green', alpha=0.7)             axes[0, 2].set_title('\ud83c\udf08 \u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u0438', fontweight='bold')             axes[0, 2].set_xlabel('\u041f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435')             axes[0, 2].set_ylabel('\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440')             axes[0, 2].grid(True, alpha=0.3)          # 4. \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u0439         axes[1, 0].axis('off')         if evolution_logger.crossover_log:             crossover_count = len(evolution_logger.crossover_log)             mutation_count = len(evolution_logger.mutation_log)              labels = ['\ud83d\udd00 \u0421\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u044f', '\ud83e\uddec \u041c\u0443\u0442\u0430\u0446\u0438\u0438']             sizes = [crossover_count, mutation_count]             colors = ['lightcoral', 'lightblue']              axes[1, 0].pie(sizes, labels=labels, autopct='%1.1f%%', colors=colors,                           startangle=90, textprops={'fontsize': 12})             axes[1, 0].set_title('\u2696\ufe0f \u0422\u0438\u043f\u044b \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439', fontweight='bold')          # 5. \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438         if len(generations) &gt; 1:             fitness_improvement = np.diff(best_fitness)             axes[1, 1].plot(generations[1:], fitness_improvement, 'o-', color='purple',                            linewidth=2, markersize=4)             axes[1, 1].axhline(y=0, color='black', linestyle='--', alpha=0.5)             axes[1, 1].set_title('\ud83d\udcc8 \u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 fitness', fontweight='bold')             axes[1, 1].set_xlabel('\u041f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435')             axes[1, 1].set_ylabel('\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 fitness')             axes[1, 1].grid(True, alpha=0.3)          # 6. \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438         if best_fitness and avg_fitness:             efficiency = np.array(best_fitness) \/ (np.array(avg_fitness) + 1e-8)             axes[1, 2].plot(generations, efficiency, 'o-', color='orange',                            linewidth=2, markersize=4)             axes[1, 2].set_title('\u26a1 \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438', fontweight='bold')             axes[1, 2].set_xlabel('\u041f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435')             axes[1, 2].set_ylabel('\u041b\u0443\u0447\u0448\u0438\u0439\/\u0421\u0440\u0435\u0434\u043d\u0438\u0439 fitness')             axes[1, 2].grid(True, alpha=0.3)          plt.tight_layout()         return fig<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0410\u0445\u0442\u0443\u043d\u0433, \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430! \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0431\u043b\u043e\u043a<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># ===== \u041e\u0420\u0418\u0413\u0418\u041d\u0410\u041b\u042c\u041d\u042b\u0415 \u041a\u041b\u0410\u0421\u0421\u042b \u0421 \u041e\u041f\u0422\u0418\u041c\u0418\u0417\u0410\u0426\u0418\u042f\u041c\u0418 =====  class EvolutionLogger:     \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\"\"\"     def __init__(self):         self.evolution_history = []         self.architecture_history = []         self.performance_history = []         self.mutation_log = []         self.crossover_log = []         self.selection_log = []      def log_evolution_step(self, generation: int, architectures: List,                           fitness_scores: List, best_score: float):         \"\"\"\u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0448\u0430\u0433\u0430 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438\"\"\"         step_data = {             'generation': generation,             'timestamp': datetime.now().isoformat(),             'num_architectures': len(architectures),             'fitness_scores': fitness_scores.copy(),             'best_fitness': best_score,             'avg_fitness': np.mean(fitness_scores),             'fitness_std': np.std(fitness_scores)         }         self.evolution_history.append(step_data)      def log_mutation(self, parent_arch: Dict, mutated_arch: Dict,                     mutation_type: str):         \"\"\"\u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0443\u0442\u0430\u0446\u0438\u0438\"\"\"         mutation_data = {             'timestamp': datetime.now().isoformat(),             'mutation_type': mutation_type,             'parent_hash': hash(str(parent_arch)),             'mutated_hash': hash(str(mutated_arch)),             'changes': self._get_architecture_diff(parent_arch, mutated_arch)         }         self.mutation_log.append(mutation_data)      def log_crossover(self, parent1_arch: Dict, parent2_arch: Dict,                      child_arch: Dict):         \"\"\"\u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u044f\"\"\"         crossover_data = {             'timestamp': datetime.now().isoformat(),             'parent1_hash': hash(str(parent1_arch)),             'parent2_hash': hash(str(parent2_arch)),             'child_hash': hash(str(child_arch))         }         self.crossover_log.append(crossover_data)      def _get_architecture_diff(self, arch1: Dict, arch2: Dict) -&gt; List:         \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430\u043c\u0438\"\"\"         differences = []         for key in arch1:             if arch1[key] != arch2[key]:                 differences.append({                     'parameter': key,                     'old_value': arch1[key],                     'new_value': arch2[key]                 })         return differences  class PerformanceMonitor:     \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438\"\"\"     def __init__(self):         self.metrics = {             'episode_rewards': [],             'system_reward': [],             'adaptation_speed': [],             'demographic_stability': [],             'architecture_entropy': [],             'computational_complexity': [],             'energy_efficiency': [],             'population_balance': [],             'resource_utilization': [],             'economic_development': [],             'policy_coordination': []         }         self.start_time = time.time()      def update_metrics(self, episode: int, agents: List, env_states: np.ndarray,                       episode_rewards: np.ndarray, architectures: List):         \"\"\"\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043c\u0435\u0442\u0440\u0438\u043a \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0434\u043b\u044f T4 GPU\"\"\"         # \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043d\u0430\u0433\u0440\u0430\u0434\u044b         self.metrics['episode_rewards'].append(float(np.mean(episode_rewards)))         self.metrics['system_reward'].append(float(np.sum(episode_rewards)))          # \u0414\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f)         with torch.no_grad():  # \u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438[16]             population_var = float(np.var(env_states[:, 0]))             self.metrics['demographic_stability'].append(1.0 \/ (1.0 + population_var))          # \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u0430\u044f \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u044f (\u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0435)         arch_entropy = self._calculate_architecture_entropy(architectures)         self.metrics['architecture_entropy'].append(arch_entropy)          # \u0412\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c         complexity = self._calculate_computational_complexity(agents)         self.metrics['computational_complexity'].append(complexity)          # \u042d\u043d\u0435\u0440\u0433\u043e\u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c (\u043d\u0430\u0433\u0440\u0430\u0434\u0430 \u043d\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440)         efficiency = float(np.sum(episode_rewards)) \/ (complexity + 1e-8)         self.metrics['energy_efficiency'].append(efficiency)          # \u0421\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438         self.metrics['population_balance'].append(float(np.mean(env_states[:, 0])))         self.metrics['resource_utilization'].append(float(np.mean(env_states[:, 1])))         self.metrics['economic_development'].append(float(np.mean(env_states[:, 2])))         self.metrics['policy_coordination'].append(1.0 - float(np.std(env_states[:, 3])))          # \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0438         if len(self.metrics['episode_rewards']) &gt; 10:             recent_improvement = (np.mean(self.metrics['episode_rewards'][-5:]) -                                 np.mean(self.metrics['episode_rewards'][-10:-5]))             self.metrics['adaptation_speed'].append(max(0, float(recent_improvement)))         else:             self.metrics['adaptation_speed'].append(0.0)      def _calculate_architecture_entropy(self, architectures: List) -&gt; float:         \"\"\"\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u044f\"\"\"         if not architectures:             return 0.0          arch_hashes = [hash(str(arch)) for arch in architectures]         unique_archs = len(set(arch_hashes))         total_archs = len(arch_hashes)          if total_archs &lt;= 1:             return 0.0          # \u042d\u043d\u0442\u0440\u043e\u043f\u0438\u044f \u0428\u0435\u043d\u043d\u043e\u043d\u0430         prob = unique_archs \/ total_archs         return float(-prob * np.log2(prob + 1e-8))      def _calculate_computational_complexity(self, agents: List) -&gt; float:         \"\"\"\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438\"\"\"         total_params = 0         for agent in agents:             if hasattr(agent, 'actor'):                 total_params += sum(p.numel() for p in agent.actor.parameters())             if hasattr(agent, 'critic'):                 total_params += sum(p.numel() for p in agent.critic.parameters())         return float(total_params)  class ArchitectureGenome:     \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0433\u0435\u043d\u043e\u043c\u0430 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438\"\"\"     def __init__(self, hidden_sizes: List[int] = None,                  activation_functions: List[str] = None,                  dropout_rates: List[float] = None,                  learning_rate: float = 0.001):         self.hidden_sizes = hidden_sizes or [64, 32]         self.activation_functions = activation_functions or ['relu', 'relu']         self.dropout_rates = dropout_rates or [0.0, 0.0]         self.learning_rate = learning_rate         self.fitness = 0.0         self.age = 0      def to_dict(self) -&gt; Dict:         \"\"\"\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c\"\"\"         return {             'hidden_sizes': self.hidden_sizes,             'activation_functions': self.activation_functions,             'dropout_rates': self.dropout_rates,             'learning_rate': self.learning_rate,             'fitness': self.fitness,             'age': self.age         }      @classmethod     def from_dict(cls, data: Dict):         \"\"\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u0437 \u0441\u043b\u043e\u0432\u0430\u0440\u044f\"\"\"         genome = cls(             hidden_sizes=data['hidden_sizes'],             activation_functions=data['activation_functions'],             dropout_rates=data['dropout_rates'],             learning_rate=data['learning_rate']         )         genome.fitness = data.get('fitness', 0.0)         genome.age = data.get('age', 0)         return genome      def mutate(self, mutation_rate: float = 0.1) -&gt; 'ArchitectureGenome':         \"\"\"\u041c\u0443\u0442\u0430\u0446\u0438\u044f \u0433\u0435\u043d\u043e\u043c\u0430\"\"\"         new_genome = copy.deepcopy(self)          # \u041c\u0443\u0442\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0441\u043a\u0440\u044b\u0442\u044b\u0445 \u0441\u043b\u043e\u0435\u0432         if random.random() &lt; mutation_rate:             layer_idx = random.randint(0, len(new_genome.hidden_sizes) - 1)             change = random.choice([-16, -8, 8, 16])             new_genome.hidden_sizes[layer_idx] = max(8,                                                    new_genome.hidden_sizes[layer_idx] + change)          # \u041c\u0443\u0442\u0430\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438         if random.random() &lt; mutation_rate:             layer_idx = random.randint(0, len(new_genome.activation_functions) - 1)             new_genome.activation_functions[layer_idx] = random.choice(                 ['relu', 'tanh', 'sigmoid', 'leaky_relu', 'elu'])          # \u041c\u0443\u0442\u0430\u0446\u0438\u044f dropout         if random.random() &lt; mutation_rate:             layer_idx = random.randint(0, len(new_genome.dropout_rates) - 1)             new_genome.dropout_rates[layer_idx] = random.uniform(0.0, 0.5)          # \u041c\u0443\u0442\u0430\u0446\u0438\u044f learning rate         if random.random() &lt; mutation_rate:             new_genome.learning_rate *= random.uniform(0.5, 2.0)             new_genome.learning_rate = max(0.0001, min(0.01, new_genome.learning_rate))          return new_genome      def crossover(self, other: 'ArchitectureGenome') -&gt; 'ArchitectureGenome':         \"\"\"\u0421\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u0435 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c \u0433\u0435\u043d\u043e\u043c\u043e\u043c\"\"\"         new_genome = ArchitectureGenome()          # \u0421\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u0441\u043b\u043e\u0435\u0432         min_layers = min(len(self.hidden_sizes), len(other.hidden_sizes))         new_genome.hidden_sizes = []         for i in range(min_layers):             if random.random() &lt; 0.5:                 new_genome.hidden_sizes.append(self.hidden_sizes[i])             else:                 new_genome.hidden_sizes.append(other.hidden_sizes[i])          # \u0421\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438         new_genome.activation_functions = []         for i in range(min_layers):             if random.random() &lt; 0.5:                 new_genome.activation_functions.append(self.activation_functions[i])             else:                 new_genome.activation_functions.append(other.activation_functions[i])          # \u0421\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u0435 dropout rates         new_genome.dropout_rates = []         for i in range(min_layers):             if random.random() &lt; 0.5:                 new_genome.dropout_rates.append(self.dropout_rates[i])             else:                 new_genome.dropout_rates.append(other.dropout_rates[i])          # \u0421\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u0435 learning rate         new_genome.learning_rate = random.choice([self.learning_rate, other.learning_rate])          return new_genome  class EvolvableActor(nn.Module):     \"\"\"\u042d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u043c\u044b\u0439 Actor \u0441 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 \u0434\u043b\u044f T4\"\"\"     def __init__(self, input_size: int = 4, genome: ArchitectureGenome = None):         super().__init__()         self.genome = genome or ArchitectureGenome()         self.input_size = input_size          layers = []         prev_size = input_size          for i, (hidden_size, activation, dropout) in enumerate(zip(             self.genome.hidden_sizes,             self.genome.activation_functions,             self.genome.dropout_rates         )):             # \u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c bias \u0434\u043b\u044f \u0441\u043b\u043e\u0435\u0432, \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 BatchNorm (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f)[30]             layers.append(nn.Linear(prev_size, hidden_size, bias=(dropout == 0)))              # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438             if activation == 'relu':                 layers.append(nn.ReLU())             elif activation == 'tanh':                 layers.append(nn.Tanh())             elif activation == 'sigmoid':                 layers.append(nn.Sigmoid())             elif activation == 'leaky_relu':                 layers.append(nn.LeakyReLU())             elif activation == 'elu':                 layers.append(nn.ELU())              # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 dropout             if dropout &gt; 0:                 layers.append(nn.Dropout(dropout))              prev_size = hidden_size          # \u0412\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u043b\u043e\u0439         layers.append(nn.Linear(prev_size, 1))         layers.append(nn.Tanh())          self.net = nn.Sequential(*layers)          # \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e         self.to(device)      def forward(self, x):         if isinstance(x, np.ndarray):             x = torch.FloatTensor(x)         x = x.to(device)         return self.net(x)  class EvolvableCritic(nn.Module):     \"\"\"\u042d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u043c\u044b\u0439 Critic \u0441 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 \u0434\u043b\u044f T4\"\"\"     def __init__(self, total_regions: int, genome: ArchitectureGenome = None):         super().__init__()         self.genome = genome or ArchitectureGenome()         self.total_regions = total_regions         input_size = 4 * total_regions + total_regions          layers = []         prev_size = input_size          for i, (hidden_size, activation, dropout) in enumerate(zip(             self.genome.hidden_sizes,             self.genome.activation_functions,             self.genome.dropout_rates         )):             # \u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c bias \u0434\u043b\u044f \u0441\u043b\u043e\u0435\u0432, \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 BatchNorm (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f)[30]             layers.append(nn.Linear(prev_size, hidden_size, bias=(dropout == 0)))              # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438             if activation == 'relu':                 layers.append(nn.ReLU())             elif activation == 'tanh':                 layers.append(nn.Tanh())             elif activation == 'sigmoid':                 layers.append(nn.Sigmoid())             elif activation == 'leaky_relu':                 layers.append(nn.LeakyReLU())             elif activation == 'elu':                 layers.append(nn.ELU())              # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 dropout             if dropout &gt; 0:                 layers.append(nn.Dropout(dropout))              prev_size = hidden_size          # \u0412\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u043b\u043e\u0439         layers.append(nn.Linear(prev_size, 1))          self.net = nn.Sequential(*layers)          # \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e         self.to(device)      def forward(self, states, actions):         if isinstance(states, np.ndarray):             states = torch.FloatTensor(states)         if isinstance(actions, np.ndarray):             actions = torch.FloatTensor(actions)          states = states.to(device)         actions = actions.to(device)          x = torch.cat([states.flatten(1), actions.flatten(1)], dim=1)         return self.net(x)  class DarwinGodelAgent:     \"\"\"\u0410\u0433\u0435\u043d\u0442 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 \u0434\u043b\u044f T4\"\"\"     def __init__(self, agent_id: int, total_regions: int,                  actor_genome: ArchitectureGenome = None,                  critic_genome: ArchitectureGenome = None,                  is_base: bool = False):         self.agent_id = agent_id         self.total_regions = total_regions         self.is_base = is_base          # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0433\u0435\u043d\u043e\u043c\u043e\u0432 \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u044b         self.actor_genome = actor_genome or ArchitectureGenome()         self.critic_genome = critic_genome or ArchitectureGenome()          # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0442\u0435\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0433\u0435\u043d\u043e\u043c\u043e\u0432         self.actor = EvolvableActor(genome=self.actor_genome)         self.actor_target = EvolvableActor(genome=self.actor_genome)         self.critic = EvolvableCritic(total_regions, genome=self.critic_genome)         self.critic_target = EvolvableCritic(total_regions, genome=self.critic_genome)          # \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u044b \u0441 \u0443\u0447\u0435\u0442\u043e\u043c learning rate \u0438\u0437 \u0433\u0435\u043d\u043e\u043c\u0430         self.actor_optim = optim.Adam(self.actor.parameters(),                                     lr=self.actor_genome.learning_rate)         self.critic_optim = optim.Adam(self.critic.parameters(),                                      lr=self.critic_genome.learning_rate)          # \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0435\u0441\u043e\u0432 \u0432 target \u0441\u0435\u0442\u0438         self.actor_target.load_state_dict(self.actor.state_dict())         self.critic_target.load_state_dict(self.critic.state_dict())          self.steps_done = 0         self.fitness_history = []      def act(self, state, exploration=True):         \"\"\"\u0412\u044b\u0431\u043e\u0440 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0430\u0433\u0435\u043d\u0442\u043e\u043c \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0434\u043b\u044f GPU\"\"\"         with torch.no_grad():  # \u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438[16]             if isinstance(state, np.ndarray):                 state_tensor = torch.FloatTensor(state).to(device)             else:                 state_tensor = state.to(device)              action = self.actor(state_tensor).cpu().numpy()              if exploration and not self.is_base:                 # \u0410\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0439 \u0448\u0443\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 fitness                 noise_scale = 0.1 * max(0, 1 - self.steps_done \/ 10000)                 if self.fitness_history:                     # \u0411\u043e\u043b\u044c\u0448\u0435 \u0448\u0443\u043c\u0430 \u0434\u043b\u044f \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0441 \u043d\u0438\u0437\u043a\u0438\u043c fitness                     avg_fitness = np.mean(self.fitness_history[-10:])                     noise_scale *= (2.0 - min(1.0, max(0.0, avg_fitness)))                 noise = np.random.normal(0, noise_scale)                 action += noise             return np.clip(action, -1, 1)      def update_fitness(self, reward: float):         \"\"\"\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 fitness \u0430\u0433\u0435\u043d\u0442\u0430\"\"\"         self.fitness_history.append(float(reward))         if len(self.fitness_history) &gt; 100:             self.fitness_history.pop(0)          # \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c fitness \u0432 \u0433\u0435\u043d\u043e\u043c\u0430\u0445         recent_fitness = np.mean(self.fitness_history[-10:]) if self.fitness_history else 0         self.actor_genome.fitness = recent_fitness         self.critic_genome.fitness = recent_fitness      def evolve_architecture(self, best_actor_genome: ArchitectureGenome = None,                           best_critic_genome: ArchitectureGenome = None):         \"\"\"\u042d\u0432\u043e\u043b\u044e\u0446\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u0430\u0433\u0435\u043d\u0442\u0430\"\"\"         if self.is_base:             return False  # \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u0430\u0433\u0435\u043d\u0442\u044b \u043d\u0435 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u044e\u0442          evolved = False          # \u042d\u0432\u043e\u043b\u044e\u0446\u0438\u044f Actor         if best_actor_genome and random.random() &lt; CROSSOVER_RATE:             new_actor_genome = self.actor_genome.crossover(best_actor_genome)             evolved = True         else:             new_actor_genome = self.actor_genome.mutate(MUTATION_RATE)             evolved = new_actor_genome.to_dict() != self.actor_genome.to_dict()          # \u042d\u0432\u043e\u043b\u044e\u0446\u0438\u044f Critic         if best_critic_genome and random.random() &lt; CROSSOVER_RATE:             new_critic_genome = self.critic_genome.crossover(best_critic_genome)             evolved = True         else:             new_critic_genome = self.critic_genome.mutate(MUTATION_RATE)             evolved = evolved or (new_critic_genome.to_dict() != self.critic_genome.to_dict())          if evolved:             # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u0441\u0435\u0442\u0438             self.actor_genome = new_actor_genome             self.critic_genome = new_critic_genome              new_actor = EvolvableActor(genome=self.actor_genome)             new_critic = EvolvableCritic(self.total_regions, genome=self.critic_genome)              # \u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432\u0435\u0441\u0430 (\u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e, \u0435\u0441\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e)             try:                 self._transfer_weights(self.actor, new_actor)                 self._transfer_weights(self.critic, new_critic)             except:                 pass  # \u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438, \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0432\u0435\u0441\u043e\u0432              self.actor = new_actor             self.critic = new_critic              # \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c target \u0441\u0435\u0442\u0438             self.actor_target = EvolvableActor(genome=self.actor_genome)             self.critic_target = EvolvableCritic(self.total_regions, genome=self.critic_genome)             self.actor_target.load_state_dict(self.actor.state_dict())             self.critic_target.load_state_dict(self.critic.state_dict())              # \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440\u044b             self.actor_optim = optim.Adam(self.actor.parameters(),                                         lr=self.actor_genome.learning_rate)             self.critic_optim = optim.Adam(self.critic.parameters(),                                          lr=self.critic_genome.learning_rate)          return evolved      def _transfer_weights(self, old_net, new_net):         \"\"\"\u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u0432\u0435\u0441\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0441\u0435\u0442\u044f\u043c\u0438 \u0440\u0430\u0437\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b\"\"\"         old_state = old_net.state_dict()         new_state = new_net.state_dict()          for name, param in new_state.items():             if name in old_state:                 old_param = old_state[name]                 if old_param.shape == param.shape:                     new_state[name] = old_param          new_net.load_state_dict(new_state)  class MigrationEnvironment:     \"\"\"\u0421\u0440\u0435\u0434\u0430 \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432\"\"\"     def __init__(self, num_regions=NUM_REGIONS_STAGE1):         self.num_regions = num_regions         self.reset()      def reset(self):         \"\"\"\u0421\u0431\u0440\u043e\u0441 \u0441\u0440\u0435\u0434\u044b\"\"\"         self.states = np.random.uniform(0.5, 1.5, (self.num_regions, 4))         self.states[:, 3] = 0.0  # \u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438         return self.states.copy()      def step(self, actions):         \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0448\u0430\u0433\u0430 \u0432 \u0441\u0440\u0435\u0434\u0435\"\"\"         next_states = np.zeros_like(self.states)         rewards = np.zeros(self.num_regions)          for i in range(self.num_regions):             # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438             self.states[i, 3] = np.clip(self.states[i, 3] + actions[i][0], -1, 1)              # \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438             neighbor_policies = [self.states[j, 3] for j in self.neighbors(i)]             migration = 0.1 * (self.states[i, 3] - np.mean(neighbor_policies))              # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f             self.states[i, 0] = np.clip(self.states[i, 0] + migration, 0.1, 2.0)              # \u042d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u043e\u0441\u0442             economic_growth = 0.05 * self.states[i, 0] * (1 + self.states[i, 3])             self.states[i, 2] = np.clip(self.states[i, 2] + economic_growth, 0.1, 2.0)              # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432             resource_usage = 0.02 * self.states[i, 0] * self.states[i, 2]             self.states[i, 1] = np.clip(self.states[i, 1] - resource_usage, 0.1, 2.0)              # \u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u0433\u0440\u0430\u0434\u044b             rewards[i] = self._calculate_reward(i)          return self.states.copy(), rewards, False, {}      def _calculate_reward(self, region):         \"\"\"\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u0433\u0440\u0430\u0434\u044b \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u043e\u043d\u0430\"\"\"         pop_balance = -abs(self.states[region, 0] - 1.0)         economy = self.states[region, 2] - 1.0         resources = -0.5 * (1.0 - self.states[region, 1])          neighbor_policies = [self.states[j, 3] for j in self.neighbors(region)]         policy_align = 0.2 * np.mean([1 - abs(self.states[region, 3] - policy)                                     for policy in neighbor_policies])          return pop_balance + economy + resources + policy_align      def neighbors(self, region):         \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0435\u0434\u0435\u0439 \u0440\u0435\u0433\u0438\u043e\u043d\u0430\"\"\"         return [(region - 1) % self.num_regions, (region + 1) % self.num_regions]  class DarwinGodelMADDPG:     \"\"\"\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0435\u0439 Darwin G\u00f6del Machine \u0438 MADDPG\"\"\"     def __init__(self, num_regions=NUM_REGIONS_STAGE1, prev_agents=None):         self.num_regions = num_regions         self.env = MigrationEnvironment(num_regions)         self.evolution_logger = EvolutionLogger()         self.performance_monitor = PerformanceMonitor()          # \u041d\u043e\u0432\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b         self.time_tracker = TimeTracker()         self.visualizer = EnhancedVisualization()         self.save_manager = AutoSaveManager()          # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0433\u0435\u043d\u0442\u043e\u0432         if prev_agents:             self.agents = prev_agents             for agent in self.agents:                 agent.is_base = True             self._add_new_agents(num_regions - len(prev_agents))         else:             self.agents = [DarwinGodelAgent(i, num_regions) for i in range(num_regions)]          # \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u0441 deque \u0434\u043b\u044f \u043b\u0443\u0447\u0448\u0435\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438         self.memory = deque(maxlen=100000)         self.generation = 0         self.best_architectures = {             'actor': None,             'critic': None         }      def _add_new_agents(self, num_new):         \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432\"\"\"         for i in range(num_new):             base_agent = self.agents[i % len(self.agents)]             new_agent = DarwinGodelAgent(                 len(self.agents),                 self.num_regions,                 actor_genome=copy.deepcopy(base_agent.actor_genome),                 critic_genome=copy.deepcopy(base_agent.critic_genome)             )             self.agents.append(new_agent)      def train_stage(self, episodes, stage_name):         \"\"\"\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u043c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u043e\u043c\"\"\"         print(f\"\\n\ud83d\ude80 === {stage_name} ===\")         print(f\"\ud83e\udd16 \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u0433\u0435\u043d\u0442\u043e\u0432: {len(self.agents)}\")         print(f\"\ud83d\udcca \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432: {episodes}\")          # \u0417\u0430\u043f\u0443\u0441\u043a \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438         self.time_tracker.start_stage(stage_name, episodes)          # \u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440 \u0434\u043b\u044f \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432[33]         episode_pbar = tqdm(range(episodes), desc=f\"\ud83c\udfaf {stage_name}\",                            unit=\"\u044d\u043f\u0438\u0437\u043e\u0434\", colour=\"blue\")          for episode in episode_pbar:             states = self.env.reset()             episode_rewards = np.zeros(self.num_regions)              # \u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440 \u0434\u043b\u044f \u0448\u0430\u0433\u043e\u0432             step_pbar = tqdm(range(STEPS), desc=f\"\u042d\u043f\u0438\u0437\u043e\u0434 {episode+1}\",                            leave=False, unit=\"\u0448\u0430\u0433\", colour=\"green\")              for step in step_pbar:                 # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043e\u0442 \u0430\u0433\u0435\u043d\u0442\u043e\u0432                 actions = self._get_actions(states)                  # \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0448\u0430\u0433\u0430 \u0432 \u0441\u0440\u0435\u0434\u0435                 next_states, rewards, _, _ = self.env.step(actions)                  # \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u044b\u0442\u0430                 self.memory.append((states, actions, rewards, next_states))                  # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0430\u0433\u0435\u043d\u0442\u043e\u0432                 if len(self.memory) &gt; BATCH_SIZE:                     self._update_agents()                  # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 fitness \u0430\u0433\u0435\u043d\u0442\u043e\u0432                 for i, agent in enumerate(self.agents):                     agent.update_fitness(rewards[i])                     if not agent.is_base:                         agent.steps_done += 1                  episode_rewards += rewards                 states = next_states                  # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440\u0430 \u0448\u0430\u0433\u043e\u0432                 step_pbar.set_postfix({                     '\u041d\u0430\u0433\u0440\u0430\u0434\u0430': f\"{np.mean(rewards):.3f}\",                     '\u041f\u0430\u043c\u044f\u0442\u044c': f\"{len(self.memory)}\"                 })              # \u042d\u0432\u043e\u043b\u044e\u0446\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440             if episode % EVOLUTION_FREQUENCY == 0 and episode &gt; 0:                 print(f\"\\n\ud83e\uddec \u042d\u0432\u043e\u043b\u044e\u0446\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440 (\u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435 {self.generation})\")                 self._evolve_population()              # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430             architectures = [agent.actor_genome.to_dict() for agent in self.agents]             self.performance_monitor.update_metrics(                 episode, self.agents, states, episode_rewards, architectures)              # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438             self.time_tracker.update_progress(episode + 1)              # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440\u0430 \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432             avg_reward = np.mean(episode_rewards)             time_info = self.time_tracker.get_time_info()             episode_pbar.set_postfix({                 '\u0421\u0440.\u043d\u0430\u0433\u0440\u0430\u0434\u0430': f\"{avg_reward:.3f}\",                 '\u0421\u0438\u0441\u0442\u0435\u043c.': f\"{np.sum(episode_rewards):.1f}\",                 '\u0412\u0440\u0435\u043c\u044f': f\"{time_info.get('stage_progress', 0):.1f}%\",                 '\u041f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435': self.generation             })              # \u0412\u044b\u0432\u043e\u0434 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430 \u043a\u0430\u0436\u0434\u044b\u0435 10 \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432             if (episode + 1) % 10 == 0:                 self.time_tracker.display_status()                  # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0438\u0441\u043a\u0430 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u044f \u043b\u0438\u043c\u0438\u0442\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438                 if time_info.get('colab_timeout_risk', False):                     print(\"\u26a0\ufe0f \u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415: \u041f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u043c\u0438\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 Colab! \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u044e \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b...\")                     self.save_manager.save_stage_results(                         f\"{stage_name}_intermediate_{episode+1}\",                         self, self.performance_monitor, self.evolution_logger,                         self.time_tracker, self.visualizer                     )          # \u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0434\u0438\u0438         self.time_tracker.finish_stage()          # \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0441\u0442\u0430\u0434\u0438\u0438         print(f\"\\n\ud83d\udcbe \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0441\u0442\u0430\u0434\u0438\u0438: {stage_name}\")         self.save_manager.save_stage_results(             stage_name, self, self.performance_monitor,             self.evolution_logger, self.time_tracker, self.visualizer         )          print(f\"\u2705 {stage_name} \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430!\")      def _get_actions(self, states):         \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043e\u0442 \u0432\u0441\u0435\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0434\u043b\u044f GPU\"\"\"         actions = []          # \u0411\u0430\u0442\u0447\u0435\u0432\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u043d\u0430 GPU[18]         if torch.cuda.is_available() and len(self.agents) &gt; 4:             # \u0413\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0431\u0430\u0442\u0447\u0430\u043c\u0438             states_batch = torch.FloatTensor(states).to(device)              with torch.no_grad():  # \u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438                 for i, agent in enumerate(self.agents):                     exploration = not agent.is_base                     action = agent.act(states_batch[i], exploration=exploration)                     actions.append(action)         else:             # \u041e\u0431\u044b\u0447\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u043b\u044f CPU \u0438\u043b\u0438 \u043c\u0430\u043b\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0430\u0433\u0435\u043d\u0442\u043e\u0432             for i, agent in enumerate(self.agents):                 exploration = not agent.is_base                 action = agent.act(states[i], exploration=exploration)                 actions.append(action)          return actions      def _update_agents(self):         \"\"\"\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u043e\u043c MADDPG \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438 \u0434\u043b\u044f T4\"\"\"         # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c mini-batch \u0434\u043b\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 GPU[31]         batch = random.sample(self.memory, min(BATCH_SIZE, len(self.memory)))          # \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0442\u0435\u043d\u0437\u043e\u0440\u044b \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438         states = torch.FloatTensor(np.array([item[0] for item in batch])).to(device)         actions = torch.FloatTensor(np.array([item[1] for item in batch])).to(device)         rewards = torch.FloatTensor(np.array([item[2] for item in batch])).to(device)         next_states = torch.FloatTensor(np.array([item[3] for item in batch])).to(device)          for idx, agent in enumerate(self.agents):             if agent.is_base:                 continue              # \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043a\u044d\u0448\u0430 GPU \u0434\u043b\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u043f\u0430\u043c\u044f\u0442\u0438             if torch.cuda.is_available():                 torch.cuda.empty_cache()              # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 Critic             agent.critic_optim.zero_grad()              with torch.no_grad():                 target_actions = []                 for i, a in enumerate(self.agents):                     target_action = a.actor_target(next_states[:, i, :])                     target_actions.append(target_action)                  target_q = rewards[:, idx] + GAMMA * agent.critic_target(                     next_states.view(BATCH_SIZE, -1),                     torch.cat(target_actions, dim=1)                 ).squeeze()              current_q = agent.critic(                 states.view(BATCH_SIZE, -1),                 actions.view(BATCH_SIZE, -1)             ).squeeze()              critic_loss = nn.MSELoss()(current_q, target_q)             critic_loss.backward()              # \u0413\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043d\u043e\u0435 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438[16]             torch.nn.utils.clip_grad_norm_(agent.critic.parameters(), 1.0)             agent.critic_optim.step()              # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 Actor             agent.actor_optim.zero_grad()              policy_actions = []             for i, a in enumerate(self.agents):                 if i == idx:                     policy_actions.append(agent.actor(states[:, i, :]))                 else:                     policy_actions.append(a.actor(states[:, i, :]).detach())              actor_loss = -agent.critic(                 states.view(BATCH_SIZE, -1),                 torch.cat(policy_actions, dim=1)             ).mean()              actor_loss.backward()              # \u0413\u0440\u0430\u0434\u0438\u0435\u043d\u0442\u043d\u043e\u0435 \u043e\u0442\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438             torch.nn.utils.clip_grad_norm_(agent.actor.parameters(), 1.0)             agent.actor_optim.step()              # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 target \u0441\u0435\u0442\u0435\u0439             self._soft_update(agent.actor, agent.actor_target, TAU)             self._soft_update(agent.critic, agent.critic_target, TAU)      def _soft_update(self, source, target, tau):         \"\"\"\u041c\u044f\u0433\u043a\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 target \u0441\u0435\u0442\u0438\"\"\"         for target_param, source_param in zip(target.parameters(), source.parameters()):             target_param.data.copy_(tau * source_param.data + (1.0 - tau) * target_param.data)      def _evolve_population(self):         \"\"\"\u042d\u0432\u043e\u043b\u044e\u0446\u0438\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u043c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c\"\"\"         print(f\"\\n\ud83e\uddec --- \u042d\u0432\u043e\u043b\u044e\u0446\u0438\u044f \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f {self.generation} ---\")          # \u0421\u0431\u043e\u0440 fitness scores         fitness_scores = []         actor_genomes = []         critic_genomes = []          for agent in self.agents:             if not agent.is_base:                 fitness = np.mean(agent.fitness_history[-10:]) if agent.fitness_history else 0                 fitness_scores.append(fitness)                 actor_genomes.append(agent.actor_genome)                 critic_genomes.append(agent.critic_genome)          if not fitness_scores:             return          # \u041d\u0430\u0439\u0442\u0438 \u043b\u0443\u0447\u0448\u0438\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b         best_idx = np.argmax(fitness_scores)         best_actor_genome = actor_genomes[best_idx]         best_critic_genome = critic_genomes[best_idx]          # \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043b\u0443\u0447\u0448\u0438\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b         if (self.best_architectures['actor'] is None or             best_actor_genome.fitness &gt; self.best_architectures['actor'].fitness):             self.best_architectures['actor'] = copy.deepcopy(best_actor_genome)          if (self.best_architectures['critic'] is None or             best_critic_genome.fitness &gt; self.best_architectures['critic'].fitness):             self.best_architectures['critic'] = copy.deepcopy(best_critic_genome)          # \u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438         self.evolution_logger.log_evolution_step(             self.generation,             [g.to_dict() for g in actor_genomes],             fitness_scores,             np.max(fitness_scores)         )          # \u042d\u0432\u043e\u043b\u044e\u0446\u0438\u044f \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0441 \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441-\u0431\u0430\u0440\u043e\u043c         evolved_count = 0         agent_pbar = tqdm(self.agents, desc=\"\ud83d\udd04 \u042d\u0432\u043e\u043b\u044e\u0446\u0438\u044f \u0430\u0433\u0435\u043d\u0442\u043e\u0432\", leave=False)          for agent in agent_pbar:             if agent.is_base:                 continue              old_actor_genome = copy.deepcopy(agent.actor_genome)             old_critic_genome = copy.deepcopy(agent.critic_genome)              evolved = agent.evolve_architecture(                 self.best_architectures['actor'],                 self.best_architectures['critic']             )              if evolved:                 evolved_count += 1                 # \u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u0443\u0442\u0430\u0446\u0438\u0439\/\u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u0439                 if random.random() &lt; 0.5:  # \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c \u0447\u0442\u043e \u0431\u044b\u043b\u0430 \u043c\u0443\u0442\u0430\u0446\u0438\u044f                     self.evolution_logger.log_mutation(                         old_actor_genome.to_dict(),                         agent.actor_genome.to_dict(),                         \"actor_mutation\"                     )                 else:  # \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u0435                     self.evolution_logger.log_crossover(                         old_actor_genome.to_dict(),                         self.best_architectures['actor'].to_dict(),                         agent.actor_genome.to_dict()                     )              agent_pbar.set_postfix({'\u042d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u043e': evolved_count})          print(f\"\u2728 \u042d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u043e \u0430\u0433\u0435\u043d\u0442\u043e\u0432: {evolved_count}\")         print(f\"\ud83c\udfc6 \u041b\u0443\u0447\u0448\u0438\u0439 fitness: {np.max(fitness_scores):.3f}\")         print(f\"\ud83d\udcca \u0421\u0440\u0435\u0434\u043d\u0438\u0439 fitness: {np.mean(fitness_scores):.3f}\")         print(f\"\ud83d\udccf \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435: {np.std(fitness_scores):.3f}\")          self.generation += 1      def train_all_stages(self):         \"\"\"\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0441\u0442\u0430\u0434\u0438\u0439 \u0441 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u044b\u043c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u043e\u043c\"\"\"         print(\"\\n\ud83d\ude80 ========== \u0417\u0410\u041f\u0423\u0421\u041a \u041f\u041e\u041b\u041d\u041e\u0413\u041e \u041e\u0411\u0423\u0427\u0415\u041d\u0418\u042f ==========\")         print(\"\ud83c\udfaf Darwin G\u00f6del MADDPG - \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438\")         print(\"\u26a1 \u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0434\u043b\u044f Google Colab T4 GPU\")         print(\"=\"*60)          try:             # \u0421\u0442\u0430\u0434\u0438\u044f 1: 7 \u0430\u0433\u0435\u043d\u0442\u043e\u0432             print(f\"\\n\ud83e\udd47 \u0421\u0422\u0410\u0414\u0418\u042f 1: \u0411\u0430\u0437\u043e\u0432\u043e\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 ({NUM_REGIONS_STAGE1} \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432)\")             self.train_stage(EPISODES_PER_STAGE, \"\u0421\u0442\u0430\u0434\u0438\u044f 1\")              # \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043e 28 \u0430\u0433\u0435\u043d\u0442\u043e\u0432             print(f\"\\n\ud83e\udd48 \u041f\u0415\u0420\u0415\u0425\u041e\u0414 \u041a \u0421\u0422\u0410\u0414\u0418\u0418 2: \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043e {NUM_REGIONS_STAGE2} \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432\")             stage1_agents = copy.deepcopy(self.agents)             self.__init__(NUM_REGIONS_STAGE2, stage1_agents)             self.train_stage(EPISODES_PER_STAGE, \"\u0421\u0442\u0430\u0434\u0438\u044f 2\")              # \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043e 89 \u0430\u0433\u0435\u043d\u0442\u043e\u0432             print(f\"\\n\ud83e\udd49 \u041f\u0415\u0420\u0415\u0425\u041e\u0414 \u041a \u0421\u0422\u0410\u0414\u0418\u0418 3: \u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0434\u043e {NUM_REGIONS_STAGE3} \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432\")             stage2_agents = copy.deepcopy(self.agents)             self.__init__(NUM_REGIONS_STAGE3, stage2_agents)             self.train_stage(EPISODES_PER_STAGE, \"\u0421\u0442\u0430\u0434\u0438\u044f 3\")              # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0442\u0447\u0435\u0442\u0430             self._create_final_report()              print(\"\\n\ud83c\udf89 ========== \u041e\u0411\u0423\u0427\u0415\u041d\u0418\u0415 \u0423\u0421\u041f\u0415\u0428\u041d\u041e \u0417\u0410\u0412\u0415\u0420\u0428\u0415\u041d\u041e! ==========\")          except Exception as e:             print(f\"\\n\u274c \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438: {e}\")             print(\"\ud83d\udcbe \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u044e \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b...\")             self.save_manager.save_stage_results(                 \"emergency_save\", self, self.performance_monitor,                 self.evolution_logger, self.time_tracker, self.visualizer             )             raise      def _create_final_report(self):         \"\"\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0442\u0447\u0435\u0442\u0430 \u043e \u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f\"\"\"         print(\"\\n\ud83d\udccb \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0442\u0447\u0435\u0442\u0430...\")          final_report_path = os.path.join(self.save_manager.session_dir, 'FINAL_REPORT.txt')          with open(final_report_path, 'w', encoding='utf-8') as f:             f.write(\"\ud83d\ude80 \u0424\u0418\u041d\u0410\u041b\u042c\u041d\u042b\u0419 \u041e\u0422\u0427\u0415\u0422 \u0421\u0418\u0421\u0422\u0415\u041c\u042b DARWIN G\u00d6DEL MADDPG\\n\")             f.write(\"=\"*80 + \"\\n\\n\")              # \u041e\u0431\u0449\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u0435\u0441\u0441\u0438\u0438             session_time = time.time() - self.time_tracker.session_start_time             f.write(f\"\ud83d\udcc5 \u0414\u0430\u0442\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\\n\")             f.write(f\"\u23f1\ufe0f \u041e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438: {self.time_tracker._format_time(session_time)}\\n\")             f.write(f\"\ud83c\udfaf \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0430\u0434\u0438\u0439: {len(self.time_tracker.stage_history)}\\n\")             f.write(f\"\ud83e\uddec \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438: {self.generation}\\n\")             f.write(f\"\ud83e\udd16 \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u0433\u0435\u043d\u0442\u043e\u0432: {len(self.agents)}\\n\\n\")              # \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043f\u043e \u0441\u0442\u0430\u0434\u0438\u044f\u043c             f.write(\"\ud83d\udcca \u0421\u0422\u0410\u0422\u0418\u0421\u0422\u0418\u041a\u0410 \u041f\u041e \u0421\u0422\u0410\u0414\u0418\u042f\u041c:\\n\")             f.write(\"-\"*50 + \"\\n\")             for stage in self.time_tracker.stage_history:                 f.write(f\"\\n\ud83c\udfaf {stage['name']}:\\n\")                 f.write(f\"   \u23f1\ufe0f \u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c: {self.time_tracker._format_time(stage['total_duration'])}\\n\")                 f.write(f\"   \ud83d\udcc8 \u042d\u043f\u0438\u0437\u043e\u0434\u043e\u0432: {stage['episodes_total']}\\n\")                 f.write(f\"   \u26a1 \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c: {stage['total_duration']\/stage['episodes_total']:.1f}\u0441\/\u044d\u043f\u0438\u0437\u043e\u0434\\n\")              # \u041b\u0443\u0447\u0448\u0438\u0435 \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f             f.write(f\"\\n\ud83c\udfc6 \u041b\u0423\u0427\u0428\u0418\u0415 \u0414\u041e\u0421\u0422\u0418\u0416\u0415\u041d\u0418\u042f:\\n\")             f.write(\"-\"*50 + \"\\n\")             if self.performance_monitor.metrics['episode_rewards']:                 best_reward = max(self.performance_monitor.metrics['episode_rewards'])                 avg_reward = np.mean(self.performance_monitor.metrics['episode_rewards'])                 f.write(f\"\ud83c\udfaf \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043d\u0430\u0433\u0440\u0430\u0434\u0430 \u0437\u0430 \u044d\u043f\u0438\u0437\u043e\u0434: {best_reward:.3f}\\n\")                 f.write(f\"\ud83d\udcca \u0421\u0440\u0435\u0434\u043d\u044f\u044f \u043d\u0430\u0433\u0440\u0430\u0434\u0430: {avg_reward:.3f}\\n\")              if self.evolution_logger.evolution_history:                 best_fitness = max([step['best_fitness'] for step in self.evolution_logger.evolution_history])                 f.write(f\"\ud83d\udcaa \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 fitness: {best_fitness:.3f}\\n\")                 f.write(f\"\ud83d\udd00 \u041e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0443\u0442\u0430\u0446\u0438\u0439: {len(self.evolution_logger.mutation_log)}\\n\")                 f.write(f\"\ud83e\udd1d \u041e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u0439: {len(self.evolution_logger.crossover_log)}\\n\")              # \u042d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432             f.write(f\"\\n\u26a1 \u042d\u0424\u0424\u0415\u041a\u0422\u0418\u0412\u041d\u041e\u0421\u0422\u042c \u0420\u0415\u0421\u0423\u0420\u0421\u041e\u0412:\\n\")             f.write(\"-\"*50 + \"\\n\")             f.write(f\"\ud83d\udda5\ufe0f \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e: {'GPU (CUDA)' if torch.cuda.is_available() else 'CPU'}\\n\")             if torch.cuda.is_available():                 f.write(f\"\ud83d\udd27 GPU: {torch.cuda.get_device_name(0)}\\n\")                 f.write(f\"\ud83d\udcbe \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 GPU \u043f\u0430\u043c\u044f\u0442\u0438: \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0434\u043b\u044f T4\\n\")              total_episodes = sum(stage['episodes_total'] for stage in self.time_tracker.stage_history)             if total_episodes &gt; 0:                 episodes_per_hour = total_episodes \/ (session_time \/ 3600)                 f.write(f\"\ud83d\udcc8 \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f: {episodes_per_hour:.1f} \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432\/\u0447\u0430\u0441\\n\")              f.write(f\"\\n\ud83c\udf89 \u041e\u0411\u0423\u0427\u0415\u041d\u0418\u0415 \u0423\u0421\u041f\u0415\u0428\u041d\u041e \u0417\u0410\u0412\u0415\u0420\u0428\u0415\u041d\u041e!\\n\")             f.write(\"\u0412\u0441\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u0430\u043f\u043a\u0430\u0445 \u0441\u0442\u0430\u0434\u0438\u0439.\\n\")          print(f\"\ud83d\udccb \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0447\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d: {final_report_path}\")<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043e\u0446\u0435\u043d\u043a\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e <code>fitness<\/code>  . \u0424\u0438\u0442\u043d\u0435\u0441-\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0433\u0435\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0432 DGM. \u0424\u0438\u0442\u043d\u0435\u0441-\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u00a0\u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442 \u00ab\u0431\u043b\u0438\u0437\u043e\u0441\u0442\u044c\u00bb \u043e\u0441\u043e\u0431\u0438 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u0427\u0435\u043c \u043b\u0443\u0447\u0448\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0444\u0438\u0442\u043d\u0435\u0441-\u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0448\u0430\u043d\u0441\u043e\u0432 \u0443 \u043e\u0441\u043e\u0431\u0438 \u043d\u0430 \u0432\u044b\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0440\u0430\u0437\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u0435.  <\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0433\u0435\u043d\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0442\u0440\u0435\u0445 \u044d\u0442\u0430\u043f\u043e\u0432. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u044e \u0430\u0433\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438\u0445 \u043f\u0440\u0438\u0441\u043f\u043e\u0441\u043e\u0431\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 (\u043d\u0430\u0448\u0443 \u043b\u044e\u0431\u0438\u043c\u0443\u044e \u0444\u0438\u0442\u043d\u0435\u0441\u0441-\u0444\u0443\u043d\u043a\u0446\u0438\u044e)  &#8212; \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0442\u0430\u043a \u0438 \u043b\u0443\u0447\u0448\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u044d\u0442\u0430\u043f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f 7 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u043d\u044f\u043b \u043d\u0435\u043c\u043d\u043e\u0433\u0438\u043c \u0431\u043e\u043b\u0435\u0435 9 \u043c\u0438\u043d\u0443\u0442. \u0421\u0440\u0435\u0434\u043d\u044f\u044f \u043d\u0430\u0433\u0440\u0430\u0434\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u043d\u0430\u0433\u0440\u0430\u0434\u0430=78.587,\u2007\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f (\u043e\u0431\u0449\u0430\u044f) =550.1. \u0418 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 8 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0439 \u0430\u043a\u0442\u043e\u0440\u043e\u0432. \u0425\u043e\u0442\u044f \u0432 \u0446\u0435\u043b\u043e\u043c \u0445\u043e\u0434 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u043b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u043a\u0430\u0441\u0430\u0435\u043c\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438 \u043d\u0430\u0433\u0440\u0430\u0434.<\/p>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/833\/25e\/533\/83325e5339cdd5ae64ce411456f57177.jpg\" alt=\"\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043d\u0430\u0433\u0440\u0430\u0434 \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0438 \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438\" title=\"\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043d\u0430\u0433\u0440\u0430\u0434 \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0438 \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438\" width=\"860\" height=\"689\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/833\/25e\/533\/83325e5339cdd5ae64ce411456f57177.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/833\/25e\/533\/83325e5339cdd5ae64ce411456f57177.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043d\u0430\u0433\u0440\u0430\u0434 \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0438 \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0442\u043c\u0435\u0442\u0438\u043c \u0442\u0430\u043a \u0436\u0435 \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 7 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0432\u044b\u0448\u043b\u0438 \u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c (7 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0430\u043c \u043f\u0440\u043e\u0449\u0435 \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c &#8212; \u0441\u043c. \u0433\u0440\u0430\u0444\u0438\u043a \u00ab\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438\u00bb, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0445 \u044d\u043f\u0438\u0437\u043e\u0434\u043e\u0432 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 9 \u044d\u043f\u0438\u0437\u043e\u0434\u0430, \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043f\u0440\u043e\u0432\u0430\u043b\u043e\u043c, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e, \u0448\u0443\u043c\u043e\u0432\u043e\u0433\u043e \u0444\u0430\u043a\u0442\u043e\u0440\u0430. <\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c84\/3f9\/5cb\/c843f95cb3f3a7ab7ede859f6bf1d82e.jpg\" alt=\"\u0413\u0440\u0430\u0444\u0438\u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a \u0418\u0418-\u0430u\u0435\u043d\u0442\u043e\u0432\" title=\"\u0413\u0440\u0430\u0444\u0438\u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a \u0418\u0418-\u0430u\u0435\u043d\u0442\u043e\u0432\" width=\"818\" height=\"340\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c84\/3f9\/5cb\/c843f95cb3f3a7ab7ede859f6bf1d82e.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c84\/3f9\/5cb\/c843f95cb3f3a7ab7ede859f6bf1d82e.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0413\u0440\u0430\u0444\u0438\u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a \u0418\u0418-\u0430u\u0435\u043d\u0442\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0442\u043c\u0435\u0442\u0438\u043c \u0432 \u0445\u043e\u0434\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u0442\u0430\u043a \u0436\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u043c\u0435\u0436\u0434\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u0438 \u043b\u0443\u0447\u0448\u0435\u0439 \u0444\u0438\u0442\u043d\u0435\u0441\u0441-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u043d\u0435\u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0435 \u043e\u0442 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f \u043a \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044e  \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u043c\u0441\u044f, \u0432\u0441\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0438 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430  \u0441<code> DGM<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c <a href=\"https:\/\/colab.research.google.com\/drive\/1lYJN6P6wzw75_K6FPSRt7AyANO2GhMab?usp=sharing\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>. <\/p>\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6ea\/cc6\/85e\/6eacc685e81e5fa40e515fd2c61007cc.jpg\" alt=\"\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043d\u0430\u0433\u0440\u0430\u0434 \u0438 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438\" title=\"\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043d\u0430\u0433\u0440\u0430\u0434 \u0438 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438\" width=\"858\" height=\"681\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/6ea\/cc6\/85e\/6eacc685e81e5fa40e515fd2c61007cc.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6ea\/cc6\/85e\/6eacc685e81e5fa40e515fd2c61007cc.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043d\u0430\u0433\u0440\u0430\u0434 \u0438 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0430\u0434\u0438\u044f DGM-\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430  \u0434\u043b\u0438\u043b\u0430\u0441\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0435 (\u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a) \u0432\u0440\u0435\u043c\u044f &#8212; \u043f\u043e\u0447\u0442\u0438 \u0447\u0430\u0441. \u0413\u0440\u0430\u0444\u0438\u043a \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u0441\u0445\u043e\u0436\u0443\u044e \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0443, \u0445\u043e\u0442\u044f \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0440\u043e\u0441\u043b\u0430, \u0443\u043f\u0430\u043b\u0430 \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u043d\u0430\u0433\u0440\u0430\u0434\u0430 (35,7), \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u043b\u0430\u0441\u044c \u043a 1000. \u0418 \u043e\u0447\u0435\u043d\u044c \u043b\u044e\u0431\u043e\u043f\u044b\u0442\u043d\u043e\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u0441\u0435\u0431\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438. <\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bb3\/f3e\/90d\/bb3f3e90d972236d13f7deeff0ee0db1.jpg\" alt=\"\u0413\u0440\u0430\u0444\u0438\u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a \u0418\u0418-\u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438\" title=\"\u0413\u0440\u0430\u0444\u0438\u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a \u0418\u0418-\u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438\" width=\"807\" height=\"333\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bb3\/f3e\/90d\/bb3f3e90d972236d13f7deeff0ee0db1.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bb3\/f3e\/90d\/bb3f3e90d972236d13f7deeff0ee0db1.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0413\u0440\u0430\u0444\u0438\u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a \u0418\u0418-\u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441 11 \u0434\u043e 30 \u044d\u043f\u043e\u0445\u0438 \u0430\u0433\u0435\u043d\u0442\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e, \u0430 \u0432\u043e\u0442 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u043c\u044b \u043d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0442\u0430\u043c, \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u043c \u043c\u0438\u0440\u0435, \u0432\u0441\u0435 \u043e\u0431\u043e\u0448\u043b\u043e\u0441\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043a\u0440\u0438\u0437\u0438\u0441\u0430\u043c\u0438, \u0431\u0435\u0437 \u0432\u043e\u0439\u043d \u0438 \u0440\u0435\u0432\u043e\u043b\u044e\u0446\u0438\u0439. \u0412\u043f\u0440\u043e\u0447\u0435\u043c \u0432\u044b\u0432\u043e\u0434 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439: \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u043e\u0434\u043d\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0433\u0438\u0431\u043a\u0443\u044e \u0441\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443, \u043d\u043e \u044d\u0442\u043e \u00ab\u043d\u0435 \u0432\u0435\u0447\u043d\u043e \u0438 \u043d\u0435 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430\u00bb.  \u0427\u0442\u043e \u0431\u044b\u043b\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u043e\u0439 \u0440\u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 (\u0433\u0434\u0435-\u0442\u043e \u0441\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043f\u0430\u043d\u0434\u0435\u043c\u0438\u044f \u0438\u043b\u0438 \u043f\u0440\u0438\u0448\u0435\u043b \u043a \u0432\u043b\u0430\u0441\u0442\u0438 <s>\u0443\u0441\u0430\u0442\u044b\u0439-\u043f\u043e\u043b\u043e\u0441\u0430\u0442\u044b\u0439 \u0438 \u0445\u0432\u043e\u0441\u0442\u0430\u0442\u044b\u0439<\/s> \u0434\u0438\u043a\u0442\u0430\u0442\u043e\u0440, \u043e\u0431\u044a\u044f\u0432\u0438\u0432\u0448\u0438\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u00ab\u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0439\u00bb) &#8212; \u043c\u044b \u043f\u043e\u043a\u0430 \u043d\u0435 \u0437\u043d\u0430\u0435\u043c. <\/p>\n<\/div>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/436\/2af\/519\/4362af519ab69db14316c59c9ba15323.jpg\" alt=\"\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043d\u0430\u0433\u0440\u0430\u0434 \u0438 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u043d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0441\u0442\u0430\u0434\u0438\u0438\" title=\"\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043d\u0430\u0433\u0440\u0430\u0434 \u0438 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u043d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0441\u0442\u0430\u0434\u0438\u0438\" width=\"819\" height=\"679\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/436\/2af\/519\/4362af519ab69db14316c59c9ba15323.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/436\/2af\/519\/4362af519ab69db14316c59c9ba15323.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0438\u043d\u0430\u043c\u0438\u043a\u0430 \u043d\u0430\u0433\u0440\u0430\u0434 \u0438 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u043d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0441\u0442\u0430\u0434\u0438\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0440\u0435\u0442\u044c\u044f \u0441\u0442\u0430\u0434\u0438\u044f, \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u0448\u0435\u0441\u0442\u0438 \u0441 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u043e\u0439 \u0447\u0430\u0441\u043e\u0432,  \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0441\u0430\u043c\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439. \u0412\u043e \u043f\u0435\u0440\u0432\u044b\u0445, \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u043d\u0430\u0433\u0440\u0430\u0434\u0430 \u0441\u0442\u0430\u043b\u0430 \u0435\u0449\u0435 \u043d\u0438\u0436\u0435, \u043a\u0430\u043a \u0438 \u043e\u0431\u0449\u0435\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f, \u0441\u0440\u0435\u0434\u043d\u044f\u044f \u0444\u0438\u0442\u043d\u0435\u0441\u0441-\u0444\u0443\u043d\u043a\u0446\u0438\u044f  \u0441\u0442\u0430\u043b\u0430 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 (\u043f\u0440\u0438 \u0442\u043e\u043c \u0447\u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0434\u0430\u0436\u0435 \u0441\u0442\u0430\u043b\u0438 \u0432\u044b\u0448\u0435). \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u043f\u0443\u043b\u044f\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0430 \u0441\u0442\u0430\u043b \u0443\u0445\u0443\u0434\u0448\u0430\u0442\u044c\u0441\u044f. \u0422\u0430\u043a \u0436\u0435 \u0438\u043d\u0434\u0435\u043a\u0441 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0431\u044b\u043b \u0445\u0443\u0436\u0435, \u0447\u0435\u043c \u043d\u0430 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0434\u0438\u044f\u0445. \u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0444\u0438\u0442\u043d\u0435\u0441\u0441-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e, \u0432 \u0446\u0435\u043b\u043e\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438 \u0431\u044b\u043b\u0430 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439. <\/p>\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8e7\/31f\/34f\/8e731f34f9774575c5722500cfe063f4.jpg\" alt=\"\u0413\u0440\u0430\u0444\u0438\u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a \u0418\u0418-\u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 3 \u0441\u0442\u0430\u0434\u0438\u0438\" title=\"\u0413\u0440\u0430\u0444\u0438\u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a \u0418\u0418-\u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 3 \u0441\u0442\u0430\u0434\u0438\u0438\" width=\"874\" height=\"337\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/8e7\/31f\/34f\/8e731f34f9774575c5722500cfe063f4.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8e7\/31f\/34f\/8e731f34f9774575c5722500cfe063f4.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0413\u0440\u0430\u0444\u0438\u043a \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a \u0418\u0418-\u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 3 \u0441\u0442\u0430\u0434\u0438\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438 \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0418\u0418-\u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0445\u043e\u0442\u044c \u0438 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043d\u0430\u0440\u0430\u0441\u0442\u0430\u043b, \u043d\u043e \u043d\u0435 \u0434\u043e\u0441\u0442\u0438\u0433 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0434\u0438\u0439. \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u044d\u043f\u043e\u0445 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438\u0437 89 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0430\u0433\u0435\u043d\u0442\u043e\u0432.  \u0412\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 &#8212; \u0441 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438\u043b\u0438 \u00ab\u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0430\u00bb \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u0443 \u043d\u0430\u0441 \u0441\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0444\u0435\u043e\u0434\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0437\u0434\u0440\u043e\u0431\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u044c, \u0432 \u0445\u043e\u0434\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0418\u0418-\u0430\u0433\u0435\u043d\u0442\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u0432\u044b\u0441\u043e\u043a\u0443\u044e \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0432 \u0441\u0432\u043e\u0435\u043c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0438, \u0438 \u0435\u0441\u043b\u0438 \u0431\u044b \u0440\u0435\u0447\u044c \u0448\u043b\u0430 \u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043e\u043d\u0438 \u0441\u0442\u0430\u043b\u0438 \u0431\u044b \u044f\u0434\u0440\u0430\u043c\u0438 \u0441\u0435\u0442\u0438 \u0438 \u043d\u0430\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u043d\u043e\u0432\u043e\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044f \u0441\u0432\u043e\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438 \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432\u0441\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c.  <\/p>\n<\/div>\n<div class=\"floating-image\">\n<p><strong>\u0412\u042b\u0412\u041e\u0414\u042b<\/strong><\/p>\n<\/div>\n<p>\u041b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u00ab\u0443\u0440\u0435\u0437\u0430\u043d\u043d\u043e\u043c\u00bb \u0432\u0438\u0434\u0435 <code>DGM <\/code>\u043d\u0435 \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0441 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0418\u0418-\u0430\u0433\u0435\u043d\u0442\u043e\u0432 \u0438 \u0435\u043c\u0443 \u043d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u0439  \u0441\u0442\u0430\u0434\u0438\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043f\u043e\u0445 \u0434\u043b\u044f \u00ab\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435\u00bb \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0432\u0441\u0435\u0445 \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432.  <\/p>\n<p>\u042d\u0442\u043e \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e \u0438 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 &#8212; \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 00-\u044b\u0445 \u0433\u043e\u0434\u043e\u0432 \u0432 \u0420\u043e\u0441\u0441\u0438\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0440\u043e\u0434\u0438\u043b\u0430 \u043d\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0441\u0442\u0438\u0442\u0443\u0442 \u0444\u0435\u0434\u0435\u0440\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0433\u043e\u0432. \u0418 \u0441\u0434\u0435\u043b\u0430\u043b\u0430 \u044d\u0442\u043e \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u0438\u0437 \u043f\u0440\u0438\u0445\u043e\u0442\u0438, \u0430 \u0432 \u0446\u0435\u043b\u044f\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0430 \u043c\u0430\u043a\u0440\u043e\u0443\u0440\u043e\u0432\u043d\u0435 \u0438 \u043e\u043f\u044f\u0442\u044c \u0436\u0435 \u00ab\u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435\u00bb \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u0430\u043a\u043e\u043d\u043e\u0434\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u0444\u0435\u0434\u0435\u0440\u0430\u043b\u044c\u043d\u043e\u043c\u0443. \u041d\u0430\u043b\u0430\u0434\u0438\u0442\u044c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u043a\u0442\u043e\u0440\u043e\u0432 &#8212; \u043f\u0440\u043e\u0449\u0435 \u0438 \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u0443\u0442\u0435\u0439 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f <code>MADDPG <\/code>&#8212; \u044d\u0442\u043e \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0438 \u0430\u0433\u0435\u043d\u0442\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043d\u0435 \u0432\u0435\u0441\u044c \u043e\u0431\u044a\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438 \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u044f \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u00ab\u043f\u0440\u043e\u043a\u043b\u044f\u0442\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438\u00bb.<\/p>\n<p>\u0414\u0440\u0443\u0433\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0436\u0435 <code>DGM <\/code>&#8212; \u044d\u0442\u043e \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u043c\u0443\u0442\u0430\u0446\u0438\u0438, \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0430\u043a\u0442\u043e\u0440\u0430, \u043d\u043e \u0438 \u043a\u0440\u0438\u0442\u0438\u043a\u0430 \u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0430\u0433\u0435\u043d\u0442\u0430\u043c\u0438, \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430. \u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 <code>PER<\/code>, \u043d\u043e \u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u0440\u0435\u0442\u0440\u043e\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430 (<code>PER<\/code>), \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u043c \u043e\u043f\u044b\u0442\u0430, \u043e\u043f\u044b\u0442\u043e\u043c \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u043e\u0439 (\u0433\u0438\u0431\u0440\u0438\u0434\u043e\u043c <code>PER \u0438 PER<\/code>),  \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u043e\u043f\u044b\u0442\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u044f (<code>DBER<\/code>) \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u043c\u0438. <\/p>\n<p>\u0422\u0440\u0435\u0442\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u00ab\u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u043c\u00bb <code>DGM <\/code>   \u0441\u0432\u044f\u0437\u0430\u043d \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043f\u043e \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044e \u043a \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430 \u0446\u0438\u043a\u043b\u0430 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0418\u0418. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u044d\u0442\u043e \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u043d\u0442\u0443\u0440 &#8212;  \u0434\u043e\u043e\u0431\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u043d\u0430 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430\u0445 \u0438 \u043c\u043e\u0434\u0435\u043b\u044f\u0445 \u044f\u0437\u044b\u043a\u043e\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c, \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u044e\u0449\u0430\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043a\u043e\u043d\u0442\u0443\u0440 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u043c\u043f\u0442\u043e\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043e\u0446\u0435\u043d\u043e\u043a. \u0412-\u0442\u0440\u0435\u0442\u044c\u0438\u0445 &#8212; \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0449\u0438\u043a, \u044f\u0437\u044b\u043a\u043e\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c, \u043f\u0438\u0448\u0443\u0449\u0430\u044f \u043a\u043e\u0434 \u043f\u043e \u043f\u0440\u043e\u043c\u043f\u0442\u0430\u043c.  \u0412 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0445, \u0441\u0430\u043c\u0430 \u043c\u043e\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430 \u043f\u043e\u0434 MADDPG. \u041e\u0446\u0435\u043d\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u043d\u0442\u0443\u0440, \u043a\u043e\u043d\u0442\u0443\u0440 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u043c\u043f\u0442\u043e\u0432, \u043c\u043e\u0434\u0435\u043b\u044c-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u0441\u0440\u0435\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u0434\u043e\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c\u0441\u044f: \u044f\u0437\u044b\u043a\u043e\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0442\u044e\u043d\u0438\u0442\u0441\u044f \u043f\u043e\u0434 \u0438\u0442\u043e\u0433\u0430\u043c  \u043d\u043e\u0432\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432, \u043c\u043e\u0434\u0435\u043b\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u043c\u043f\u0442\u043e\u0432 \u0438 \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u043e\u0434\u0438\u043d\u0433\u0430 \u0442\u0430\u043a \u0436\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. \u041d\u0443 \u0430 \u043f\u0440\u043e \u0441\u0430\u043c\u0443 \u0441\u0440\u0435\u0434\u0443 \u0441 MADDPG &#8212; \u043c\u044b \u043e\u0442\u043c\u0435\u0442\u0438\u043c, \u0447\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0432\u0441\u0435 \u0435\u0435 \u0433\u0438\u043f\u0435\u0440\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e \u0430\u0433\u0435\u043d\u0442\u043e\u0432, \u0442\u0430\u043a \u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u043f\u044b\u0442\u0430.  \u0418 \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u044b\u0439 MADDPG, \u043d\u043e \u0438 \u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0443\u044e \u0434\u043e\u0447\u0435\u0440\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430. <\/p>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f4f\/e57\/308\/f4fe57308ac04694ac8ea99aeea56a98.jpg\" alt=\"\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043b\u0438 \u0418\u0418 \u043f\u0435\u0441\u043d\u044f \u0433\u0440\u0443\u043f\u043f\u044b \u00ab\u0422\u0430\u0442\u0443\u00bb \u00ab\u041d\u0430\u0441 \u043d\u0435 \u0434\u043e\u0433\u043e\u043d\u044f\u0442\u00bb? \" title=\"\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043b\u0438 \u0418\u0418 \u043f\u0435\u0441\u043d\u044f \u0433\u0440\u0443\u043f\u043f\u044b \u00ab\u0422\u0430\u0442\u0443\u00bb \u00ab\u041d\u0430\u0441 \u043d\u0435 \u0434\u043e\u0433\u043e\u043d\u044f\u0442\u00bb? \" width=\"1024\" height=\"1024\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f4f\/e57\/308\/f4fe57308ac04694ac8ea99aeea56a98.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f4f\/e57\/308\/f4fe57308ac04694ac8ea99aeea56a98.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u043b\u0438 \u0418\u0418 \u043f\u0435\u0441\u043d\u044f \u0433\u0440\u0443\u043f\u043f\u044b \u00ab\u0422\u0430\u0442\u0443\u00bb \u00ab\u041d\u0430\u0441 \u043d\u0435 \u0434\u043e\u0433\u043e\u043d\u044f\u0442\u00bb? <\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0443\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u043c \u00ab\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043d\u044b\u043c\u00bb \u0418\u0418, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u043c \u0432\u044b\u043b\u0435\u0437\u0442\u0438 \u0438\u0437 \u0434\u0435\u0442\u0441\u043a\u043e\u0439  \u043a\u043e\u043b\u044f\u0441\u043a\u0438 \u0438 \u043e\u0431\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0435 \u0441\u0432\u043e\u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u0435\u0439! <\/p>\n<p><em>\u0410\u0432\u0442\u043e\u0440 \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u043a\u0443\u0440\u0441\u0430 <\/em><a href=\"https:\/\/otus.ru\/lessons\/reinforcement-learning-cours\/\" rel=\"noopener noreferrer nofollow\"><em>Reinforcement Learning<\/em><\/a><em> \u043e\u0442 <\/em><a href=\"https:\/\/habr.com\/ru\/companies\/otus\/profile\/\" rel=\"noopener noreferrer nofollow\"><em>OTUS <\/em>  <\/a>\u0437\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u00ab\u043f\u043e\u0434\u0430\u043f\u0433\u0440\u0435\u0439\u0434\u0438\u0442\u044c\u00bb \u0441\u0432\u043e\u0438 \u043a\u043e\u043c\u043f\u0435\u0442\u0435\u043d\u0446\u0438\u0438 \u0432 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u0445 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0444\u0435\u0440\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438  \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 ML \u0438 Deep RL. <\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><\/p>\n<div class=\"tm-article-poll-container\"><!--[--><\/p>\n<div class=\"tm-article-poll tm-article-poll_variant-bordered\">\n<div class=\"tm-notice tm-notice_positive tm-article-poll__notice\"><!----><\/p>\n<div class=\"tm-notice__inner\"><!----><\/p>\n<div class=\"tm-notice__content\" data-test-id=\"notice-content\"><!--[--><span>\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a rel=\"nofollow\" href=\"\/kek\/v1\/auth\/habrahabr\/?back=\/ru\/articles\/921774\/&#038;hl=ru\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/span><!--]--><\/div>\n<\/div>\n<\/div>\n<p><!--[--><\/p>\n<div class=\"tm-article-poll__header\">\u0427\u0442\u043e \u0438\u043b\u0438 \u043a\u0442\u043e, \u043d\u0430 \u0432\u0430\u0448 \u0432\u0437\u0433\u043b\u044f\u0434, \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u0435\u0435 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0438 \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u044f\u0445?<\/div>\n<div class=\"tm-article-poll__answers\"><!--[--><\/p>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">20% <\/span><span class=\"tm-article-poll__answer-label\">\u0422\u043e\u043b\u044c\u043a\u043e \u043b\u044e\u0434\u0438! \u0421 \u043d\u0438\u0445 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c.<\/span><span class=\"tm-article-poll__answer-votes\">1<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 20%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">20% <\/span><span class=\"tm-article-poll__answer-label\">\u0422\u043e\u043b\u044c\u043a\u043e \u0440\u043e\u0431\u043e\u0442\u044b \u0438 \u0441\u0430\u043c\u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0418\u0418! \u041e\u043d\u0438 \u043d\u0435 \u0431\u0435\u0440\u0443\u0442 \u0432\u0437\u044f\u0442\u043e\u043a.<\/span><span class=\"tm-article-poll__answer-votes\">1<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 20%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">20% <\/span><span class=\"tm-article-poll__answer-label\">\u0413\u0438\u0431\u0440\u0438\u0434\u043d\u044b\u0435 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e-\u043c\u0430\u0448\u0438\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u041d\u0430\u0448\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0435, \u0441\u043a\u0440\u0435\u043f\u043d\u044b\u0435 \u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u0434\u0443\u0445\u043e\u0432\u043d\u044b\u0435 \u043a\u0438\u0431\u043e\u0440\u0433\u0438.<\/span><span class=\"tm-article-poll__answer-votes\">1<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 20%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent tm-article-poll__answer-percent_winning\">40% <\/span><span class=\"tm-article-poll__answer-label\">\u041f\u0440\u043e\u0447\u0430\u044f \u044d\u043a\u0437\u043e\u0442\u0438\u043a\u0430 (\u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0432\u0430\u044f \u0434\u0435\u043c\u043e\u043a\u0440\u0430\u0442\u0438\u044f, \u0440\u043e\u0435\u0432\u043e\u0439 \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 \u0438 \u0442.\u043f.)<\/span><span class=\"tm-article-poll__answer-votes\">2<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress tm-article-poll__answer-progress_winning\" style=\"width: 40%\"><\/div>\n<\/div>\n<\/div>\n<p><!--]--><\/div>\n<div class=\"tm-article-poll__stats\"> \u041f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b\u0438 5 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.   \u0412\u043e\u0437\u0434\u0435\u0440\u0436\u0430\u043b\u0441\u044f 1 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c. <\/div>\n<p><!--]--><\/div>\n<p><!--]--><\/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\/articles\/921774\/\"> https:\/\/habr.com\/ru\/articles\/921774\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p><em>\u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0438 \u0440\u0430\u0441\u0442\u0438\u043c \u00ab\u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0433\u043e \u0433\u0443\u0431\u0435\u0440\u0430\u00bb &#8212; \u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u043d\u0442\u0430 \u043f\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438. \u0420\u0435\u0448\u0430\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0438 \u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0434\u043b\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0433\u043e \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u043e\u0441\u0442\u0430 \u0432 89 \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e\u00a0\u00a0 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u0438 \u043e\u0431\u043c\u0435\u043d\u0438\u0432\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c <\/em><code><em>\u0418\u0418-\u0430\u0433\u0435\u043d\u0442\u043e\u0432<\/em><\/code><em>. \u00a0\u00a0\u041c\u0443\u043b\u044c\u0442\u0438\u0430\u0433\u0435\u043d\u0442\u043d\u043e\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u0443\u0442\u0430\u0446\u0438\u0439, \u0441\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438, \u00a0<\/em><a href=\"https:\/\/habr.com\/ru\/companies\/otus\/articles\/508736\/\" rel=\"noopener noreferrer nofollow\"><em>Multi-Agent Deep Deterministic Policy Gradient<\/em><\/a><em> \u0438 <\/em><a href=\"https:\/\/habr.com\/ru\/articles\/920484\/\" rel=\"noopener noreferrer nofollow\"><em>Darwin G\u00f6del Machine<\/em><\/a><em>. \u0410\u0445\u0442\u0443\u043d\u0433, \u0434\u0430\u043b\u044c\u0448\u0435 &#8212;  \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u0430\u0431\u0443\u043a\u0432 \u0438 \u043a\u043e\u0434\u0430!<\/em><\/p>\n<div class=\"floating-image\">\n<figure class=\"float full-width\">\n<div><figcaption>\u041f\u043e\u043a\u0430 \u0418\u0418 \u0443 \u043d\u0430\u0441 \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u043a\u043e\u043b\u0435\u0441\u0430\u0445 \u0438 \u0432 \u043a\u043e\u043b\u044f\u0441\u043a\u0435<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b<\/strong><\/p>\n<p>\u0415\u0449\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/848090\/\" rel=\"noopener noreferrer nofollow\">\u0418\u0431\u043d \u0425\u0430\u043b\u0434\u0443\u043d<\/a>, \u0430 \u0432\u0441\u043b\u0435\u0434 \u0437\u0430 \u043d\u0438\u043c <a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%9F%D0%B0%D1%80%D0%B5%D1%82%D0%BE,_%D0%92%D0%B8%D0%BB%D1%8C%D1%84%D1%80%D0%B5%D0%B4%D0%BE\" rel=\"noopener noreferrer nofollow\">\u0412. \u041f\u0430\u0440\u0435\u0442\u043e<\/a>, <a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%9C%D0%BE%D1%81%D0%BA%D0%B0,_%D0%93%D0%B0%D1%8D%D1%82%D0%B0%D0%BD%D0%BE\" rel=\"noopener noreferrer nofollow\">\u0413.\u041c\u043e\u0441\u043a\u0430<\/a> \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u044b \u043f\u043e \u0442\u0435\u043e\u0440\u0438\u0438 \u044d\u043b\u0438\u0442 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438, \u0447\u0442\u043e \u00ab\u043a\u043e\u0436\u0430\u043d\u044b\u0435 \u043c\u0435\u0448\u043a\u0438\u00bb \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u043b\u0443\u0447\u0448\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438. \u041c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0438\u0437\u044b\u0441\u043a\u0430\u043d\u0438\u044f\u0445 \u043f\u043e <a href=\"https:\/\/elementy.ru\/nauchno-populyarnaya_biblioteka\/430806\/Dolgosrochnye_kolebaniya_chislennosti_naseleniya_v_istoricheskikh_obshchestvakh\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e-\u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0435\u043e\u0440\u0438\u0438<\/a>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u0445 \u043a\u0440\u0438\u0437\u0438\u0441\u043e\u0432, \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444 \u0438 \u0440\u0435\u0432\u043e\u043b\u044e\u0446\u0438\u0439 <a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%93%D0%BE%D0%BB%D0%B4%D1%81%D1%82%D0%BE%D1%83%D0%BD,_%D0%94%D0%B6%D0%B5%D0%BA\" rel=\"noopener noreferrer nofollow\">\u0414\u0436\u0435\u043a\u0430 \u0413\u043e\u043b\u0434\u0441\u0442\u043e\u0443\u043d\u0430<\/a> \u0438 <a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%A2%D1%83%D1%80%D1%87%D0%B8%D0%BD,_%D0%9F%D1%91%D1%82%D1%80_%D0%92%D0%B0%D0%BB%D0%B5%D0%BD%D1%82%D0%B8%D0%BD%D0%BE%D0%B2%D0%B8%D1%87\" rel=\"noopener noreferrer nofollow\">\u041f\u0438\u0442\u0435\u0440\u0430 \u0422\u0443\u0440\u0447\u0438\u043d\u0430<\/a> \u00ab\u044d\u043b\u0438\u0442\u043d\u044b\u0435 \u043a\u043e\u0436\u0430\u043d\u044b\u0435 \u043c\u0435\u0448\u043a\u0438\u00bb, \u00a0\u0441\u043a\u043b\u043e\u043d\u043d\u044b \u043a \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0443, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043a \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0439 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u0438 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c, \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u043e\u0439 \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0438, <a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%94%D0%B5%D0%BC%D0%BE%D0%BD%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D0%B5_%D0%BF%D0%BE%D1%82%D1%80%D0%B5%D0%B1%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0441\u0442\u0438\u0436\u043d\u043e\u043c\u0443 \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u044e<\/a> \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438 \u00ab<a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%9E%D1%82%D1%80%D0%B8%D1%86%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9_%D0%BE%D1%82%D0%B1%D0%BE%D1%80_(%D0%BF%D0%BE%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B0)\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u043a\u0430\u0434\u0440\u043e\u0432\u043e\u043c\u0443 \u043e\u0442\u0431\u043e\u0440\u0443<\/a>\u00bb \u043f\u0440\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043b\u0438\u0444\u0442\u0430\u0445 \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438. <\/p>\n<p>\u041f\u043e\u043d\u0435\u0432\u043e\u043b\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0438\u0434\u0435\u044f, \u0447\u0442\u043e \u00ab\u043a\u043e\u0433\u0434\u0430 \u0418\u0418 \u00a0\u043f\u0440\u0438\u0434\u0435\u0442 \u2013 \u00a0\u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043d\u0430\u0432\u0435\u0434\u0435\u0442\u00bb. \u0418 \u0432 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0437\u0430\u0447\u0435\u043c \u0418\u0418 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u0442\u0432\u043e, \u0435\u0441\u043b\u0438 \u043b\u044e\u0434\u0438 \u0438 \u0442\u0430\u043a \u043a \u044d\u0442\u043e\u043c\u0443 \u0441\u043a\u043b\u043e\u043d\u043d\u044b? \u0410 \u0432\u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u044d\u043c\u043e\u0446\u0438\u0438, \u0445\u0430\u043e\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 (\u0430\u0441\u0430\u0431\u0438\u044e, \u0441\u043e\u043b\u0438\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u044c, \u043a\u0440\u0435\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c, \u0441\u043a\u043b\u043e\u043d\u043d\u043e\u0441\u0442\u044c \u043a \u043a\u0443\u043c\u043e\u0432\u0441\u0442\u0432\u0443 \u0438 \u043a\u043e\u0440\u0440\u0443\u043f\u0446\u0438\u0438 &#8230;..) \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f, \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432 \u2013 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043f\u043e\u043b\u043d\u0435 \u0440\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u0438 \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c. <\/p>\n<p>\u0418\u0442\u0430\u043a, \u0432\u043f\u0435\u0440\u0435\u0434\u0438 \u00ab\u0441\u043b\u0438\u0448\u043a\u0430\u043c\u043c\u043d\u043e\u0433\u043e\u0431\u0443\u043a\u0444\u0444\u00bb, \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u043a\u043e\u043d\u0442\u0443\u0440\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u00ab\u0447\u0435\u043b\u043e\u0432\u0435\u0447\u043d\u044b\u0445\u00bb \u0438 \u0434\u0430\u0436\u0435 \u00ab\u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u0445\u00bb \u0437\u0430\u0434\u0430\u0447: <\/p>\n<p>&#8212;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043a\u0430\u043a \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0438?<\/p>\n<p>&#8212;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043a\u0430\u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0441 \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u043e\u043c \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e-\u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438?<\/p>\n<p>&#8212;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043a\u0430\u043a \u0440\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043b\u044f \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0433\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0440\u043e\u0441\u0442\u0430? <\/p>\n<p>&#8212;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u043a\u0430\u043a \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0430\u043a\u0442\u043e\u0440\u0430\u043c\u0438? <\/p>\n<\/div>\n<p><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0438\u043b\u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0430\u0437\u0438\u043c\u043e\u0432\u0441\u043a\u043e\u0439 \u00ab\u0433\u0430\u0440\u0438\u0441\u0435\u043b\u0434\u043e\u0432\u0449\u0438\u043d\u044b\u00bb<\/strong><\/p>\n<p>\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438 \u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0438\u043c\u0435\u0435\u0442 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0435\u0434\u0435\u043b\u044b: \u0447\u0430\u0441\u0442\u044c \u0438\u0437 \u043d\u0438\u0445 \u0437\u0430\u0434\u0430\u043d\u0430 \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0432\u0448\u0435\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439, \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0446\u0438\u043a\u043b\u0430\u043c\u0438 \u0438 \u0432\u043e\u043b\u043d\u0430\u043c\u0438, \u0440\u0435\u0441\u0443\u0440\u0441\u043d\u044b\u043c\u0438 \u0438 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0435\u0440\u0446\u0438\u0435\u0439 \u0438 \u00ab\u043c\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0441\u0442\u044c\u044e\u00bb \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u043a\u043e\u043d\u0441\u0435\u0440\u0432\u0430\u0442\u0438\u0437\u043c\u043e\u043c \u0438\u043d\u0441\u0442\u0438\u0442\u0443\u0442\u043e\u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.\u00a0\u00a0 <\/p>\n<p>\u0423\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u0434\u0435\u043e\u043b\u043e\u0433\u0438\u0438,  \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0432\u0435\u0441\u0442\u043a\u0438\u00a0 \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u0431\u044b\u0442\u044c \u0432 \u043e\u0447\u0435\u043d\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u0445 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430\u0445. \u041e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u043e\u043b\u0438\u0442\u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b, \u0440\u0430\u0432\u043d\u043e \u043a\u0430\u043a \u0438 \u043f\u043e\u043f\u0443\u043b\u0438\u0441\u0442\u0441\u043a\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0432 \u0434\u043e\u043b\u0433\u043e\u0441\u0440\u043e\u043a \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u0440\u0438\u0437\u0432\u0430\u043d\u044b \u043a\u0443\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u0442\u0440\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u0438 \u0440\u0435\u0448\u0430\u0442\u044c \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0440\u043e\u0447\u043d\u044b\u0435 \u0442\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438. <\/p>\n<p><a href=\"https:\/\/elementy.ru\/nauchno-populyarnaya_biblioteka\/430806\/Dolgosrochnye_kolebaniya_chislennosti_naseleniya_v_istoricheskikh_obshchestvakh\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u043b\u0433\u043e\u0441\u0440\u043e\u0447\u043d\u044b\u0435 \u00a0\u0442\u0440\u0435\u043d\u0434\u044b<\/a>, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0435 \u043c\u0430\u0442\u0440\u0438\u043c\u043e\u043d\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043c\u043e\u043b\u043e\u0434\u0435\u0436\u0438 \u0438 \u0437\u0440\u0435\u043b\u043e\u0433\u043e \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f, \u043f\u043e\u0434\u0447\u0438\u043d\u044f\u044e\u0442\u0441\u044f <a href=\"https:\/\/www.rbc.ru\/society\/18\/06\/2025\/6852bb1b9a794708357df708\" rel=\"noopener noreferrer nofollow\">\u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c<\/a>. \u0422\u0430\u043a, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0442\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0430 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0438 \u0441 1,4 \u0434\u043e 1,5. \u041d\u043e \u0434\u043e\u0432\u0435\u0441\u0442\u0438 \u0435\u0433\u043e \u0434\u043e 2,2 \u0438\u043b\u0438 2,5 \u0442\u0435\u043c\u0438 \u0436\u0435 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u2013 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e. \u042d\u0442\u043e, \u0431\u0430\u0442\u0435\u043d\u044c\u043a\u0430, \u043d\u0435 \u0433\u0438\u043f\u0435\u0440\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b ML-\u043c\u043e\u0434\u0435\u043b\u044c\u043a\u0430\u043c \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>optuna.<\/code><\/p>\n<div class=\"floating-image\">\n<figure class=\"float bordered full-width\">\n<div><figcaption>\u0414\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u044f \u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b  &#8212;   \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430, \u0441\u0433\u0443\u0431\u0438\u0432\u0448\u0430\u044f \u043d\u0435 \u043e\u0434\u043d\u0443 \u0438\u043c\u043f\u0435\u0440\u0438\u044e<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u0441\u043c\u0435\u043d\u044b \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0435. \u0410 \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u2013 \u044d\u0442\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043c\u043f\u044b\u00a0 \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0442\u0435\u0439. \u0417\u0430\u0434\u0430\u0447\u0430\u00a0 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0435\u0448\u0430\u0435\u043c\u043e\u0439: \u043f\u0443\u0442\u0435\u043c \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0430, \u0430\u0440\u0445\u0430\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u043d\u0430 \u0434\u043e\u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u0442\u0430\u043f \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f, \u043d\u043e \u043a \u044d\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043a\u0430\u043a \u0443\u0436\u0435 \u0431\u044b\u0432\u0430\u043b\u043e \u043f\u043e\u0441\u043b\u0435 <a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%9A%D0%B0%D1%82%D0%B0%D1%81%D1%82%D1%80%D0%BE%D1%84%D0%B0_%D0%B1%D1%80%D0%BE%D0%BD%D0%B7%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE_%D0%B2%D0%B5%D0%BA%D0%B0\" rel=\"noopener noreferrer nofollow\">\u041a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u044b \u0431\u0440\u043e\u043d\u0437\u043e\u0432\u043e\u0433\u043e \u0432\u0435\u043a\u0430<\/a>, \u043a\u0440\u0443\u0448\u0435\u043d\u0438\u044f <a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%9F%D0%B0%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%97%D0%B0%D0%BF%D0%B0%D0%B4%D0%BD%D0%BE%D0%B9_%D0%A0%D0%B8%D0%BC%D1%81%D0%BA%D0%BE%D0%B9_%D0%B8%D0%BC%D0%BF%D0%B5%D1%80%D0%B8%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0417\u0430\u043f\u0430\u0434\u043d\u043e\u0439 \u0420\u0438\u043c\u0441\u043a\u043e\u0439 \u0438\u043c\u043f\u0435\u0440\u0438\u0438<\/a> \u0438\u043b\u0438 \u0438\u043d\u044b\u0445 \u00ab\u0442\u0435\u043c\u043d\u044b\u0445 \u0432\u0435\u043a\u043e\u0432\u00bb \u0432 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u0442\u0432\u0430. <\/p>\n<\/div>\n<p>\u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u2013 \u044d\u0442\u043e \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0430\u043f\u0438\u0442\u0430\u043b, \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u043e: \u0440\u0435\u0431\u0435\u043d\u043a\u0430 \u043d\u0443\u0436\u043d\u043e \u043e\u0434\u0435\u0442\u044c-\u043e\u0431\u0443\u0442\u044c, \u0432\u043e\u0441\u043f\u0438\u0442\u0430\u0442\u044c, \u043e\u0431\u0443\u0447\u0438\u0442\u044c \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u0435 \u0438\u043c \u0443\u0440\u043e\u0432\u043d\u044f \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439, \u0430 \u0434\u043b\u044f \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0430 \u2013 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u0434\u0443\u0445\u043e\u0432\u043d\u043e-\u043d\u0440\u0430\u0432\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c, \u0441\u043e\u0446\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0438\u0442\u0443\u0442\u044b \u0438 \u0432\u043e\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0432 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u044e. \u0418\u043d\u0430\u0447\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0430\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0434\u043e\u0440\u043e\u0436\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u0443\u0433\u0440\u0438\u0441\u0442\u043e\u0439. <\/p>\n<details class=\"spoiler\">\n<summary>\u041e \u043c\u043e\u043b\u043e\u0434\u0435\u0436\u043d\u044b\u0445 \u0431\u0443\u0433\u0440\u0430\u0445, \u0440\u0435\u0432\u043e\u043b\u044e\u0446\u0438\u044f\u0445 \u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0412 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u044d\u0442\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u00ab<a href=\"https:\/\/cyberleninka.ru\/article\/n\/molodezhnye-bugry-kak-faktor-sotsialno-politicheskoy-nestabilnosti\" rel=\"noopener noreferrer nofollow\">\u043c\u043e\u043b\u043e\u0434\u0435\u0436\u043d\u044b\u0439 \u0431\u0443\u0433\u043e\u0440<\/a>\u00bb \u0438 100% \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u00ab<a href=\"https:\/\/www.hse.ru\/news\/126789812.html\" rel=\"noopener noreferrer nofollow\">\u0430\u0440\u0430\u0431\u0441\u043a\u043e\u0439 \u0432\u0435\u0441\u043d\u044b\u00bb<\/a> \u0438\u043b\u0438 \u0438\u043d\u043e\u0439 \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u044b <a href=\"https:\/\/www.fnisc.ru\/index.php?page_id=2624&amp;jn=socis&amp;jn=socis&amp;jid=5592\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u043d\u043e\u0439<\/a> \u043f\u0440\u0438\u0440\u043e\u0434\u044b. \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0431\u0435\u0441\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0435\u0439 \u2013 <a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%92%D0%B5%D0%BB%D0%B8%D0%BA%D0%BE%D0%B5_%D0%BF%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%80%D0%BE%D0%B4%D0%BE%D0%B2\" rel=\"noopener noreferrer nofollow\">\u0412\u0435\u043b\u0438\u043a\u043e\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u0440\u043e\u0434\u043e\u0432<\/a> \u043a\u0430\u043a \u00a0\u0438 \u0441\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0435\u0441\u044f \u0437\u0430 \u043f\u043e\u043b\u0442\u043e\u0440\u044b \u0442\u044b\u0441\u044f\u0447\u0438 \u043b\u0435\u0442 \u0440\u0430\u043d\u0435\u0435 \u00ab<a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%9D%D0%B0%D1%80%D0%BE%D0%B4%D1%8B_%D0%BC%D0%BE%D1%80%D1%8F\" rel=\"noopener noreferrer nofollow\">\u0412\u0442\u043e\u0440\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u0440\u043e\u0434\u043e\u0432 \u043c\u043e\u0440\u044f<\/a>\u00bb \u043f\u043e\u0433\u0443\u0431\u0438\u043b\u0438 \u043d\u0435 \u043e\u0434\u043d\u0443 \u0438\u043c\u043f\u0435\u0440\u0438\u044e \u0438 \u0446\u0438\u0432\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0440\u0435\u0432\u043d\u043e\u0441\u0442\u0438. \u041e\u0441\u043b\u0430\u0431\u0435\u0432\u0448\u0438\u0435 \u0432\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435 \u043a\u0440\u0438\u0437\u0438\u0441\u0430 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0438\u0442\u0443\u0442\u044b  \u0440\u0430\u043d\u043d\u0435\u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0431\u0449\u0435\u0441\u0442\u0432 \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0438 \u043f\u0435\u0440\u0435\u0432\u0430\u0440\u0438\u0442\u044c \u0438 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0445 \u0447\u043b\u0435\u043d\u043e\u0432 \u0441\u043e\u0446\u0438\u0443\u043c\u0430, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u00ab\u0432\u0442\u043e\u0440\u0433\u0430\u0432\u0448\u0438\u0445\u0441\u044f\u00bb \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u043b\u044f\u0432\u0448\u0438\u0445\u0441\u044f \u0431\u044b\u043b\u043e \u0432 \u0440\u0430\u0437\u044b \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043e\u0441\u0435\u0434\u043b\u043e\u0433\u043e \u043a\u043e\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f. <\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0430, \u0446\u0435\u043d\u0430\u0445 \u043d\u0430 \u0436\u0438\u043b\u044c\u0435 \u0438 \u0415\u0413\u042d <\/summary>\n<div class=\"spoiler__content\">\n<p>\u0412 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u0440\u0430\u0441\u0442\u0443\u0449\u0435\u0433\u043e \u043d\u0435\u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0430 \u043c\u0435\u0436\u0434\u0443 \u0441\u043b\u043e\u044f\u043c\u0438  \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0433\u043e\u0440\u043e\u0434\u0430 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u0441\u0442\u0430\u043b\u043e \u0434\u043e\u0440\u043e\u0433\u0438\u043c. \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u044b  \u0440\u0430\u0441\u0442\u0435\u0442 <a href=\"https:\/\/lenta.ru\/news\/2025\/06\/23\/rost-tsen-na-zhilie-v-rossii-otsenili\/\" rel=\"noopener noreferrer nofollow\">\u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438\u043d\u0444\u043b\u044f\u0446\u0438\u0438<\/a>, \u043c\u0435\u0442\u0440\u0430\u0436 \u0441\u0440\u0435\u0434\u043d\u0435\u0439 <a href=\"https:\/\/spbhomes.ru\/science\/kak-so-vremenem-menyayutsya-ploshchadi-kvartir\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439<\/a> \u0432 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044e \u00a0\u043d\u043e\u0432\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e \u0441\u0442\u0440\u0430\u043d\u0435 \u0441 2000 \u043f\u043e 2025 \u0433\u043e\u0434 <a href=\"https:\/\/www.kp.ru\/daily\/27473.5\/4680337\/\" rel=\"noopener noreferrer nofollow\">\u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u0441\u044f<\/a> \u043d\u0430 1 \u043a\u043e\u043c\u043d\u0430\u0442\u0443 \u0441 80 \u0434\u043e 50\u00a0 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0445 \u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u044d\u043b\u0438\u0442\u043d\u044b\u0445 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432. <\/p>\n<p>\u041b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u043c\u0438\u043d\u0443\u0441 \u043e\u0434\u043d\u0430 \u043a\u043e\u043c\u043d\u0430\u0442\u0430 \u2013 \u043c\u0438\u043d\u0443\u0441 \u043e\u0434\u0438\u043d \u0440\u0435\u0431\u0435\u043d\u043e\u043a \u0432 \u0441\u0435\u043c\u044c\u0435. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043b\u044c\u0433\u043e\u0442\u043d\u043e\u0439 \u0438\u043f\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/www.cian.ru\/novosti-ekspert-rasskazal-o-posledstvijah-beskonechnoj-lgotnoj-ipoteki-333074\/\" rel=\"noopener noreferrer nofollow\">\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0438<\/a> <a href=\"https:\/\/www.vedomosti.ru\/kapital\/mortgage\/articles\/2024\/03\/27\/1028420-kak-lgotnaya-ipoteka-povliyala-na-dostupnost-zhilya-v-rossii\" rel=\"noopener noreferrer nofollow\">\u0446\u0435\u043d\u0443<\/a> \u043a\u0432\u0430\u0440\u0442\u0438\u0440, \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u0438 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0430\u043d\u043a\u043e\u0432\u0441\u043a\u043e\u0439 \u0441\u0444\u0435\u0440\u0435, \u043d\u043e \u0434\u0435 \u0444\u0430\u043a\u0442\u043e \u043d\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0438 <a href=\"https:\/\/www.rbc.ru\/finances\/28\/03\/2023\/6422b6869a79474e04580d5e\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c<\/a> \u0436\u0438\u043b\u044c\u044f. <\/p>\n<p>\u0414\u0440\u0443\u0433\u0438\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0435: \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0432\u044b\u0441\u0448\u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u2013 \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442 \u043a\u043e\u043b\u043e\u0441\u0441\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0442\u0440\u0430\u0442 \u043d\u0430 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0443 \u043a \u0415\u0413\u042d (60% \u043c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u0438\u0445 \u0434\u0435\u0442\u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0443\u0441\u043b\u0443\u0433\u0430\u043c\u0438 \u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u0440\u0435\u043f\u0435\u0442\u0438\u0442\u043e\u0440\u043e\u0432) \u0438 \u0434\u043e \u0437\u0430\u0442\u0440\u0430\u0442 \u043d\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0432 \u0432\u0443\u0437\u0435. \u0410 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0415\u0413\u042d \u2013 <a href=\"https:\/\/mel.fm\/ucheba\/yege\/5981302-matematika\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0440\u0430\u0441\u0442\u0435\u0442<\/a>. \u0418 \u0441\u0430\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438\u0437 \u043a\u0440\u0430\u0439\u043d\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 <a href=\"https:\/\/cyberleninka.ru\/article\/n\/k-voprosu-o-rabochey-modeli-modernizatsii-edinogo-gosudarstvennogo-ekzamena-dlya-preodoleniya-neravenstva-dostupa-k-vysshemu\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/a> \u043f\u043e\u0442\u0438\u0445\u043e\u043d\u044c\u043a\u0443 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0435\u0435 \u00a0<a href=\"https:\/\/msk1.ru\/text\/education\/2025\/06\/01\/75532340\/\" rel=\"noopener noreferrer nofollow\">\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u0435\u043b<\/a>\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u00a0\u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0442\u0430\u043a \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u043f\u0430\u0433\u0430\u043d\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/%D0%BD%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D1%8B.%D1%80%D1%84\/news\/vybiray-kolledzh-kak-professionalitet-povyshaet-prestizh-rabochikh-professiy\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435<\/a> \u0438 \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a <a href=\"https:\/\/msk1.ru\/text\/education\/2025\/06\/01\/75532340\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044e \u0432\u044b\u0441\u0448\u0435\u0433\u043e<\/a>.\u00a0 \u00a0<\/p>\n<p>\u041c\u0435\u0440\u044b \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043a\u0440\u0430\u0439\u043d\u0435 \u0440\u0430\u0437\u043d\u043e\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e \u0432 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u043e\u0435\u0432. <\/p>\n<p>\u042d\u043b\u0438\u0442\u0430 \u0438 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430  \u043e\u0442 \u043d\u0438\u0445 \u043c\u0430\u043b\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b. \u0414\u043b\u044f \u044d\u043b\u0438\u0442\u044b \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u0434\u0435\u0442\u0435\u0439 \u0432 \u0441\u0438\u043b\u0443 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0441\u043a\u043b\u043e\u043d\u043d\u043e\u0441\u0442\u0438 \u043a \u00ab\u044d\u043b\u0438\u0442\u043d\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0443\u00bb &#8212; \u0442\u0430\u043a \u0431\u044b\u043b\u043e \u0438\u0437\u0434\u0440\u0435\u0432\u043b\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0435\u0441\u0442\u044c \u043b\u0443\u0447\u0448\u0438\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043f\u0438\u0442\u0430\u043d\u0438\u044f, \u043c\u0435\u0434\u0438\u0446\u0438\u043d\u0430 \u0438 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435, \u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u043d\u044b\u0435 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0430\u0432\u0430\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u00ab\u043c\u0430\u0442\u0440\u0438\u043c\u043e\u043d\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0439\u00bb. \u0420\u044b\u043d\u043e\u043a <a href=\"https:\/\/erzrf.ru\/news\/eksperty-v-moskovskikh-novostroykakh-perestala-umenshatsya-srednyaya-ploshchad-kvartir-i-apartamentov\" rel=\"noopener noreferrer nofollow\">\u044d\u043b\u0438\u0442\u043d\u043e\u0433\u043e<\/a> \u0436\u0438\u043b\u044c\u044f \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0439 \u0437\u0430\u043a\u043e\u043d. <\/p>\n<p>\u00ab\u0421\u0440\u0435\u0434\u043d\u0438\u0439 \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u043a\u043b\u0430\u0441\u0441\u00bb \u043d\u0435 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d \u0432 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 \u043e\u0442 \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0430, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u0430 \u043d\u0435 \u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u0438 \u043d\u0435 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u00ab\u0443\u043f\u0443\u0449\u0435\u043d\u043d\u0443\u044e \u0432\u044b\u0433\u043e\u0434\u0443\u00bb \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0438 \u0442\u0440\u0430\u0442\u044f\u0442 \u043d\u0430 \u0432\u043e\u0441\u043f\u0438\u0442\u0430\u043d\u0438\u0435 \u0434\u0435\u0442\u0435\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0438 <a href=\"https:\/\/ren.tv\/news\/v-rossii\/1344349-glava-vtsiom-obiasnil-prichiny-nezhelaniia-rossiian-zavodit-detei\" rel=\"noopener noreferrer nofollow\"><em>\u0436\u0438\u0432\u0443\u0442 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0438 \u043d\u0435 \u0445\u043e\u0442\u044f\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0441\u0432\u043e\u0431\u043e\u0434\u0443<\/em><\/a>. \u0418 \u0434\u0430, \u0437\u0434\u0435\u0441\u044c \u0432 \u0440\u0430\u0437\u0432\u0438\u0442\u044b\u0445 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430\u0445 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u00ab\u0432\u0437\u0440\u043e\u0441\u043b\u043e\u0435 \u0434\u0435\u0442\u0441\u0442\u0432\u043e\u00bb \u0438 \u043f\u0440\u0435\u0441\u043b\u043e\u0432\u0443\u0442\u044b\u0439 <a href=\"https:\/\/habr.com\/ru\/articles\/841656\/\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0444\u0430\u043d\u0442\u0438\u043b\u0438\u0437\u043c<\/a>. <\/p>\n<p>\u041d\u0438\u0436\u043d\u0438\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u0441\u0440\u0435\u0434\u043d\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u043d\u0438\u0436\u0435  \u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u044b \u0432 \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u0430 \u0443\u0436\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u0435\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u043e. <\/p>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u0430\u0440\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b, \u043f\u0440\u0435\u043a\u0430\u0440\u0438\u0430\u0442, \u00ab\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e \u0431\u0435\u0434\u043d\u044b\u0435\u00bb &#8212; \u0442\u0430\u043a \u0436\u0435 \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u044e\u0442 \u043d\u0430 \u043c\u0435\u0440\u044b \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438.\u00a0 <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043d\u0430 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e-\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u2013 \u0431\u0435\u0437 \u0443\u0447\u0435\u0442\u0430 \u043d\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e-\u043a\u0443\u043b\u044c\u0442\u0443\u0440\u043d\u044b\u0445, \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043d\u043e\u0441\u044f\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0432\u044b \u0432 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0435\u0439.<\/p>\n<\/div>\n<\/details>\n<p>\u0412\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u2014 \u044d\u0442\u043e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u2013 \u043a\u0430\u043a <a href=\"https:\/\/ru.ruwiki.ru\/wiki\/%D0%92%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D1%8F%D1%8F_%D0%BC%D0%B8%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%BD%D0%B0%D1%81%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%B2_%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f<\/a>, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u0441 \u00ab<a href=\"https:\/\/cyberleninka.ru\/article\/n\/vnutrennyaya-migratsiya-v-rossii-1990-2013-gg-osnovnye-parametry-i-osobennosti-zapadnogo-dreyfa\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u043f\u0430\u0434\u043d\u044b\u043c \u0434\u0440\u0435\u0439\u0444\u043e\u043c\u00bb<\/a>, \u0442\u0430\u043a \u0438 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0435\u0439 \u043c\u043e\u043b\u043e\u0434\u0451\u0436\u0438 \u0438 \u043d\u0430\u0441\u0435\u043b\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0435 \u0432 \u043a\u0440\u0443\u043f\u043d\u044b\u0435 \u0446\u0435\u043d\u0442\u0440\u044b \u0432 \u043f\u043e\u0438\u0441\u043a\u0430\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f, \u0440\u0430\u0431\u043e\u0442\u044b \u0438 \u043b\u0443\u0447\u0448\u0435\u0433\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0436\u0438\u0437\u043d\u0438.\u00a0 \u0415\u0441\u0442\u044c \u0438 \u0432\u043d\u0435\u0448\u043d\u044f\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u043d\u043e\u0432\u044b\u0445 \u0433\u0440\u0430\u0436\u0434\u0430\u043d \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u043e\u0431\u0449\u0435\u0435 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u0430\u043d\u044b, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043b\u0430\u0433\u043e\u043c \u0434\u043b\u044f \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0430, \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u043a\u0438 \u0438 \u0434\u0435\u043c\u043e\u0433\u0440\u0430\u0444\u0438\u0438. \u041d\u043e \u043f\u0440\u0438 \u043f\u0440\u0435\u043d\u0435\u0431\u0440\u0435\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u043e\u043d\u0430  \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0441\u0442\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u0440\u0438\u0437\u0438\u0441\u043e\u0432 \u0438 \u043f\u043e\u0442\u0440\u044f\u0441\u0435\u043d\u0438\u0439.<\/p>\n<p><s>\u0425\u044c\u044e\u0441\u0442\u043e\u043d,<\/s> \u0443 \u043d\u0430\u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b: \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u043c\u0435\u0440\u044b \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0441\u0442\u0438\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u043e\u0435\u0432, \u0440\u0435\u0433\u0438\u043e\u043d\u044b \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u043e\u0439 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0431\u0430\u0437\u043e\u0439 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438. \u0412\u043d\u0435\u0448\u043d\u0438\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430\u043c\u0438 \u0438 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430\u043c\u0438 \u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043a \u043d\u0435\u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u043e\u0441\u0442\u044f\u043c \u0438 \u0440\u0430\u0437\u043c\u044b\u0442\u0438\u044e \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430. \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043a \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u00ab\u0432\u044b\u043c\u043e\u0440\u043e\u0447\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u00bb, <a href=\"https:\/\/www.theatlantic.com\/education\/archive\/2019\/07\/education-deserts-across-rural-america\/593071\/\" rel=\"noopener noreferrer nofollow\">\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 <\/a>\u00a0\u0438\u043b\u0438 <a href=\"https:\/\/iq-media.ru\/archive\/275451404\" rel=\"noopener noreferrer nofollow\">\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0441\u043a\u0438\u0445<\/a> \u043f\u0443\u0441\u0442\u044b\u043d\u044c. <\/p>\n<p>\u0411\u0443\u0434\u0435\u043c \u0438\u0445 \u0440\u0435\u0448\u0430\u0442\u044c. <\/p>\n<p><strong>\u041c\u043e\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430<\/strong><\/p>\n<p>\u041d\u0430\u0448 \u0438\u0434\u0435\u0430\u043b \u2013 \u044d\u0442\u043e 89 \u0418\u0418-\u0430\u0433\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0449\u0438\u0445 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u044f\u043c\u0438, \u0438\u0445 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0435\u043c, \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u043e\u0439 \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435  \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0440\u0433\u0430\u043d\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u043b\u0430\u0441\u0442\u0438 (\u0420\u041e\u0418\u0412) \u0438\u043b\u0438 \u043c\u0443\u043d\u0438\u0446\u0438\u043f\u0430\u043b\u0438\u0442\u0435\u0442\u043e\u0432 (\u041e\u041c\u0421\u0423) \u043f\u043e \u0441\u0442\u0438\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e\/\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438, \u043c\u0435\u0442\u043e\u0434\u0430\u043c \u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c. \u0415\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u0434 \u043c\u0443\u0434\u0440\u044b\u043c \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e\u043c \u0444\u0435\u0434\u0435\u0440\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430. <\/p>\n<p>\u0421\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u0441\u044e \u0441\u0440\u0435\u0434\u0443 \u0434\u043b\u044f \u0443 \u043d\u0430\u0441 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u2013 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u044b \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 \u0438\u0437-\u0437\u0430 \u043f\u0440\u0435\u0441\u043b\u043e\u0432\u0443\u0442\u043e\u0433\u043e \u00ab<a href=\"https:\/\/habr.com\/ru\/articles\/707146\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u043a\u043b\u044f\u0442\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u0438<\/a>\u00bb \u0432 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u043c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438. \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0444\u0430\u043a\u0442\u043e\u0440\u0430\u0445 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u0445. \u0423\u0447\u0438\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 7 \u0430\u0433\u0435\u043d\u0442\u043e\u0432, \u0430 \u043f\u043e\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u043f\u0435\u0441\u043e\u0447\u043d\u0438\u0446\u0443 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445. \u041c\u0435\u0442\u043e\u0434\u0438\u043a\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f &#8212; <code>Multi-agent Deep Deterministic Policy Gradient.<\/code><\/p>\n<p><code>MADDPG<\/code> \u2014 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u0430\u0433\u0435\u043d\u0442\u0430\u043c \u043e\u0431\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u0438 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0430\u0442\u044c \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439 \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439. \u042d\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 <code>DDPG <\/code>(<code>Deep Deterministic Policy Gradient)<\/code><\/p>\n<details class=\"spoiler\">\n<summary>MADDPG, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 <\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p><strong>\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u0438 \u0434\u0435\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435<\/strong>. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435 \u0430\u0433\u0435\u043d\u0442\u044b \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c (\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0435\u0439 \u0441 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 &#8212; \u043f\u0440\u0435\u0441\u043b\u043e\u0432\u0443\u0442\u044b\u043c \u00ab\u0444\u0435\u0434\u0435\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u0446\u0435\u043d\u0442\u0440\u043e\u043c\u00bb) \u0438\u043b\u0438 \u043a\u0440\u0438\u0442\u0438\u043a\u043e\u043c, \u043d\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f, \u0430 \u0430\u0433\u0435\u043d\u0442\u044b \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430\u043c\u0438 \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u0445<\/strong>. MADDPG \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435, \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0435 \u0438<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\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-464585","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/464585","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=464585"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/464585\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=464585"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=464585"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=464585"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}