{"id":463058,"date":"2025-06-12T15:00:21","date_gmt":"2025-06-12T15:00:21","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=463058"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=463058","title":{"rendered":"<span>\u041e\u0431\u044b\u0433\u0440\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u0437\u0438\u043d\u043e, \u0441 \u0431\u043b\u044d\u043a\u0434\u0436\u0435\u043a\u043e\u043c \u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f\u043c\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<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/8w\/yd\/q5\/8wydq5c5mo55pm6dazbn-y9ricm.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/8w\/yd\/q5\/8wydq5c5mo55pm6dazbn-y9ricm.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/8w\/yd\/q5\/8wydq5c5mo55pm6dazbn-y9ricm.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 <a href=\"https:\/\/gymnasium.farama.org\/#\" rel=\"noopener noreferrer nofollow\">gymnasium<\/a> \u0434\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u0435\u043c. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0433\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f <code>q-learning<\/code> \u0434\u043b\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u0438\u0433\u0440\u044b\u0448\u0430 \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043d\u043e\u0439 \u0438\u0433\u0440\u0435 blackjack \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u043c \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0437\u0430 100 000 \u0438\u0433\u0440 \u043f\u0440\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u0445 \u0438\u0433\u0440\u044b blackjack.<\/p>\n<h3>\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0431\u043b\u044d\u043a\u0434\u0436\u0435\u043a\u0430<\/h3>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 \u0438\u0433\u0440\u044b \u0432 \u0431\u043b\u044d\u043a\u0434\u0436\u0435\u043a \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u043d\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%91%D0%BB%D1%8D%D0%BA%D0%B4%D0%B6%D0%B5%D0%BA\" rel=\"noopener noreferrer nofollow\">\u0432\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438<\/a>. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0432 <a href=\"https:\/\/gymnasium.farama.org\/environments\/toy_text\/blackjack\/\" rel=\"noopener noreferrer nofollow\">gymnasium<\/a>:<\/p>\n<ul>\n<li>\n<p>\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u0440\u0442 \u0440\u0430\u0432\u043d\u044b \u043e\u0442 2 \u0434\u043e 10 &#8212; \u0434\u043b\u044f \u043a\u0430\u0440\u0442 \u043e\u0442 \u0434\u0432\u043e\u0439\u043a\u0438 \u0434\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438 10 &#8212; \u0434\u043b\u044f \u0432\u0430\u043b\u0435\u0442\u043e\u0432, \u0434\u0430\u043c \u0438 \u043a\u043e\u0440\u043e\u043b\u0435\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0442\u0443\u0437 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430 11 \u043e\u0447\u043a\u043e\u0432, \u0435\u0441\u043b\u0438 \u043e\u0431\u0449\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043a\u0430\u0440\u0442 \u043d\u0430 \u0440\u0443\u043a\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u043d\u0435 \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u0438\u0442 21 (\u043f\u043e-\u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438, \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e \u043d\u0430 \u0440\u0443\u043a\u0435 \u0435\u0441\u0442\u044c <em>usable ace<\/em>), \u0438 \u0437\u0430 1 \u043e\u0447\u043a\u043e, \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u0438\u0442 21;<\/p>\n<\/li>\n<li>\n<p>\u0438\u0433\u0440\u043e\u043a\u0443 \u0440\u0430\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0435 \u043a\u0430\u0440\u0442\u044b, \u0434\u0438\u043b\u0435\u0440\u0443 \u2014 \u043e\u0434\u043d\u0430 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u0443\u044e \u0438 \u043e\u0434\u043d\u0430 \u0432 \u0437\u0430\u043a\u0440\u044b\u0442\u0443\u044e;<\/p>\n<\/li>\n<li>\n<p>\u0438\u0433\u0440\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u043e\u0434\u043d\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439: <\/p>\n<ul>\n<li>\n<p><em>hit<\/em>  \u2014 \u0432\u0437\u044f\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u043a\u0430\u0440\u0442\u0443;<\/p>\n<\/li>\n<li>\n<p><em>stand<\/em> \u2014 \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u0430\u0440\u0442;<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043e\u0447\u043a\u043e\u0432 \u0443 \u0438\u0433\u0440\u043e\u043a\u0430 \u043d\u0430 \u0440\u0443\u043a\u0430\u0445 \u0431\u043e\u043b\u044c\u0448\u0435 21, \u043e\u043d \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 (<em>bust<\/em>);<\/p>\n<\/li>\n<li>\n<p>\u0435\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 <em>stand<\/em> \u0441 \u0441\u0443\u043c\u043c\u043e\u0439 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 21, \u0434\u0438\u043b\u0435\u0440 \u0434\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043a\u0430\u0440\u0442\u044b, \u043f\u043e\u043a\u0430 \u0441\u0443\u043c\u043c\u0430 \u043a\u0430\u0440\u0442 \u0432 \u0435\u0433\u043e \u0440\u0443\u043a\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 17;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442, \u0435\u0441\u043b\u0438 \u0434\u0438\u043b\u0435\u0440 \u043b\u0438\u0431\u043e \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 21, \u043b\u0438\u0431\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0443\u043c\u043c\u0443 \u043e\u0447\u043a\u043e\u0432 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0441\u0443\u043c\u043c\u0430 \u043e\u0447\u043a\u043e\u0432 \u0443 \u0438\u0433\u0440\u043e\u043a\u0430; \u043f\u0440\u0438 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0435 \u043e\u0447\u043a\u043e\u0432 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0438\u0447\u044c\u044f (\u0441\u0442\u0430\u0432\u043a\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f);<\/p>\n<\/li>\n<li>\n<p>\u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u0445 \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u043e\u043d\u0443\u0441 \u0437\u0430 <em>natural blackjack<\/em>: \u0435\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u043d\u0430\u0431\u0438\u0440\u0430\u0435\u0442 21 \u043e\u0447\u043a\u043e \u0441 \u0440\u0430\u0437\u0434\u0430\u0447\u0438 \u0434\u0432\u0443\u043c\u044f \u043a\u0430\u0440\u0442\u0430\u043c\u0438, \u043e\u043d \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 +1, \u0430 +1.5 (\u043f\u043e\u043b\u0442\u043e\u0440\u044b \u0441\u0442\u0430\u0432\u043a\u0438).<\/p>\n<\/li>\n<\/ul>\n<h3>\u0424\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0440\u0435\u0434\u044b \u0431\u043b\u044d\u043a\u0434\u0436\u0435\u043a\u0430<\/h3>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/pi\/wd\/9n\/piwd9nfw0zkzzerunn395k90tga.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/pi\/wd\/9n\/piwd9nfw0zkzzerunn395k90tga.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/pi\/wd\/9n\/piwd9nfw0zkzzerunn395k90tga.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u0435\u043c, \u0442\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0434\u0432\u0430 <strong>\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f<\/strong>: <em>hit<\/em> \u0438 <em>stand<\/em>. <\/p>\n<p><strong>\u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439<\/strong> &#8212; \u044d\u0442\u043e 3 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f: <\/p>\n<ul>\n<li>\n<p>\u0441\u0443\u043c\u043c\u0430 \u043a\u0430\u0440\u0442 \u0438\u0433\u0440\u043e\u043a\u0430 (2 &#8212; 32);<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043a\u0440\u044b\u0442\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u0434\u0438\u043b\u0435\u0440\u0430 (1 &#8212; 10);<\/p>\n<\/li>\n<li>\n<p>\u0444\u043b\u0430\u0433, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u0443\u0437 \u0438\u0433\u0440\u043e\u043a\u0430, \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430 1 \u0438\u043b\u0438 \u0437\u0430 11.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041d\u0430\u0433\u0440\u0430\u0434\u0430<\/strong>: 1 &#8212; \u043f\u0440\u0438 \u043f\u043e\u0431\u0435\u0434\u0435, 1.5 &#8212; \u0435\u0441\u043b\u0438 \u0441\u0440\u0430\u0437\u0443 \u0440\u0430\u0437\u0434\u0430\u043b\u0438 \u0431\u043b\u044d\u0434\u0436\u0435\u043a, -1 &#8212; \u043f\u0440\u0438 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0448\u0435 \u0438 0 &#8212; \u043f\u0440\u0438 \u0438\u0441\u0445\u043e\u0434\u0435 &#171;\u043d\u0438\u0447\u044c\u044f&#187;.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <em>baseline<\/em> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e &#8212; \u0434\u0435\u043b\u0430\u0442\u044c <em>stand<\/em>, \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u043d\u0430 \u0440\u0443\u043a\u0430\u0445 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0432 19, 20 \u0438\u043b\u0438 21 \u043e\u0447\u043a\u043e. \u0412\u043e \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 &#8212; \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c <em>hit<\/em>.<\/p>\n<pre><code class=\"python\">def play_basic_strategy(env):     observation, info = env.reset()     player_score, deler_score, usable_ace = observation     while player_score &lt; 19:         observation, reward, terminated, truncated, info = env.step(STAND)         player_score, deler_score, usable_ace = observation     observation, reward, terminated, truncated, info = env.step(HIT)     return reward<\/code><\/pre>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043c\u0430\u0442. \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0432\u044b\u0438\u0433\u0440\u044b\u0448\u0430 \u043e\u043a\u043e\u043b\u043e <strong>-0.06%<\/strong>.<\/p>\n<h3>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0430\u0433\u0435\u043d\u0442\u0430<\/h3>\n<p>\u0414\u043b\u044f \u0438\u0433\u0440 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043c\u0435\u0442\u043e\u0434 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u0435\u043c <code>q-learning<\/code>. \u0418\u0434\u0435\u044f <code>q-learning<\/code> \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f &#8212; \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0430\u0433\u0440\u0430\u0434\u044b, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u0439 \u043e\u0442 \u0441\u0440\u0435\u0434\u044b, \u0430\u0433\u0435\u043d\u0442 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 <code>q_policy<\/code>, \u0433\u0434\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u043f\u044b\u0442\u0430 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f. \u0418 \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u0430\u0451\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448. <\/p>\n<p>\u0424\u043e\u0440\u043c\u0443\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f Q-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 Q-learning:<\/p>\n<p><img decoding=\"async\" class=\"formula\" source=\"Q(s, a) \\leftarrow Q(s, a) + \\alpha \\cdot \\left[ r + \\gamma \\cdot \\max_{a'} Q(s', a') - Q(s, a) \\right]\" alt=\"Q(s, a) \\leftarrow Q(s, a) + \\alpha \\cdot \\left[ r + \\gamma \\cdot \\max_{a'} Q(s', a') - Q(s, a) \\right]\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/08\/084\/0848b393cac1e455a318b9c208a08b75.svg\" width=\"auto\" height=\"auto\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/08\/084\/0848b393cac1e455a318b9c208a08b75.svg 780w,&#10;       https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0\/08\/084\/0848b393cac1e455a318b9c208a08b75.svg 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<p>\u0413\u0434\u0435:<\/p>\n<ul>\n<li>\n<p><em>Q(s, a)<\/em> &#8212; \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u0438 (<em>Q-value<\/em>) \u0434\u043b\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f <em>s<\/em> \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f <em>a<\/em><\/p>\n<\/li>\n<li>\n<p><em>\u03b1<\/em> &#8212; \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f (<em>learning rate<\/em>), \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443<\/p>\n<\/li>\n<li>\n<p><em>r<\/em> &#8212; \u043d\u0430\u0433\u0440\u0430\u0434\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f <em>a<\/em> \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <em>s<\/em><\/p>\n<\/li>\n<li>\n<p><em>\u03b3<\/em> &#8212; \u043a\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 (<em>discount factor<\/em>), \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u043d\u0430\u0433\u0440\u0430\u0434<\/p>\n<\/li>\n<li>\n<p><em>s\u2032<\/em> &#8212; \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0430\u0433\u0435\u043d\u0442 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f<\/p>\n<\/li>\n<li>\n<p><em>max\u2090\u2032 Q(s\u2032, a\u2032)<\/em> &#8212; \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <em>s\u2032<\/em> \u043f\u043e \u0432\u0441\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c <em>a\u2032<\/em><\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0433\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u043f\u0440\u0438 \u0438\u0433\u0440\u0435 \u0432 \u0431\u043b\u044d\u043a\u0434\u0436\u0435\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>q-learning<\/code>. <\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"python\">class BlackJackAgent:          def __init__(self, env, count_action: int, get_action_func):          self.states = self.get_all_states_from_env(env)         self.q_policy = dict(zip(self.states, np.zeros((len(self.states), count_action))))         self.env = env         self.get_action_func = get_action_func                   def get_all_states_from_env(self, env):         states = [get_observation_range_from_discrete(obseration) for obseration in env.observation_space]         return list(itertools.product(*states))          def q_learning(self, num_episodes: int,epsilon: float, alpha: float, gamma: float):                  for _ in range(num_episodes):             state, info = self.env.reset()             terminated = False             while not terminated:                 action = self.get_action_func(self.q_policy, state, epsilon, self.env)                 observation, reward, terminated, truncated, info = self.env.step(action)                 # Q[s,a] = Q[s,a] + alpha (r + gamma max\u2090\u2032 Q[s\u2032,a\u2032] \u2212 Q[s,a]).                 self.q_policy[state][action] = self.q_policy[state][action] + alpha * (reward + gamma * max(self.q_policy[observation]) - self.q_policy[state][action])                 state = observation<\/code><\/pre>\n<h3>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 <\/h3>\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u043c \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0437\u0430 100 000 \u0438\u0433\u0440, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0439 \u0430\u0433\u0435\u043d\u0442\u043e\u043c, \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u044f\u0445 \u0438\u0433\u0440\u044b \u0431\u043b\u044d\u043a\u0434\u0436\u0435\u043a:<\/p>\n<ul>\n<li>\n<p><em>\u0411\u0430\u0437\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <\/em><code><em>gymnasium;<\/em><\/code><\/p>\n<\/li>\n<li>\n<p><em>\u0411\u0430\u0437\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <\/em><code><em>gymnasium<\/em><\/code><em> \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c <\/em><code><em>dobule<\/em><\/code>. \u0412  \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0449\u0451 \u043e\u0434\u043d\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 <code>double<\/code> \u2014 \u0443\u0434\u0432\u043e\u0438\u0442\u044c \u0441\u0442\u0430\u0432\u043a\u0443. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f <code>double<\/code>\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0435\u043b\u044c\u0437\u044f. \u0418\u0433\u0440\u043e\u043a\u0443 \u0432\u044b\u0434\u0430\u0451\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0430, \u0430 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0438\u043b\u0438 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0448 \u0443\u0434\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f;<\/p>\n<\/li>\n<li>\n<p><em>\u0411\u0430\u0437\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <\/em><code><em>gymnasium<\/em><\/code><em> + <\/em><code><em>double<\/em><\/code><em> + <\/em><code><em>\u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u0430\u0440\u0442 \u043f\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u043a\u0438<\/em><\/code><strong>. <\/strong>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043e\u043b\u043e\u0434\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 <code>gymnasium<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u043a\u043e\u043b\u043e\u0434\u0430. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0431\u0443\u0434\u0435\u0442 \u0448\u0443\u0437 \u043d\u0430 6 \u043a\u043e\u043b\u043e\u0434, \u0438, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0435 30 \u043a\u0430\u0440\u0442, \u0448\u0443\u0437 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u043e\u0432\u043e \u0437\u0430\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c\u0441\u044f. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 <code>\u041f\u043e\u043b\u043e\u0432\u0438\u043d\u043a\u0438<\/code> \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%91%D0%BB%D1%8D%D0%BA%D0%B4%D0%B6%D0%B5%D0%BA\" rel=\"noopener noreferrer nofollow\">\u0432\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438<\/a>. \u0415\u0441\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u043e, \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d \u0432\u0435\u0441 \u0438, \u043f\u0440\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u043a\u0430\u0440\u0442\u044b \u043d\u0430 \u0441\u0442\u043e\u043b\u0435, \u0441\u0447\u0451\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0432\u0435\u0441\u0443. \u0414\u0435\u0442\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 &#8212; \u0438\u0433\u0440\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u044b \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043e\u0442 -35 \u0434\u043e 35 \u0441 \u0448\u0430\u0433\u043e\u043c 0.5, \u0438, \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u0442\u0430\u043a &#171;\u043f\u043e\u0432\u0435\u0437\u043b\u043e&#187;, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u043f\u043e\u0434\u0440\u044f\u0434, \u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u0447\u0451\u0442 -36, \u0442\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u043c\u0443 \u0441\u0447\u0451\u0442\u0443 (\u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435  \u0441\u0447\u0451\u0442\u0443 -35);<\/p>\n<\/li>\n<li>\n<p><em>\u0411\u0430\u0437\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <\/em><code><em>gymnasium<\/em><\/code><em> + <\/em><code><em>double<\/em><\/code><em> + <\/em><code><em>\u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u0430\u0440\u0442 \u043f\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043b\u044e\u0441-\u043c\u0438\u043d\u0443\u0441<\/em><\/code>. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044e, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u043c\u0443 \u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u0430\u0440\u0442 \u043f\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0435  <code>\u043f\u043e\u043b\u043e\u0432\u0438\u043d\u043a\u0438<\/code>, \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0441\u0430 \u0443 \u043a\u0430\u0440\u0442 [-1, 0, 1] \u0438 \u0448\u0430\u0433 \u043f\u0440\u0438 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0435 \u0440\u0430\u0432\u0435\u043d 1;<\/p>\n<\/li>\n<li>\n<p><em>\u0411\u0430\u0437\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <\/em><code><em>gymnasium<\/em><\/code><em> + <\/em><code><em>double<\/em><\/code><em> + <\/em><code><em>\u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u0430\u0440\u0442 \u043f\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043b\u044e\u0441-\u043c\u0438\u043d\u0443\u0441<\/em><\/code><em> + <\/em><code><em>split<\/em><\/code><em>. <\/em>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u0438\u0433\u0440\u043e\u043a\u0443 \u043f\u0440\u0438\u0448\u043b\u0438 \u0434\u0432\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043a\u0430\u0440\u0442\u044b(\u043b\u0438\u0431\u043e \u0434\u0432\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438), \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0440\u0443\u043a\u0443 \u043d\u0430 \u0434\u0432\u0435, \u0432\u043d\u0435\u0441\u0442\u0438 \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u0441\u0442\u0430\u0432\u043a\u0443 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0438\u0433\u0440\u0430\u0442\u044c \u0432 \u0434\u0432\u0435 \u0440\u0443\u043a\u0438 \u0441\u0440\u0430\u0437\u0443 (\u043a\u0430\u043a-\u0431\u0443\u0434\u0442\u043e \u0437\u0430 \u0434\u0432\u043e\u0438\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432);<\/p>\n<\/li>\n<li>\n<p><em>\u0411\u0430\u0437\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <\/em><code><em>gymnasium<\/em><\/code><em> + <\/em><code><em>double<\/em><\/code><em> + <\/em><code><em>\u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u0430\u0440\u0442 \u043f\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u043a\u0438<\/em><\/code><em> + <\/em><code><em>split<\/em><\/code><em>.<\/em><\/p>\n<\/li>\n<\/ul>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0434\u0432\u0430\u0438\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0432\u043a\u0443 \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u0430\u0440\u0442. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432 <a href=\"https:\/\/github.com\/lIkesimba9\/blackjack_q_learning\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>.<\/p>\n<pre><code class=\"python\">class BlackjackDoubleCardsCountEnv(BlackjackEnv): # \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u0441\u044f \u043e\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438\u0437 gymnasium.  https:\/\/github.com\/openai\/gym\/blob\/master\/gym\/envs\/toy_text\/blackjack.py     def __init__(self, render_mode: Optional[str] = None, natural=False, sab=False, ...):             super().__init__(render_mode, natural, sab)             ...             self.action_space = spaces.Discrete(3) # \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439             ...     def step(self, action):         ...         elif action == 3:             # \u0434\u0438\u043b\u0435\u0440 \u043d\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u043a\u0430\u0440\u0442\u044b             # \u0434\u0430\u0451\u043c \u0438\u0433\u0440\u043e\u043a\u0443 \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u043a\u0430\u0440\u0442\u0443             ...             # \u0434\u043e\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u043d\u0430\u0433\u0440\u0430\u0434\u0443 \u043d\u0430 2 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0438\u0433\u0440\u0443             done = True             reward = cmp(score(self.player), score(self.dealer)) * 2          return self._get_obs(), reward, done, False, {}<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u043a\u0430\u0440\u0442 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043e\u043b\u043e\u0434\u0443, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432\u0435\u0441\u043e\u0432 <code>mathing<\/code> \u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u0440\u0442\u044b <code>cards_count_range<\/code>. \u0422\u0430\u043a\u0436\u0435 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0447\u0451\u0442. \u0410 \u0432 \u0432\u044b\u0437\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>step,<\/code> \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438, \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0432\u044b\u0434\u0430\u043d\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0443. \u0422\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>_get_obs<\/code> \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>reset,<\/code> \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u043e\u0434\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043a\u0430\u0440\u0442 \u0432 \u043a\u043e\u043b\u043e\u0434\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u043d\u044c\u0448\u0435 30.<\/p>\n<pre><code class=\"python\">class BlackjackDoubleCardsCountEnv(BlackjackEnv):      def __init__(self, render_mode: Optional[str] = None, natural=False, sab=False, mathing=None, cards_count_range=np.arange(-35, 35, 0.5)):          self.standart_deck = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10] * 4         # \u0448\u0443\u0437 \u043d\u0430 6 \u043a\u043e\u043b\u043e\u0434         self.deck = self.standart_deck * 6         # '\u0441\u0447\u0435\u0442' \u043a\u0430\u0440\u0442         self.cards_count = 0         # \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0440\u0442         if mathing == None:             self.mathing = { # \u0432\u0435\u0441\u0430 \u043f\u043e \u0441\u0445\u0435\u043c\u0435 \"\u041f\u043e\u043b\u043e\u0432\u0438\u043d\u043a\u0438\"                 1: -1,                 2: 0.5,                 3: 1,                 4: 1,                 5: 1.5,                 6: 1,                 7: 0.5,                 8: 0,                 9: -0.5,                 10: -1,             }         else:              self.mathing = mathing         avilable_count_card_values = cards_count_range         self.map_avilable_count_card_to_state = dict(zip(avilable_count_card_values, range(len(avilable_count_card_values))))         self.observation_space = spaces.Tuple(                                   (spaces.Discrete(32), spaces.Discrete(11), spaces.Discrete(2), spaces.Discrete(len(avilable_count_card_values)))         )          def step(self, action):         ...         if action == any:             self.count(card) # \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438, \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0432\u044b\u0434\u0430\u043d\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0443             #  \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0443 \u0434\u0438\u043b\u0435\u0440\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0435 \u043a\u0430\u0440\u0442\u044b, \u0432 \u043a\u043e\u043d\u0446\u0435 \u0438\u0433\u0440\u044b         ...      def _get_obs(self):         # \u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0430\u0433\u0435\u043d\u0442\u0430 \u043f\u043e \u0441\u0447\u0451\u0442\u0443 \u043d\u0435 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b         # \u0438 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0441\u0447\u0451\u0442 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d          # \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u043a\u0440\u0430\u0439\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435         if self.cards_count in self.map_avilable_count_card_to_state:             cards_count_state = self.map_avilable_count_card_to_state[self.cards_count]         elif self.cards_count &lt; 0:             cards_count_state = 0         else:             cards_count_state = len(self.map_avilable_count_card_to_state) - 1                      return (... , cards_count_state)      def reset(self):         if len(self.deck) &lt; 30: # \u0437\u0430\u043d\u043e\u0432\u043e \u0437\u0430\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u043c \u043a\u043e\u043b\u043e\u0434\u044b              self.deck = self.standart_deck * 6             self.cards_count = 0         cards = self.draw_hand(self.np_random)         self.dealer = cards         self.count(self.dealer[0])           cards = self.draw_hand(self.np_random)         self.player = cards         for card in cards:             self.count(card)           return self._get_obs(), {}<\/code><\/pre>\n<h3>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b<\/h3>\n<p>\u0410\u0433\u0435\u043d\u0442 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043e\u0431\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0430 3 500 000 \u0438\u0433\u0440\u0430\u0445.<br \/>\u041f\u043e\u0441\u043b\u0435 100 000 \u0438\u0433\u0440 \u0431\u0443\u0434\u0435\u043c \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0442\u044c <code>exploration<\/code> \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0434\u043e 0.08.<\/p>\n<pre><code class=\"python\">def fit_agent(agent, env, alpha = 0.0009, epsilon = 0.77, gamma = 0.91):     rewards = []     for i in tqdm(range(0, COUNT_GAMES, STEP)):         agent.q_learning(STEP, epsilon, alpha, gamma)         mean_reward = np.mean([play(env, agent) for _ in range(0, 100_000)])         rewards.append(mean_reward)         if i % 100_000 == 0:             epsilon = min(0.92, epsilon + 0.05)     return rewards env = gym.make('Blackjack-v1',  natural=True) agent = BlackJackAgent(env, env.action_space.n, get_action) rewards_default_env = fit_agent(agent, env)<\/code><\/pre>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043d\u0430\u0433\u0440\u0430\u0434 \u043e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u044b\u0433\u0440\u0430\u043d\u043d\u044b\u0445 \u0438\u0433\u0440. <\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/gk\/hk\/xy\/gkhkxyzvgk90vhbaqmzpfzphrji.png\" sizes=\"(max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/webt\/gk\/hk\/xy\/gkhkxyzvgk90vhbaqmzpfzphrji.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/webt\/gk\/hk\/xy\/gkhkxyzvgk90vhbaqmzpfzphrji.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u0433\u0440\u0430\u0444\u0438\u043a\u043e\u0432, \u043e\u0431\u044b\u0433\u0440\u0430\u0442\u044c \u043a\u0430\u0437\u0438\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430  \u043c\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043a\u0430\u0440\u0442\u044b \u0438 \u0443\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c <code>split<\/code> \u0438 <code>double<\/code>, \u043f\u0440\u0438\u0447\u0451\u043c \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u043a\u0430\u0440\u0442 &#171;\u043f\u043b\u044e\u0441-\u043c\u0438\u043d\u0443\u0441&#187; \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043b\u0443\u0447\u0448\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0447\u0435\u043c \u043c\u0435\u0442\u043e\u0434 &#171;\u043f\u043e\u043b\u043e\u0432\u0438\u043d\u043a\u0438&#187;. \u0422\u0430\u043a \u0436\u0435 \u043f\u0440\u0438 \u0431\u0430\u0437\u043e\u0432\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0434\u0435\u043b\u0430\u0442\u044c <code>double<\/code> \u043e\u0446\u0435\u043d\u043e\u0447\u043d\u044b\u0435 Q-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0441\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043a \u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438.<\/p>\n<p><a href=\"https:\/\/t.me\/+9fl51jd750A3MTIy\" rel=\"noopener noreferrer nofollow\">\u0415\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u0432 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u043a\u0430\u043d\u0430\u043b\u0435<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/917924\/\"> https:\/\/habr.com\/ru\/articles\/917924\/<\/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<figure class=\"\"><\/figure>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 <a href=\"https:\/\/gymnasium.farama.org\/#\" rel=\"noopener noreferrer nofollow\">gymnasium<\/a> \u0434\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u0435\u043c. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0433\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f <code>q-learning<\/code> \u0434\u043b\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u0438\u0433\u0440\u044b\u0448\u0430 \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043d\u043e\u0439 \u0438\u0433\u0440\u0435 blackjack \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u043c \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0437\u0430 100 000 \u0438\u0433\u0440 \u043f\u0440\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u0445 \u0438\u0433\u0440\u044b blackjack.<\/p>\n<h3>\u041f\u0440\u0430\u0432\u0438\u043b\u0430 \u0431\u043b\u044d\u043a\u0434\u0436\u0435\u043a\u0430<\/h3>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 \u0438\u0433\u0440\u044b \u0432 \u0431\u043b\u044d\u043a\u0434\u0436\u0435\u043a \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u043d\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%91%D0%BB%D1%8D%D0%BA%D0%B4%D0%B6%D0%B5%D0%BA\" rel=\"noopener noreferrer nofollow\">\u0432\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438<\/a>. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0432 <a href=\"https:\/\/gymnasium.farama.org\/environments\/toy_text\/blackjack\/\" rel=\"noopener noreferrer nofollow\">gymnasium<\/a>:<\/p>\n<ul>\n<li>\n<p>\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u0440\u0442 \u0440\u0430\u0432\u043d\u044b \u043e\u0442 2 \u0434\u043e 10 &#8212; \u0434\u043b\u044f \u043a\u0430\u0440\u0442 \u043e\u0442 \u0434\u0432\u043e\u0439\u043a\u0438 \u0434\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0438 10 &#8212; \u0434\u043b\u044f \u0432\u0430\u043b\u0435\u0442\u043e\u0432, \u0434\u0430\u043c \u0438 \u043a\u043e\u0440\u043e\u043b\u0435\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0442\u0443\u0437 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430 11 \u043e\u0447\u043a\u043e\u0432, \u0435\u0441\u043b\u0438 \u043e\u0431\u0449\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043a\u0430\u0440\u0442 \u043d\u0430 \u0440\u0443\u043a\u0435 \u0438\u0433\u0440\u043e\u043a\u0430 \u043d\u0435 \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u0438\u0442 21 (\u043f\u043e-\u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438, \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u0447\u0442\u043e \u043d\u0430 \u0440\u0443\u043a\u0435 \u0435\u0441\u0442\u044c <em>usable ace<\/em>), \u0438 \u0437\u0430 1 \u043e\u0447\u043a\u043e, \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u0438\u0442 21;<\/p>\n<\/li>\n<li>\n<p>\u0438\u0433\u0440\u043e\u043a\u0443 \u0440\u0430\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0435 \u043a\u0430\u0440\u0442\u044b, \u0434\u0438\u043b\u0435\u0440\u0443 \u2014 \u043e\u0434\u043d\u0430 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u0443\u044e \u0438 \u043e\u0434\u043d\u0430 \u0432 \u0437\u0430\u043a\u0440\u044b\u0442\u0443\u044e;<\/p>\n<\/li>\n<li>\n<p>\u0438\u0433\u0440\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u0442\u044c \u043e\u0434\u043d\u043e \u0438\u0437 \u0434\u0432\u0443\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439: <\/p>\n<ul>\n<li>\n<p><em>hit<\/em>  \u2014 \u0432\u0437\u044f\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u043a\u0430\u0440\u0442\u0443;<\/p>\n<\/li>\n<li>\n<p><em>stand<\/em> \u2014 \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u0430\u0440\u0442;<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0435\u0441\u043b\u0438 \u0441\u0443\u043c\u043c\u0430 \u043e\u0447\u043a\u043e\u0432 \u0443 \u0438\u0433\u0440\u043e\u043a\u0430 \u043d\u0430 \u0440\u0443\u043a\u0430\u0445 \u0431\u043e\u043b\u044c\u0448\u0435 21, \u043e\u043d \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 (<em>bust<\/em>);<\/p>\n<\/li>\n<li>\n<p>\u0435\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 <em>stand<\/em> \u0441 \u0441\u0443\u043c\u043c\u043e\u0439 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 21, \u0434\u0438\u043b\u0435\u0440 \u0434\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043a\u0430\u0440\u0442\u044b, \u043f\u043e\u043a\u0430 \u0441\u0443\u043c\u043c\u0430 \u043a\u0430\u0440\u0442 \u0432 \u0435\u0433\u043e \u0440\u0443\u043a\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 17;<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442, \u0435\u0441\u043b\u0438 \u0434\u0438\u043b\u0435\u0440 \u043b\u0438\u0431\u043e \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 21, \u043b\u0438\u0431\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0443\u043c\u043c\u0443 \u043e\u0447\u043a\u043e\u0432 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0441\u0443\u043c\u043c\u0430 \u043e\u0447\u043a\u043e\u0432 \u0443 \u0438\u0433\u0440\u043e\u043a\u0430; \u043f\u0440\u0438 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u0435 \u043e\u0447\u043a\u043e\u0432 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0438\u0447\u044c\u044f (\u0441\u0442\u0430\u0432\u043a\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f);<\/p>\n<\/li>\n<li>\n<p>\u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u0445 \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u043e\u043d\u0443\u0441 \u0437\u0430 <em>natural blackjack<\/em>: \u0435\u0441\u043b\u0438 \u0438\u0433\u0440\u043e\u043a \u043d\u0430\u0431\u0438\u0440\u0430\u0435\u0442 21 \u043e\u0447\u043a\u043e \u0441 \u0440\u0430\u0437\u0434\u0430\u0447\u0438 \u0434\u0432\u0443\u043c\u044f \u043a\u0430\u0440\u0442\u0430\u043c\u0438, \u043e\u043d \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 +1, \u0430 +1.5 (\u043f\u043e\u043b\u0442\u043e\u0440\u044b \u0441\u0442\u0430\u0432\u043a\u0438).<\/p>\n<\/li>\n<\/ul>\n<h3>\u0424\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0440\u0435\u0434\u044b \u0431\u043b\u044d\u043a\u0434\u0436\u0435\u043a\u0430<\/h3>\n<figure class=\"\"><\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u0435\u043c, \u0442\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0434\u0432\u0430 <strong>\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f<\/strong>: <em>hit<\/em> \u0438 <em>stand<\/em>. <\/p>\n<p><strong>\u041f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439<\/strong> &#8212; \u044d\u0442\u043e 3 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f: <\/p>\n<ul>\n<li>\n<p>\u0441\u0443\u043c\u043c\u0430 \u043a\u0430\u0440\u0442 \u0438\u0433\u0440\u043e\u043a\u0430 (2 &#8212; 32);<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u043a\u0440\u044b\u0442\u0430\u044f \u043a\u0430\u0440\u0442\u0430 \u0434\u0438\u043b\u0435\u0440\u0430 (1 &#8212; 10);<\/p>\n<\/li>\n<li>\n<p>\u0444\u043b\u0430\u0433, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0442\u0443\u0437 \u0438\u0433\u0440\u043e\u043a\u0430, \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430 1 \u0438\u043b\u0438 \u0437\u0430 11.<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041d\u0430\u0433\u0440\u0430\u0434\u0430<\/strong>: 1 &#8212; \u043f\u0440\u0438 \u043f\u043e\u0431\u0435\u0434\u0435, 1.5 &#8212; \u0435\u0441\u043b\u0438 \u0441\u0440\u0430\u0437\u0443 \u0440\u0430\u0437\u0434\u0430\u043b\u0438 \u0431\u043b\u044d\u0434\u0436\u0435\u043a, -1 &#8212; \u043f\u0440\u0438 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0448\u0435 \u0438 0 &#8212; \u043f\u0440\u0438 \u0438\u0441\u0445\u043e\u0434\u0435 &#171;\u043d\u0438\u0447\u044c\u044f&#187;.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <em>baseline<\/em> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e &#8212; \u0434\u0435\u043b\u0430\u0442\u044c <em>stand<\/em>, \u0435\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u043d\u0430 \u0440\u0443\u043a\u0430\u0445 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0432 19, 20 \u0438\u043b\u0438 21 \u043e\u0447\u043a\u043e. \u0412\u043e \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 &#8212; \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c <em>hit<\/em>.<\/p>\n<pre><code class=\"python\">def play_basic_strategy(env):     observation, info = env.reset()     player_score, deler_score, usable_ace = observation     while player_score &lt; 19:         observation, reward, terminated, truncated, info = env.step(STAND)         player_score, deler_score, usable_ace = observation     observation, reward, terminated, truncated, info = env.step(HIT)     return reward<\/code><\/pre>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043c\u0430\u0442. \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0432\u044b\u0438\u0433\u0440\u044b\u0448\u0430 \u043e\u043a\u043e\u043b\u043e <strong>-0.06%<\/strong>.<\/p>\n<h3>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0430\u0433\u0435\u043d\u0442\u0430<\/h3>\n<p>\u0414\u043b\u044f \u0438\u0433\u0440 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043c\u0435\u0442\u043e\u0434 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u0435\u043c <code>q-learning<\/code>. \u0418\u0434\u0435\u044f <code>q-learning<\/code> \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f &#8212; \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0430\u0433\u0440\u0430\u0434\u044b, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u043e\u0439 \u043e\u0442 \u0441\u0440\u0435\u0434\u044b, \u0430\u0433\u0435\u043d\u0442 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 <code>q_policy<\/code>, \u0433\u0434\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u043f\u044b\u0442\u0430 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f. \u0418 \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u0430\u0451\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448. <\/p>\n<p>\u0424\u043e\u0440\u043c\u0443\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f Q-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435 Q-learning:<\/p>\n<p>\u0413\u0434\u0435:<\/p>\n<ul>\n<li>\n<p><em>Q(s, a)<\/em> &#8212; \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u0438 (<em>Q-value<\/em>) \u0434\u043b\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f <em>s<\/em> \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f <em>a<\/em><\/p>\n<\/li>\n<li>\n<p><em>\u03b1<\/em> &#8212; \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f (<em>learning rate<\/em>), \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0432\u043b\u0438\u044f\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043e\u0446\u0435\u043d\u043a\u0443<\/p>\n<\/li>\n<li>\n<p><em>r<\/em> &#8212; \u043d\u0430\u0433\u0440\u0430\u0434\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0430\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f <em>a<\/em> \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <em>s<\/em><\/p>\n<\/li>\n<li>\n<p><em>\u03b3<\/em> &#8212; \u043a\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 (<em>discount factor<\/em>), \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u043d\u0430\u0433\u0440\u0430\u0434<\/p>\n<\/li>\n<li>\n<p><em>s\u2032<\/em> &#8212; \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u0430\u0433\u0435\u043d\u0442 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f<\/p>\n<\/li>\n<li>\n<p><em>max\u2090\u2032 Q(s\u2032, a\u2032)<\/em> &#8212; \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <em>s\u2032<\/em> \u043f\u043e \u0432\u0441\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c <em>a\u2032<\/em><\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0433\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u043f\u0440\u0438 \u0438\u0433\u0440\u0435 \u0432 \u0431\u043b\u044d\u043a\u0434\u0436\u0435\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <code>q-learning<\/code>. <\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"python\">class BlackJackAgent:          def __init__(self, env, count_action: int, get_action_func):          self.states = self.get_all_states_from_env(env)         self.q_policy = dict(zip(self.states, np.zeros((len(self.states), count_action))))         self.env = env         self.get_action_func = get_action_func                   def get_all_states_from_env(self, env):         states = [get_observation_range_from_discrete(obseration) for obseration in env.observation_space]         return list(itertools.product(*states))          def q_learning(self, num_episodes: int,epsilon: float, alpha: float, gamma: float):                  for _ in range(num_episodes):             state, info = self.env.reset()             terminated = False             while not terminated:                 action = self.get_action_func(self.q_policy, state, epsilon, self.env)                 observation, reward, terminated, truncated, info = self.env.step(action)                 # Q[s,a] = Q[s,a] + alpha (r + gamma max\u2090\u2032 Q[s\u2032,a\u2032] \u2212 Q[s,a]).                 self.q_policy[state][action] = self.q_policy[state][action] + alpha * (reward + gamma * max(self.q_policy[observation]) - self.q_policy[state][action])                 state = observation<\/code><\/pre>\n<h3>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 <\/h3>\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u043c \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0437\u0430 100 000 \u0438\u0433\u0440, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0439 \u0430\u0433\u0435\u043d\u0442\u043e\u043c, \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u044f\u0445 \u0438\u0433\u0440\u044b \u0431\u043b\u044d\u043a\u0434\u0436\u0435\u043a:<\/p>\n<ul>\n<li>\n<p><em>\u0411\u0430\u0437\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <\/em><code><em>gymnasium;<\/em><\/code><\/p>\n<\/li>\n<li>\n<p><em>\u0411\u0430\u0437\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <\/em><code><em>gymnasium<\/em><\/code><em> \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c <\/em><code><em>dobule<\/em><\/code>. \u0412  \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0449\u0451 \u043e\u0434\u043d\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 <code>double<\/code> \u2014 \u0443\u0434\u0432\u043e\u0438\u0442\u044c \u0441\u0442\u0430\u0432\u043a\u0443. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0431\u043e\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f <code>double<\/code>\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0435\u043b\u044c\u0437\u044f. \u0418\u0433\u0440\u043e\u043a\u0443 \u0432\u044b\u0434\u0430\u0451\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0430, \u0430 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0438\u043b\u0438 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0448 \u0443\u0434\u0432\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f;<\/p>\n<\/li>\n<li>\n<p><em>\u0411\u0430\u0437\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <\/em><code><em>gymnasium<\/em><\/code><em> + <\/em><code><em>double<\/em><\/code><em> + <\/em><code><em>\u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u0430\u0440\u0442 \u043f\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u043a\u0438<\/em><\/code><strong>. <\/strong>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043e\u043b\u043e\u0434\u0443, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 <code>gymnasium<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u043a\u043e\u043b\u043e\u0434\u0430. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0431\u0443\u0434\u0435\u0442 \u0448\u0443\u0437 \u043d\u0430 6 \u043a\u043e\u043b\u043e\u0434, \u0438, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0435 30 \u043a\u0430\u0440\u0442, \u0448\u0443\u0437 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u043e\u0432\u043e \u0437\u0430\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c\u0441\u044f. \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 <code>\u041f\u043e\u043b\u043e\u0432\u0438\u043d\u043a\u0438<\/code> \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%91%D0%BB%D1%8D%D0%BA%D0%B4%D0%B6%D0%B5%D0%BA\" rel=\"noopener noreferrer nofollow\">\u0432\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438<\/a>. \u0415\u0441\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u043e, \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d \u0432\u0435\u0441 \u0438, \u043f\u0440\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u043a\u0430\u0440\u0442\u044b \u043d\u0430 \u0441\u0442\u043e\u043b\u0435, \u0441\u0447\u0451\u0442 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0432\u0435\u0441\u0443. \u0414\u0435\u0442\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 &#8212; \u0438\u0433\u0440\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u044b \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043e\u0442 -35 \u0434\u043e 35 \u0441 \u0448\u0430\u0433\u043e\u043c 0.5, \u0438, \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u0442\u0430\u043a &#171;\u043f\u043e\u0432\u0435\u0437\u043b\u043e&#187;, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u043f\u043e\u0434\u0440\u044f\u0434, \u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u0447\u0451\u0442 -36, \u0442\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u043c\u0443 \u0441\u0447\u0451\u0442\u0443 (\u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435  \u0441\u0447\u0451\u0442\u0443 -35);<\/p>\n<\/li>\n<li>\n<p><em>\u0411\u0430\u0437\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <\/em><code><em>gymnasium<\/em><\/code><em> + <\/em><code><em>double<\/em><\/code><em> + <\/em><code><em>\u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u0430\u0440\u0442 \u043f\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043b\u044e\u0441-\u043c\u0438\u043d\u0443\u0441<\/em><\/code>. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044e, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u043c\u0443 \u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u0430\u0440\u0442 \u043f\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0435  <code>\u043f\u043e\u043b\u043e\u0432\u0438\u043d\u043a\u0438<\/code>, \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0441\u0430 \u0443 \u043a\u0430\u0440\u0442 [-1, 0, 1] \u0438 \u0448\u0430\u0433 \u043f\u0440\u0438 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0435 \u0440\u0430\u0432\u0435\u043d 1;<\/p>\n<\/li>\n<li>\n<p><em>\u0411\u0430\u0437\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <\/em><code><em>gymnasium<\/em><\/code><em> + <\/em><code><em>double<\/em><\/code><em> + <\/em><code><em>\u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u0430\u0440\u0442 \u043f\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043b\u044e\u0441-\u043c\u0438\u043d\u0443\u0441<\/em><\/code><em> + <\/em><code><em>split<\/em><\/code><em>. <\/em>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u0438\u0433\u0440\u043e\u043a\u0443 \u043f\u0440\u0438\u0448\u043b\u0438 \u0434\u0432\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043a\u0430\u0440\u0442\u044b(\u043b\u0438\u0431\u043e \u0434\u0432\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438), \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0437\u0431\u0438\u0442\u044c \u0440\u0443\u043a\u0443 \u043d\u0430 \u0434\u0432\u0435, \u0432\u043d\u0435\u0441\u0442\u0438 \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u0441\u0442\u0430\u0432\u043a\u0443 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0438\u0433\u0440\u0430\u0442\u044c \u0432 \u0434\u0432\u0435 \u0440\u0443\u043a\u0438 \u0441\u0440\u0430\u0437\u0443 (\u043a\u0430\u043a-\u0431\u0443\u0434\u0442\u043e \u0437\u0430 \u0434\u0432\u043e\u0438\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432);<\/p>\n<\/li>\n<li>\n<p><em>\u0411\u0430\u0437\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u0430 <\/em><code><em>gymnasium<\/em><\/code><em> + <\/em><code><em>double<\/em><\/code><em> + <\/em><code><em>\u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u0430\u0440\u0442 \u043f\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u043a\u0438<\/em><\/code><em> + <\/em><code><em>split<\/em><\/code><em>.<\/em><\/p>\n<\/li>\n<\/ul>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0434\u0432\u0430\u0438\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0432\u043a\u0443 \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u0430\u0440\u0442. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0432 <a href=\"https:\/\/github.com\/lIkesimba9\/blackjack_q_learning\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>.<\/p>\n<pre><code class=\"python\">class BlackjackDoubleCardsCountEnv(BlackjackEnv): # \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u0441\u044f \u043e\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438\u0437 gymnasium.  https:\/\/github.com\/openai\/gym\/blob\/master\/gym\/envs\/toy_text\/blackjack.py     def __init__(self, render_mode: Optional[str] = None, natural=False, sab=False, ...):             super().__init__(render_mode, natural, sab)             ...             self.action_space = spaces.Discrete(3) # \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439             ...     def step(self, action):         ...         elif action == 3:             # \u0434\u0438\u043b\u0435\u0440 \u043d\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u043a\u0430\u0440\u0442\u044b             # \u0434\u0430\u0451\u043c \u0438\u0433\u0440\u043e\u043a\u0443 \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u043a\u0430\u0440\u0442\u0443             ...             # \u0434\u043e\u043c\u043d\u043e\u0436\u0430\u0435\u043c \u043d\u0430\u0433\u0440\u0430\u0434\u0443 \u043d\u0430 2 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u043c \u0438\u0433\u0440\u0443             done = True             reward = cmp(score(self.player), score(self.dealer)) * 2          return self._get_obs(), reward, done, False, {}<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u043a\u0430\u0440\u0442 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043a\u043e\u043b\u043e\u0434\u0443, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432\u0435\u0441\u043e\u0432 <code>mathing<\/code> \u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u043a\u0430\u0440\u0442\u044b <code>cards_count_range<\/code>. \u0422\u0430\u043a\u0436\u0435 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u0439 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0441\u0447\u0451\u0442. \u0410 \u0432 \u0432\u044b\u0437\u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>step,<\/code> \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438, \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0432\u044b\u0434\u0430\u043d\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0443. \u0422\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>_get_obs<\/code> \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>reset,<\/code> \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043c\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u043e\u0434\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u043a\u0430\u0440\u0442 \u0432 \u043a\u043e\u043b\u043e\u0434\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u043d\u044c\u0448\u0435 30.<\/p>\n<pre><code class=\"python\">class BlackjackDoubleCardsCountEnv(BlackjackEnv):      def __init__(self, render_mode: Optional[str] = None, natural=False, sab=False, mathing=None, cards_count_range=np.arange(-35, 35, 0.5)):          self.standart_deck = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10] * 4         # \u0448\u0443\u0437 \u043d\u0430 6 \u043a\u043e\u043b\u043e\u0434         self.deck = self.standart_deck * 6         # '\u0441\u0447\u0435\u0442' \u043a\u0430\u0440\u0442         self.cards_count = 0         # \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0440\u0442         if mathing == None:             self.mathing = { # \u0432\u0435\u0441\u0430 \u043f\u043e \u0441\u0445\u0435\u043c\u0435 \"\u041f\u043e\u043b\u043e\u0432\u0438\u043d\u043a\u0438\"                 1: -1,                 2: 0.5,                 3: 1,                 4: 1,                 5: 1.5,                 6: 1,                 7: 0.5,                 8: 0,                 9: -0.5,                 10: -1,             }         else:              self.mathing = mathing         avilable_count_card_values = cards_count_range         self.map_avilable_count_card_to_state = dict(zip(avilable_count_card_values, range(len(avilable_count_card_values))))         self.observation_space = spaces.Tuple(                                   (spaces.Discrete(32), spaces.Discrete(11), spaces.Discrete(2), spaces.Discrete(len(avilable_count_card_values)))         )          def step(self, action):         ...         if action == any:             self.count(card) # \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438, \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0432\u044b\u0434\u0430\u043d\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0443             #  \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0443 \u0434\u0438\u043b\u0435\u0440\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0435 \u043a\u0430\u0440\u0442\u044b, \u0432 \u043a\u043e\u043d\u0446\u0435 \u0438\u0433\u0440\u044b         ...      def _get_obs(self):         # \u0441\u0447\u0438\u0442\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0430\u0433\u0435\u043d\u0442\u0430 \u043f\u043e \u0441\u0447\u0451\u0442\u0443 \u043d\u0435 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b         # \u0438 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0441\u0447\u0451\u0442 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d          # \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u043a\u0440\u0430\u0439\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435         if self.cards_count in self.map_avilable_count_card_to_state:             cards_count_state = self.map_avilable_count_card_to_state[self.cards_count]         elif self.cards_count &lt; 0:             cards_count_state = 0         <\/code><\/pre>\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-463058","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/463058","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=463058"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/463058\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=463058"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=463058"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=463058"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}