{"id":307271,"date":"2020-07-21T15:00:55","date_gmt":"2020-07-21T15:00:55","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=307271"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=307271","title":{"rendered":"\u0423\u0447\u0438\u043c \u0418\u0418 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043f\u0438\u0440\u043e\u0433\u0438 \u043f\u043e \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u0435\u043c"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/511874\/\">\n<h2>\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h2>\n<p>  \u041a\u0430\u043a-\u0442\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043a\u043d\u0438\u0433\u0438 <i>\u00abReinforcement Learning: An Introduction\u00bb<\/i> \u044f \u0437\u0430\u0434\u0443\u043c\u0430\u043b\u0441\u044f \u043d\u0430\u0434 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0441\u0432\u043e\u0438\u0445 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u043d\u0430\u043d\u0438\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438, \u043e\u0434\u043d\u0430\u043a\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0431\u0440\u0443\u0441\u043a\u0430, \u0443\u0447\u0438\u0442\u044c \u0430\u0433\u0435\u043d\u0442\u0430 \u0438\u0433\u0440\u0430\u0442\u044c \u0432 \u0448\u0430\u0445\u043c\u0430\u0442\u044b \u0438\u043b\u0438 \u0436\u0435 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434 \u0436\u0435\u043b\u0430\u043d\u0438\u044f \u043d\u0435 \u0431\u044b\u043b\u043e.<\/p>\n<p>  \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432 \u043a\u043d\u0438\u0433\u0435 \u0431\u044b\u043b \u043e\u0434\u0438\u043d \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u043b\u043e\u0436\u0435\u043d \u0432 \u043f\u043b\u0430\u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\/\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0430 \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u2014 \u0432\u043f\u043e\u043b\u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441 \u0442\u0435\u043c \u0438\u043b\u0438 \u0438\u043d\u044b\u043c \u0443\u0441\u043f\u0435\u0445\u043e\u043c \u0432\u043d\u0435\u0434\u0440\u0435\u043d \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0436\u0438\u0437\u043d\u044c. <\/p>\n<p>  \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u044f \u0438 \u043f\u0440\u0438\u0448\u0435\u043b \u043a \u0442\u043e\u0439 \u0438\u0434\u0435\u0435, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u0430\u043b\u0435\u0435 \u0438 \u043f\u043e\u0439\u0434\u0435\u0442 \u0440\u0435\u0447\u044c.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2>\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438<\/h2>\n<p>  \u0418\u0442\u0430\u043a, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wa\/nh\/bt\/wanhbtgoudbkp1jn46ec4zzaiga.png\"\/><\/p>\n<p>  \u041c\u044b \u0438\u043c\u0435\u0435\u043c \u0432 \u0441\u0432\u043e\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438 \u043f\u0435\u043a\u0430\u0440\u043d\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c 6 (\u0443\u0441\u043b\u043e\u0432\u043d\u043e) \u0442\u043e\u043d\u043d \u043c\u0430\u043b\u0438\u043d\u043e\u0432\u044b\u0445 \u043f\u0438\u0440\u043e\u0433\u043e\u0432 \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0435\u043d\u044c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u0443\u044e \u043f\u0440\u043e\u0434\u0443\u043a\u0446\u0438\u044e \u043f\u043e \u0442\u0440\u0435\u043c \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430\u043c.<\/p>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e \u043a\u0430\u043a \u043b\u0443\u0447\u0448\u0435 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0440\u043e\u0441\u0440\u043e\u0447\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0446\u0438\u0438 (\u043f\u0440\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u0438, \u0447\u0442\u043e \u0441\u0440\u043e\u043a \u0433\u043e\u0434\u043d\u043e\u0441\u0442\u0438 \u043f\u0438\u0440\u043e\u0433\u043e\u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0440\u0438 \u0434\u043d\u044f), \u0435\u0441\u043b\u0438 \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0440\u0438 \u0433\u0440\u0443\u0437\u043e\u0432\u0438\u043a\u0430 \u0441 \u0432\u043c\u0435\u0441\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0432 1, 2 \u0438 3 \u0442\u043e\u043d\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432 \u043a\u0430\u0436\u0434\u0443\u044e \u0442\u043e\u0447\u043a\u0443 \u043f\u0440\u043e\u0434\u0430\u0436\u0438 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0433\u043e\u0434\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0433\u0440\u0443\u0437\u043e\u0432\u0438\u043a (\u0438\u0431\u043e \u043e\u043d\u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u0430\u043b\u0435\u043a\u043e) \u0438 \u043f\u0440\u0438\u0442\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0432 \u0441\u0443\u0442\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u0435\u0447\u043a\u0438 \u043f\u0438\u0440\u043e\u0433\u043e\u0432, \u0434\u0430 \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043c\u044b \u043d\u0435 \u0437\u043d\u0430\u0435\u043c \u043f\u043e\u043a\u0443\u043f\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0432 \u043d\u0430\u0448\u0438\u0445 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430\u0445 (\u0442\u0430\u043a \u043a\u0430\u043a \u0431\u0438\u0437\u043d\u0435\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438)?<\/p>\n<p>  \u0423\u0441\u043b\u043e\u0432\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0432 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430\u0445 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0432\u044b\u043a\u043b\u0430\u0434\u043a\u0438 FIFO, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u043a\u0443\u043f\u0430\u0442\u0435\u043b\u0438 \u0431\u0435\u0440\u0443\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0442 \u0442\u043e\u0432\u0430\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d \u043f\u043e\u0437\u0436\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445, \u043e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u043c\u0430\u043b\u0438\u043d\u043e\u0432\u044b\u0439 \u043f\u0438\u0440\u043e\u0433 \u043d\u0435 \u0431\u044b\u043b \u043a\u0443\u043f\u043b\u0435\u043d \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u0442\u0440\u0435\u0445 \u0434\u043d\u0435\u0439, \u0442\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430 \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442 \u043d\u0435\u0433\u043e.<\/p>\n<p>  \u041c\u044b (\u0443\u0441\u043b\u043e\u0432\u043d\u043e) \u043d\u0435 \u0437\u043d\u0430\u0435\u043c \u043a\u0430\u043a\u043e\u0439 \u0441\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u0438\u0440\u043e\u0433\u0438 \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0434\u0435\u043d\u044c \u0432 \u0442\u043e\u043c \u0438\u043b\u0438 \u0438\u043d\u043e\u043c \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u043e\u0434\u043d\u0430\u043a\u043e \u0432 \u043d\u0430\u0448\u0435\u0439 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u043c\u044b \u0437\u0430\u0434\u0430\u0435\u043c \u0435\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0442\u0440\u0435\u0445 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u043e\u0432: 3 \u00b1 0.1, 1 \u00b1 0.1, 2 \u00b1 0.1.<\/p>\n<p>  \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u0432\u044b\u0433\u043e\u0434\u043d\u044b\u0439 \u0434\u043b\u044f \u043d\u0430\u0441 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u044d\u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u043c\u0430\u0433\u0430\u0437\u0438\u043d \u0442\u0440\u0438, \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043e\u0434\u043d\u0443, \u0430 \u0432 \u0442\u0440\u0435\u0442\u0438\u0439 \u0434\u0432\u0435 \u0442\u043e\u043d\u043d\u044b \u043f\u0438\u0440\u043e\u0433\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>  \u0414\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 gym, \u0430 \u0442\u0430\u043a\u0436\u0435 Deep Q Learning (Keras \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f).<\/p>\n<h2>\u041a\u0430\u0441\u0442\u043e\u043c\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430<\/h2>\n<p>  \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0440\u0435\u0434\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u043c\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 \u2014 \u043e\u0441\u0442\u0430\u0442\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0446\u0438\u0438 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0434\u0435\u043d\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 \u0442\u0440\u0435\u0445 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u043e\u0432. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0430\u0433\u0435\u043d\u0442\u0430 \u2014 \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u0430 \u043e\u0442 0 \u0434\u043e 5 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b 1, 2 \u0438 3. \u042f\u0441\u043d\u043e, \u0447\u0442\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0433\u043e\u0434\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434 4-\u044b\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c (3, 1, 2). \u0417\u0430\u0434\u0430\u0447\u0443 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c \u043a\u0430\u043a \u044d\u043f\u0438\u0437\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0443\u044e, \u0432 \u043e\u0434\u043d\u043e\u043c \u044d\u043f\u0438\u0437\u043e\u0434\u0435 30 \u0434\u043d\u0435\u0439.<\/p>\n<pre><code class=\"python\">import gym from gym import error, spaces, utils from gym.utils import seeding  import itertools import random import time  class ShopsEnv(gym.Env):   metadata = {'render.modes': ['human']}      # \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442   # \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0440\u0435\u0434\u044b   def __init__(self):     self.state = [0, 0, 0]  # \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435     self.next_state = [0, 0, 0]  # \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435     self.done = False  # \u0444\u043b\u0430\u0436\u043e\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u044d\u043f\u0438\u0437\u043e\u0434\u0430     self.actions = list(itertools.permutations([1, 2, 3]))  # \u043c\u0430\u0441\u0441\u0438\u0432 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0430\u0433\u0435\u043d\u0442\u0430     self.reward = 0  # \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u043d\u0430\u0433\u0440\u0430\u0434\u0430 \u0437\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435     self.time_tracker = 0  # \u0442\u0440\u0435\u043a\u0435\u0440 \u0434\u043d\u044f \u044d\u043f\u0438\u0437\u043e\u0434\u0430          self.remembered_states = []  # \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0437 \u0442\u0440\u0435\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439          # \u0434\u043b\u044f \u0441\u0442\u043e\u0445\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u0441\u0440\u0435\u0434\u044b     t = int( time.time() * 1000.0 )     random.seed( ((t & 0xff000000) &gt;&gt; 24) +                  ((t & 0x00ff0000) &gt;&gt;  8) +                  ((t & 0x0000ff00) &lt;&lt;  8) +                  ((t & 0x000000ff) &lt;&lt; 24)   )      # \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u0433\u0435\u043d\u0442\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043e\u0434\u043d\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 (\u0448\u0430\u0433) \u0432 \u0441\u0440\u0435\u0434\u0435   def step(self, action_num):     # \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d \u043b\u0438 \u0443\u0436\u0435 \u044d\u043f\u0438\u0437\u043e\u0434     if self.done:         return [self.state, self.reward, self.done, self.next_state]     else:         # \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u043c         self.state = self.next_state                  # \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435         self.remembered_states.append(self.state)               # \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0442\u0440\u0435\u043a\u0435\u0440         self.time_tracker += 1                  # \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c         action = self.actions[action_num]                  # \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 (\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u0438\u0440\u043e\u0433\u0438)         self.next_state = [x + y for x, y in zip(action, self.state)]                  # \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0443\u0434\u0435\u0442 \u043a\u0443\u043f\u043b\u0435\u043d\u043e         self.next_state[0] -= (3 + random.uniform(-0.1, 0.1))         self.next_state[1] -= (1 + random.uniform(-0.1, 0.1))         self.next_state[2] -= (2 + random.uniform(-0.1, 0.1))                  # \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043d\u0430\u0433\u0440\u0430\u0434\u0443 \u0437\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435         if any([x &lt; 0 for x in self.next_state]):             self.reward = sum([x for x in self.next_state if x &lt; 0])         else:             self.reward = 1                      # \u0435\u0441\u043b\u0438 \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u0430\u0441\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0437 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0442\u0440\u0435\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439         # \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0443\u0436\u043d\u043e \u0443\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0440\u043e\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u044b         # \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0435\u0441\u043b\u0438 \u0443\u0448\u043b\u0438 \u0432 \u043c\u0438\u043d\u0443\u0441 (\u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u043f\u0438\u0440\u043e\u0433\u043e\u0432 \u0434\u043b\u044f \u043f\u043e\u043a\u0443\u043f\u0430\u0442\u0435\u043b\u0435\u0439),         # \u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f         if self.time_tracker &gt;= 3:             remembered_state = self.remembered_states.pop(0)             self.next_state = [max(x - y, 0) for x, y in zip(self.next_state, remembered_state)]         else:             self.next_state = [max(x, 0) for x in self.next_state]                           # \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0448\u043b\u043e \u043b\u0438 \u0443\u0436\u0435 30 \u0434\u043d\u0435\u0439         self.done = self.time_tracker == 30                  # \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0448\u0430\u0433\u0430 \u0430\u0433\u0435\u043d\u0442\u0430 \u0432 \u0441\u0440\u0435\u0434\u0435         return [self.state, self.reward, self.done, self.next_state]      # \u043c\u0435\u0442\u043e\u0434 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0440\u0435\u0434\u044b   def reset(self):     # \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435     self.state = [0, 0, 0]     self.next_state = [0, 0, 0]     self.done = False     self.reward = 0     self.time_tracker = 0          self.remembered_states = []          t = int( time.time() * 1000.0 )     random.seed( ((t & 0xff000000) &gt;&gt; 24) +                  ((t & 0x00ff0000) &gt;&gt;  8) +                  ((t & 0x0000ff00) &lt;&lt;  8) +                  ((t & 0x000000ff) &lt;&lt; 24)   )          # \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435     return self.state      # \u043c\u0435\u0442\u043e\u0434 \u0440\u0435\u043d\u0434\u0435\u0440\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u0440\u0435\u0434\u044b:   # \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435 \u043f\u0438\u0440\u043e\u0433\u043e\u0432   def render(self, mode='human', close=False):     print('-'*20)     print('First shop')     print('Pies:', self.state[0])      print('Second shop')     print('Pies:', self.state[1])      print('Third shop')     print('Pies:', self.state[2])     print('-'*20)     print('') <\/code><\/pre>\n<p>  <\/p>\n<h2>\u0413\u043b\u0430\u0432\u043d\u044b\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u044b<\/h2>\n<p>  <\/p>\n<pre><code class=\"python\">import numpy as np # \u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0430\u043b\u0433\u0435\u0431\u0440\u0430 import pandas as pd # \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u0434\u0430\u043d\u043d\u044b\u0445 import gym # \u0434\u043b\u044f \u0441\u0440\u0435\u0434 import gym_shops # \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0439 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b from tqdm import tqdm # \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0431\u0430\u0440\u0430  # \u0434\u043b\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432 import matplotlib.pyplot as plt import seaborn as sns from IPython.display import clear_output sns.set_color_codes()  # \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f from collections import deque from keras.models import Sequential from keras.layers import Dense from keras.optimizers import Adam import random # \u0434\u043b\u044f \u0441\u0442\u043e\u0445\u0430\u0441\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u0441\u0440\u0435\u0434\u044b <\/code><\/pre>\n<p>  <\/p>\n<h2>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0430\u0433\u0435\u043d\u0442\u0430<\/h2>\n<p>  <\/p>\n<pre><code class=\"python\">class DQLAgent():           def __init__(self, env):         # \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u0433\u0438\u043f\u0435\u0440\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b                 self.state_size = 3 # \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u0445\u043e\u0434\u0430 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438         self.action_size = 6 # \u0440\u0430\u0437\u043c\u0435\u0440 \u0432\u044b\u0445\u043e\u0434\u0430 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438                  # \u044d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u0434\u043b\u044f replay()         self.gamma = 0.99         self.learning_rate = 0.01                  # \u044d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u0434\u043b\u044f adaptiveEGreedy()         self.epsilon = 0.99         self.epsilon_decay = 0.99         self.epsilon_min = 0.0001                  self.memory = deque(maxlen = 5000) # \u0434\u0435\u043a \u0441 5000 \u044f\u0447\u0435\u0439\u043a\u0430\u043c\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u0435\u0441\u043b\u0438 \u043e\u043d \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f - \u0443\u0434\u0430\u043b\u044f\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0435 \u044f\u0447\u0435\u0439\u043a\u0438                  # \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c (NN)         self.model = self.build_model()          # \u043c\u0435\u0442\u043e\u0434 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u0434\u043b\u044f Deep Q Learning     def build_model(self):         model = Sequential()         model.add(Dense(10, input_dim = self.state_size, activation = 'sigmoid')) # \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u043a\u0440\u044b\u0442\u044b\u0439 \u0441\u043b\u043e\u0439         model.add(Dense(50, activation = 'sigmoid')) # \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u043b\u043e\u0439         model.add(Dense(10, activation = 'sigmoid')) # \u0442\u0440\u0435\u0442\u0438\u0439 \u0441\u043b\u043e\u0439         model.add(Dense(self.action_size, activation = 'sigmoid')) # \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u043b\u043e\u0439         model.compile(loss = 'mse', optimizer = Adam(lr = self.learning_rate))         return model          # \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f     def remember(self, state, action, reward, next_state, done):         self.memory.append((state, action, reward, next_state, done))          # \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0431\u043e\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f     def act(self, state):         # \u0435\u0441\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043e\u0442 0 \u0434\u043e 1 \u043c\u0435\u043d\u044c\u0448\u0435 epsilon         # \u0442\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e (exploration)         if random.uniform(0,1) &lt;= self.epsilon:             return random.choice(range(6))         else:             # \u0438\u043d\u0430\u0447\u0435 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u0430\u044f \u0441\u0435\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f             act_values = self.model.predict(state)             return np.argmax(act_values[0])                       # \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438     def replay(self, batch_size):                  # \u0432\u044b\u0445\u043e\u0434\u0438\u043c \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430, \u0435\u0441\u043b\u0438 \u0435\u0449\u0435 \u043d\u0430 \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u044b\u0442\u0430 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438         if len(self.memory) &lt; batch_size:             return                  minibatch = random.sample(self.memory, batch_size) # \u0431\u0435\u0440\u0435\u043c batch_size \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438         # \u043e\u0431\u0443\u0447\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u0430\u0442\u0447\u0430         for state, action, reward, next_state, done in minibatch:             if done: # \u0435\u0441\u043b\u0438 \u044d\u043f\u0438\u0437\u043e\u0434 \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d - \u0442\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0433\u0440\u0430\u0434\u0430                 target = reward             else:                 # \u0438\u043d\u0430\u0447\u0435 \u0442\u0430\u0440\u0433\u0435\u0442 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f                 target = reward + self.gamma * np.amax(self.model.predict(next_state)[0])                  # target = R(s,a) + gamma * max Q`(s`,a`)                 # target (max Q` value) \u044d\u0442\u043e \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 s` \u043d\u0430 \u0432\u0445\u043e\u0434             train_target = self.model.predict(state) # s --&gt; NN --&gt; Q(s,a) = train_target             train_target[0][action] = target             self.model.fit(state, train_target, verbose = 0)          # \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f exploration rate,     # \u0442\u043e \u0435\u0441\u0442\u044c epsilon     def adaptiveEGreedy(self):         if self.epsilon &gt; self.epsilon_min:             self.epsilon *= self.epsilon_decay <\/code><\/pre>\n<h2>\u0422\u0440\u0435\u043d\u0438\u0440\u0443\u0435\u043c \u0430\u0433\u0435\u043d\u0442\u0430<\/h2>\n<p>  <\/p>\n<pre><code class=\"python\"># \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f gym \u0441\u0440\u0435\u0434\u044b \u0438 \u0430\u0433\u0435\u043d\u0442\u0430 env = gym.make('shops-v0') agent = DQLAgent(env)  # \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043a\u0438 batch_size = 100 episodes = 1000  # \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043a\u0443 progress_bar = tqdm(range(episodes), position=0, leave=True) for e in progress_bar:     # \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0441\u0440\u0435\u0434\u0443     state = env.reset()     state = np.reshape(state, [1, 3])      # \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0434\u0435\u043d\u044c \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438, id \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0438 \u0441\u0443\u043c\u043c\u0443 \u043d\u0430\u0433\u0440\u0430\u0434 \u0437\u0430 \u044d\u043f\u0438\u0437\u043e\u0434     time = 0     taken_actions = []     sum_rewards = 0       # \u0441\u0438\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u044d\u043f\u0438\u0437\u043e\u0434 \u0441\u0440\u0435\u0434\u044b     while True:         # \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435         action = agent.act(state)          # \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435         taken_actions.append(action)          # \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0448\u0430\u0433 \u0430\u0433\u0435\u043d\u0442\u043e\u043c \u0432 \u0441\u0440\u0435\u0434\u0435         next_state, reward, done, _ = env.step(action)         next_state = np.reshape(next_state, [1, 3])          # \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0430\u0434\u0443 \u043a \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c         sum_rewards += reward          # \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0448\u0430\u0433\u0430         agent.remember(state, action, reward, next_state, done)          # \u043f\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         state = next_state          # \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c replay         agent.replay(batch_size)          # \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c epsilon         agent.adaptiveEGreedy()          # \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438         time += 1          # \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043a\u0438         progress_bar.set_postfix_str(s='mean reward: {}, time: {}, epsilon: {}'.format(round(sum_rewards\/time, 3), time, round(agent.epsilon, 3)), refresh=True)          # \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u043b\u0438 \u044d\u043f\u0438\u0437\u043e\u0434         if done:             # \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u044d\u043f\u0438\u0437\u043e\u0434\u0430             clear_output(wait=True)             sns.distplot(taken_actions, color=&quot;y&quot;)             plt.title('Episode: ' + str(e))             plt.xlabel('Action number')             plt.ylabel('Occurrence in %')             plt.show()             break <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bu\/dr\/lf\/budrlfmf-5hmau6puix9cvgwqso.png\"\/><\/p>\n<h2>\u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u0430\u0433\u0435\u043d\u0442\u0430<\/h2>\n<p>  <\/p>\n<pre><code class=\"python\">import time trained_model = agent  # \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u043d\u0430\u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u0433\u0435\u043d\u0442\u0430 state = env.reset()  # \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0440\u0435\u0434\u0443 state = np.reshape(state, [1,3])  # \u0441\u043b\u0435\u0434\u0438\u043c \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u044d\u043f\u0438\u0437\u043e\u0434\u0430 time_t = 0 MAX_EPISOD_LENGTH = 1000  # \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u0431\u0430\u0440\u0430 taken_actions = [] mean_reward = 0  # \u0441\u0438\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u044d\u043f\u0438\u0437\u043e\u0434 progress_bar = tqdm(range(MAX_EPISOD_LENGTH), position=0, leave=True) for time_t in progress_bar:     # \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0448\u0430\u0433 \u0430\u0433\u0435\u043d\u0442\u043e\u043c \u0432 \u0441\u0440\u0435\u0434\u0435     action = trained_model.act(state)     next_state, reward, done, _ = env.step(action)     next_state = np.reshape(next_state, [1,3])     state = next_state     taken_actions.append(action)      # \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0448\u0430\u0433\u0430     clear_output(wait=True)     env.render()     progress_bar.set_postfix_str(s='time: {}'.format(time_t), refresh=True)     print('Reward:', round(env.reward, 3))     time.sleep(0.5)      mean_reward += env.reward      if done:         break  # \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 sns.distplot(taken_actions, color='y') plt.title('Test episode - mean reward: ' + str(round(mean_reward\/(time_t+1), 3))) plt.xlabel('Action number') plt.ylabel('Occurrence in %') plt.show()     <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/i7\/pa\/hs\/i7pahswyapvhp4gondeyos7_too.png\"\/><\/p>\n<h2>\u0418\u0442\u043e\u0433\u043e<\/h2>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0430\u0433\u0435\u043d\u0442 \u043f\u043e\u043d\u044f\u043b, \u043a\u0430\u043a \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0433\u043e\u0434\u043d\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p>  \u0412 \u0446\u0435\u043b\u043e\u043c, \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0435\u0449\u0435 \u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432: \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u043e\u0432, \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0434\u0430 \u0445\u043e\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0433\u0438\u043f\u0435\u0440\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u043e\u0434\u0435\u043b\u0438 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u2014 \u0438 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0430\u043b\u043e \u0441\u043f\u0438\u0441\u043a\u0430.<\/p>\n<h2>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438<\/h2>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/www.kaggle.com\/mehmetkasap\/reinforcement-learning-deep-q-learning-cartpole\">\u041a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c Deep Q Learning \u043d\u0430 Keras<\/a><\/li>\n<li> <a href=\"https:\/\/medium.com\/@apoddar573\/making-your-own-custom-environment-in-gym-c3b65ff8cdaa\">\u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u0440\u0435\u0434\u0443 \u0432 gym <\/a>   <\/li>\n<\/ul>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/511874\/\"> https:\/\/habr.com\/ru\/post\/511874\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/511874\/\">\n<h2>\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h2>\n<p>  \u041a\u0430\u043a-\u0442\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u043a\u043d\u0438\u0433\u0438 <i>\u00abReinforcement Learning: An Introduction\u00bb<\/i> \u044f \u0437\u0430\u0434\u0443\u043c\u0430\u043b\u0441\u044f \u043d\u0430\u0434 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0441\u0432\u043e\u0438\u0445 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u043d\u0430\u043d\u0438\u0439 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438, \u043e\u0434\u043d\u0430\u043a\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u0431\u0440\u0443\u0441\u043a\u0430, \u0443\u0447\u0438\u0442\u044c \u0430\u0433\u0435\u043d\u0442\u0430 \u0438\u0433\u0440\u0430\u0442\u044c \u0432 \u0448\u0430\u0445\u043c\u0430\u0442\u044b \u0438\u043b\u0438 \u0436\u0435 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434 \u0436\u0435\u043b\u0430\u043d\u0438\u044f \u043d\u0435 \u0431\u044b\u043b\u043e.<\/p>\n<p>  \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432 \u043a\u043d\u0438\u0433\u0435 \u0431\u044b\u043b \u043e\u0434\u0438\u043d \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u043b\u043e\u0436\u0435\u043d \u0432 \u043f\u043b\u0430\u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\/\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0430 \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u2014 \u0432\u043f\u043e\u043b\u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441 \u0442\u0435\u043c \u0438\u043b\u0438 \u0438\u043d\u044b\u043c \u0443\u0441\u043f\u0435\u0445\u043e\u043c \u0432\u043d\u0435\u0434\u0440\u0435\u043d \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0436\u0438\u0437\u043d\u044c. <\/p>\n<p>  \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u044f \u0438 \u043f\u0440\u0438\u0448\u0435\u043b \u043a \u0442\u043e\u0439 \u0438\u0434\u0435\u0435, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0434\u0430\u043b\u0435\u0435 \u0438 \u043f\u043e\u0439\u0434\u0435\u0442 \u0440\u0435\u0447\u044c.  <\/p>\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-307271","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/307271","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=307271"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/307271\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=307271"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=307271"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=307271"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}