docs/si/cfr/index.html
[View code on Github](https://github.com/labmlai/annotated_deep_learning_paper_implementations/tree/master/labml_nn/cfr/ init.py)
කඩදාසි කනගාටුව අසම්පූර්ණ තොරතුරු සහිත ක්රීඩා වල අවම කිරීම ප්රතිවිරුද්ධ කනගාටුව හඳුන්වා දෙන අතර ස්වයං නාට්යය තුළින් ප්රතිවිරුද්ධ කනගාටුව අවම කිරීම නැෂ් සමතුලිතතාවයට ළඟා වීමට භාවිතා කළ හැකි ආකාරය. ඇල්ගොරිතම හැඳින්වෙන්නේ ප්රතිවිරුද්ධ කනගාටුව අවම කිරීම ( CFR ) ලෙසිනි.
පුළුල් ක්රීඩා වල කනගාටුව අවම කිරීම සඳහා මොන්ටේ කාලෝ නියැදීම කඩදාසි මොන්ටේ කාලෝ ප්රතිවිරුද්ධ කනගාටුව අවම කිරීම ( MCCFR ) හඳුන්වා දෙයි, එහිදී අපි ක්රීඩා ගසෙන් සාම්පල ලබාගෙන කනගාටුව තක්සේරු කරමු.
අපගේපයිතන් ක්රියාත්මක කිරීම නිබන්ධනයක් මෙන් පහසුවෙන් තේරුම් ගැනීමට අපි උත්සාහ කළෙමු. අපි එය ඉතා සරල අසම්පූර්ණ තොරතුරු ක්රීඩාවක් මත ධාවනය කරමු Kuhn පෝකර් ගහන්න දන්නවානම්.
ට්විටර් නූල්
අපිඅහම්බෙන් නියැදීම් (CS) සමඟ මොන්ටේ කාලෝ ප්රතිවිරුද්ධ කනගාටුව අවම කිරීම (MCCFR) ක්රියාත්මක කරමු. එය iteratively, සියලු ක්රීඩකයා ක්රියා උත්සාහ ක්රීඩාව ගස කොටසක් ගවේෂණය, නමුත් අවස්ථාවක් සිදුවීම් නියැදීම්. අවස්ථාවක් සිදුවීම් කාඩ්පත් ගනුදෙනු වැනි දේවල් ය; ඔවුන් නැවත එක් වරක් sampled තබා ඇත. එවිට එය ගණනය කරන්නේ, එක් එක් ක්රියාව සඳහා, එම පියවර ගැනීම වෙනුවට වර්තමාන උපායමාර්ගය අනුගමනය කිරීමේ කනගාටුව . ඉන්පසු එය කනගාටුව ගැලපීම භාවිතා කරමින් ඊළඟ පුනරාවර්තනය සඳහා මෙම කනගාටු මත පදනම් වූ උපාය යාවත්කාලීන කරයි. අවසාන වශයෙන්, එය පුනරාවර්තන පුරා උපාය මාර්ගවල සාමාන්යය ගණනය කරයි, එය අප ප්රමාණවත් පුනරාවර්තන දිව ගියහොත් නැෂ් සමතුලිතතාවයට ඉතා සමීප වේ.
අපිමුලින්ම ගණිතමය අංකනය සහ න්යාය හඳුන්වා දෙන්නෙමු.
ක්රීඩකයෙක්විසින් දැක්වේ i∈N, ක්රීඩකයන් සමූහයක් N කොහෙද.
ඉතිහාසය h∈H යනු ඇතුළු ක්රියා වල අනුක්රමයකි අවස්ථාවක් සිදුවීම්, H එය සියලු ඉතිහාසයන්ගේ සමූහයයි.
Z⊆H යනු පර්යන්ත ඉතිහාස සමූහයයි (ක්රීඩාව අවසන්).
ක්රියාව a, පර්යන්ත h∈H නොවන ඉතිහාසයක් A(h)=a:(h,a)∈Hකොහේද?
ක්රීඩකයා Ii∈Ii සඳහා සකසා ඇති තොරතුරු ඉතිහාසයකට සමාන i වන h∈H නමුත් ක්රීඩකයාට පෙනෙන ක්රියාවන් පමණක් අඩංගු වේ i. එනම්, ඉතිහාසයේ ප්රතිවිරුද්ධ ක්රීඩකයාට ගනුදෙනු h කරන කාඩ්පත් වැනි ක්රියාවන්/සිදුවීම් අඩංගු වන අතර ඒවා Ii නොලැබෙනු ඇත.
Ii ක්රීඩකයාගේ තොරතුරු කොටස ලෙස හැඳින්වේ i.
h∈I යනු ලබා දී ඇති තොරතුරු කට්ටලයකට අයත් සියලු ඉතිහාස සමූහයයි; එනම් එම සියලු ඉතිහාසයන් ක්රීඩකයාගේ ඇසට සමාන වේ.
ක්රීඩකයාගේඋපාය මාර්ගය i, ක්රියාවන්ට වඩා බෙදා σi∈Σi හැරීමකි A(Ii), ක්රීඩකයා සඳහා සියලු උපාය මාර්ග සමූහයක් Σi කොහේද i. t-th පුනරාවර්තනය පිළිබඳ උපාය මාර්ග මගින් σtiදැක්වේ.
මූලෝපායඅර්ථ දක්වා ඇත්තේ a දී ඇති තොරතුරු කට්ටලයක් සඳහා ක්රියාමාර්ගයක් ගැනීමේ සම්භාවිතාවක් ලෙස ය I,
σi(I)(a)
σ සියලුම ක්රීඩකයන්ගේ උපාය මාර්ග වලින් සමන්විත උපාය මාර්ග පැතිකඩයි σ1,σ2,…
σ−i හැර සියලුම ක්රීඩකයන්ගේ උපාය මාර්ග වේ σi
πσ(h) උපාය මාර්ග පැතිකඩ h සමඟ ඉතිහාසය කරා ළඟා වීමේ සම්භාවිතාව σවේ. πσ(h)−i iක්රීඩකයාගේ දායකත්වය h නොමැතිව ළඟා වීමේ සම්භාවිතාව; එනම් i ක්රීඩකයා අනුගමනය කළ යුතු ක්රියාමාර්ග h සම්භාවිතාවක් සමඟ 1.
πσ(h)i පමණක් ක්රීඩකයා iදායකත්වය h සමග ළඟා වීමේ සම්භාවිතාව වේ. එනම්, πσ(h)=πσ(h)iπσ(h)−i
තොරතුරුකට්ටලයක් වෙත ළඟා වීමේ I සම්භාවිතාව, πσ(I)=h∈I∑πσ(h)
පර්යන්ත උපයෝගීතාව යනු පර්යන්ත ඉතිහාසයක් i සඳහා ක්රීඩකයෙකුගේ උපයෝගීතාව (හෝ ගෙවීම) hය.
ui(h) කොහේද h∈Z
ui(σ) උපාය මාර්ග පැතිකඩ i සහිත ක්රීඩකයා සඳහා අපේක්ෂිත උපයෝගීතාව (ගෙවීම්) σවේ.
ui(σ)=h∈Z∑ui(h)πσ(h)
නැෂ්සමතුලිතතාවය යනු ක්රීඩකයින්ගෙන් කිසිවෙකුට ඔවුන්ගේ උපාය මාර්ගය වෙනස් කිරීමෙන් ඔවුන්ගේ අපේක්ෂිත උපයෝගීතාව (හෝ ගෙවීම්) වැඩි කළ නොහැකි රාජ්යයකි.
ක්රීඩකයන්දෙදෙනෙකු සඳහා, නැෂ් සමතුලිතතාවය යනු උපාය මාර්ගික පැතිකඩකි
u1(σ)u2(σ)≥maxσ1′∈Σ1u1(σ1′,σ2)≥maxσ2′∈Σ2u1(σ1,σ2′)
ϵ-නැෂ් සමතුලිතතාවය,
u1(σ)+ϵu2(σ)+ϵ≥maxσ1′∈Σ1u1(σ1′,σ2)≥maxσ2′∈Σ2u1(σ1,σ2′)
කනගාටුවවන්නේ උපයෝගීතාව (හෝ ගෙවීම) ක්රීඩකයාට නොලැබුනේ ඇය ප්රශස්ත උපාය මාර්ගයක් අනුගමනය නොකිරීම හෝ හොඳම පියවර ගැනීම නිසාය.
ක්රීඩකයා i සඳහා සාමාන්ය සමස්ත කනගාටුව පුනරාවර්තන සෑම T වටයකම ප්රශස්ත උපාය අනුගමනය නොකිරීම පිළිබඳ සාමාන්ය කනගාටුවයි.
RiT=T1maxσi∗∈Σit=1∑T(ui(σi∗,σt−i)−ui(σt))
පුනරාවර්තනයේසියලුම ක්රීඩකයින්ගේ උපාය මාර්ග පැතිකඩ σt කොහේද t, සහ
(σi∗,σt−i)
යනු iක්රීඩකයාගේ උපාය σt සමඟ ප්රතිස්ථාපනය කරන ලද උපාය σi∗මාර්ගයයි.
සාමාන්යඋපායමාර්ගය වන්නේ සෑම වටයකදීම අනුගමනය කරන උපාය මාර්ගවල සාමාන්යයයි I∈I,a∈A(I)
σˉiT(I)(a)=∑t=1Tπiσt(I)∑t=1Tπiσt(I)σt(I)(a)
ප්රශස්තඋපායමාර්ගය සමඟ සෙල්ලම් නොකිරීමේ මධ්යන්ය කනගාටුව එයයි.
සියලුමක්රීඩකයින් RiT<ϵ සඳහා නම් 2ϵ-නැෂ් සමතුලිතතාවයකි. σˉiT(I)(a)
RiTRiT<ϵ=T1maxσi∗∈Σit=1∑T(ui(σi∗,σt−i)−ui(σt))=T1maxσi∗∈Σit=1∑Tui(σi∗,σt−i)−T1t=1∑Tui(σt)<ϵ
එයශුන්ය මුදලක් ක්රීඩාවක් u1=−u2 බැවින්, අපට එකතු කළ හැකි R1T RiT අතර දෙවන වාරය අවලංගු වේ.
2ϵ>T1maxσ1∗∈Σ1t=1∑Tu1(σ1∗,σt−1)+T1maxσ2∗∈Σ2t=1∑Tu2(σ2∗,σt−2)උපාය මාර්ග
සමූහයක් පුරා උපයෝගිතා වල සාමාන්යය සාමාන්ය උපාය මාර්ගයේ උපයෝගීතාවයට සමාන වේ.
T1t=1∑Tui(σt)=ui(σˉT)
එබැවින්,
2ϵ>maxσ1∗∈Σ1u1(σ1∗,σˉ−1T)+maxσ2∗∈Σ2u2(σ2∗,σˉ−2T)
අර්ථදැක්වීමෙන් max, maxσ2∗∈Σ2u2(σ2∗,σˉ−2T)≥u2(σˉT)=−u1(σˉT)
එවිට,
2ϵu1(σˉT)+2ϵ>maxσ1∗∈Σ1u1(σ1∗,σˉ−1T)+−u1(σˉT)>maxσ1∗∈Σ1u1(σ1∗,σˉ−1T)
මෙය 2ϵ-නැෂ් සමතුලිතතාවයයි. ඔබට ඒ හා සමානව ක්රීඩකයින් 2 කට වඩා ඇති ක්රීඩා සඳහා ඔප්පු කළ හැකිය.
එබැවින්නැෂ් සමතුලිතතාවයකට සමීප RiT වීමට අප අවම කළ යුතුය.
Counterfactualඅගය vi(σ,I) ක්රීඩකයා ළඟා වීමට i උත්සාහ i නම් ක්රීඩකයා සඳහා අපේක්ෂිත උපයෝගීතාව I (ක්රියා ගෙන ක සම්භාවිතාව I සමග ප්රමුඛ 1).
vi(σ,I)=z∈ZI∑πσ−i(z[I])πσ(z[I],z)ui(z)
පර්යන්තඉතිහාස කට්ටලය වෙත ළඟා විය හැකි Iඅතර z[I] එය z දක්වා උපසර්ගය වේ ZI I. πσ(z[I],z) සිට z වෙත ළඟා වීමේ සම්භාවිතාව z[I]වේ.
ක්ෂණිකප්රතිවිරුද්ධ කනගාටුව නම්,
Ri,immT(I)=maxa∈AIRi,immT(I,a)
කොහේද
Ri,immT(I)=T1t=1∑T(vi(σt∣I→a,I)−vi(σt,I))
තොරතුරුකට්ටලයේ σ∣I→a සෑම විටම පියවර a ගැනීම වෙනස් කිරීම σ සමඟ උපාය පැතිකඩ Iකොහේද?
පත්රිකාව එය සනාථ කරයි (ප්රමේයය 3),
RiT≤I∈I∑Ri,immT,+(I) කොහේද Ri,immT,+(I)=max(Ri,immT(I),0)
උපායමාර්ගයගණනය කරනු ලබන්නේ කනගාටු ගැලපීම භාවිතා කරමිනි.
එක්එක් තොරතුරු කට්ටලය සහ ක්රියාකාරී යුගලය සඳහා කනගාටුව පවත්වා ගෙන RiT(I,a) යනු ලැබේ,
rit(I,a)RiT(I,a)=vi(σt∣I→a,I)−vi(σt,I)=T1t=1∑Trit(I,a)
උපායමාර්ගයගණනය කරනු ලබන්නේ කනගාටු ගැලපීමෙන්,
σiT+1(I)(a)=⎩⎨⎧∑a′∈A(I)RiT,+(I,a′)RiT,+(I,a),∣A(I)∣1,if∑a′∈A(I)RiT,+(I,a′)>0otherwise
කොහේද RiT,+(I,a)=max(RiT(I,a),0)
කඩදාසි අසම්පූර්ණ තොරතුරු සහිත ක්රීඩා වල කනගාටුව අවම කිරීම ඉහත සමීකරණයට අනුව උපාය මාර්ගය තෝරා RiT ගන්නේ නම් ඊට සමානුපාතිකව කුඩා වන බව ඔප්පු කරයි T1, එබැවින් ළඟා වේ ϵ-නෂ් සමතුලිතතාවය.
පරිගණකකරණයටඑක් එක් පුනරාවර්තනයේ සම්පූර්ණ ක්රීඩා ගස පුළුල් කිරීම rit(I,a) අවශ්ය වේ.
පුළුල් ක්රීඩා වල කනගාටුව අවම කිරීම සඳහා කඩදාසි මොන්ටේ කාලෝ නියැදීම අපට ක්රීඩා ගසෙන් සාම්පල ලබා ගත හැකි අතර කනගාටුව තක්සේරු කළ හැකිය.
Q=Q1,…,Qr යනු උප කට්ටල සමූහයකි Z (Qj⊆Z) එහිදී අපි පුනරාවර්තනයක තනි බ්ලොක් Qj එකක් පමණක් දෙස බලමු. සියලුම උප කුලවල සංගමය විහිදේ Z (Q1∩…∩Qr=Z). qj බ්ලොක් තෝරා ගැනීමේ සම්භාවිතාව Qj.
q(z) වත්මන් පුනරාවර්තනයේ z දී තෝරා ගැනීමේ සම්භාවිතාව; i.e. q(z)=∑j:z∈Qjqj - qj කොතැනද එකතුව z∈Qj.
එවිටඅපි වාරණ සිට sampled counterfactual අගය ලබා j,
v~(σ,I∣j)=z∈Qj∑q(z)1πσ−i(z[I])πσ(z[I],z)ui(z)
කඩදාසිබව පෙන්නුම්
Ej∼qj[v~(σ,I∣j)]=vi(σ,I)
සරලසාක්ෂියක් සමඟ.
එබැවින්අපට ක්රීඩා ගසේ කොටසක් සාම්පල ගත කර කනගාටු ගණනය කළ හැකිය. කනගාටුව පිළිබඳ ඇස්තමේන්තුවක් අපි ගණනය කරමු
rit(I,a)=vi(σt∣I→a,I)−v~i(σt,I)
එක්එක් පුනරාවර්තනයේ උපාය σiT+1(I)(a) යාවත්කාලීන කිරීමට RiT(I,a) සහ ගණනය කිරීමට එය භාවිතා කරන්න. අවසාන වශයෙන්, අපි සමස්ත සාමාන්ය උපාය ගණනය කරමු σˉiT(I)(a).
මෙන්න කුහ්න් පෝකර් මත CFR උත්සාහ කිරීමට Kuhn පෝකර් ක්රියාත්මක කිරීම.
අපි
කේතයට කිමිදෙමු!
328fromtypingimportNewType,Dict,List,Callable,cast329330fromlabmlimportmonit,tracker,logger,experiment331fromlabml.configsimportBaseConfigs,option
ක්රීඩකයන්ගේකට්ටලය i∈N N කොහෙද ක්රීඩකයෙක්
334Player=NewType('Player',int)
ක්රියාව a, පර්යන්ත h∈H නොවන ඉතිහාසයක් A(h)=a:(h,a)∈H කොහේද?
336Action=NewType('Action',str)
ඉතිහාසය h∈H යනු ඇතුළු ක්රියා වල අනුක්රමයකි අවස්ථාවක් සිදුවීම්, H එය සියලු ඉතිහාසයන්ගේ සමූහයයි.
මෙමපන්තිය ක්රීඩා විශේෂිත තර්කනය සමඟ දීර් can කළ යුතුය.
339classHistory:
එයපර්යන්ත ඉතිහාසයක් වේවා; එනම් ක්රීඩාව අවසන්. h∈Z
351defis\_terminal(self):
356raiseNotImplementedError()
පර්යන්ත ඉතිහාසයක් i සඳහා ක්රීඩකයාගේ උපයෝගීතාව. ui(h) කොහේද h∈Z
358defterminal\_utility(self,i:Player)-\>float:
364raiseNotImplementedError()
වත්මන්ක්රීඩකයා ලබා ගන්න, විසින් දැක්වේ P(h), එහිදී ක්රීඩකයා උත්සවය ලෙස P හැඳින්වේ.
වර්තමාන c සිදුවීම අවස්ථාවක් අවස්ථාවක් බව P(h)=c එයින් අදහස් කරන්නේ නම්. කාඩ්පත් ගනුදෙනු කිරීම හෝ පෝකර් වල පොදු කාඩ්පත් විවෘත කිරීම වැනි දෙයක්.
366defplayer(self)-\>Player:
373raiseNotImplementedError()
ඊළඟපියවර අහම්බෙන් පියවරක් වේවා; නව කාඩ්පතක් ගනුදෙනු කිරීම වැනි දෙයක්. P(h)=c
375defis\_chance(self)-\>bool:
380raiseNotImplementedError()
කවදාදඅවස්ථාවක් සාම්පලය P(h)=c.
382defsample\_chance(self)-\>Action:
386raiseNotImplementedError()
ඉතිහාසයටක්රියාවක් එක් කරන්න.
388def\_\_add\_\_(self,action:Action):
392raiseNotImplementedError()
වත්මන්ක්රීඩකයා සඳහා තොරතුරු ලබා ගන්න
394definfo\_set\_key(self)-\>str:
398raiseNotImplementedError
වත්මන්ක්රීඩකයා සඳහා නව තොරතුරු කට්ටලයක් සාදන්න
400defnew\_info\_set(self)-\>'InfoSet':
404raiseNotImplementedError()
මානවකියවිය හැකි නිරූපණය
406def\_\_repr\_\_(self):
410raiseNotImplementedError()
413classInfoSet:
අද්විතීයයතුර තොරතුරු කට්ටලය හඳුනා ගැනීම
421key:str
σi, ක්රීඩකයාගේ උපාය i
423strategy:Dict[Action,float]
එක්එක් පියවර නොගැනීම පිළිබඳ සම්පූර්ණ කනගාටුව A(Ii),
rit(I,a)RiT(I,a)=vi(σt∣I→a,I)−vi(σt,I)=T1t=1∑Trit(I,a)
පරිගණකඋපාය විට T1 කාලීන කෙසේ හෝ සිදු අවලංගු RiT(I,a) සිට අපි TRiT(I,a) ඒ වෙනුවට පවත්වාගෙන σiT+1(I)(a)
438regret:Dict[Action,float]
සමස්තසාමාන්ය උපායමාර්ගය ගණනය t=1∑Tπiσt(I)σt(I)(a) කිරීම සඳහා අපි සමුච්චිත උපාය මාර්ගය පවත්වා ගනිමු
σˉiT(I)(a)=∑t=1Tπiσt(I)∑t=1Tπiσt(I)σt(I)(a)
445cumulative\_strategy:Dict[Action,float]
ආරම්භකරන්න
447def\_\_init\_\_(self,key:str):
451self.key=key452self.regret={a:0forainself.actions()}453self.cumulative\_strategy={a:0forainself.actions()}454self.calculate\_strategy()
ක්රියා A(Ii)
456defactions(self)-\>List[Action]:
460raiseNotImplementedError()
සුරකිනලද ශබ්දකෝෂයකින් තොරතුරු කට්ටලය පූරණය කරන්න
462@staticmethod463deffrom\_dict(data:Dict[str,any])-\>'InfoSet':
467raiseNotImplementedError()
ශබ්දකෝෂයකට සකසා ඇති තොරතුරු සුරකින්න
469defto\_dict(self):
473return{474'key':self.key,475'regret':self.regret,476'average\_strategy':self.cumulative\_strategy,477}
සුරකිනලද ශබ්දකෝෂයකින් දත්ත පූරණය කරන්න
479defload\_dict(self,data:Dict[str,any]):
483self.regret=data['regret']484self.cumulative\_strategy=data['average\_strategy']485self.calculate\_strategy()
කනගාටු ගැලපීමභාවිතා කරමින් වත්මන් උපාය ගණනය කරන්න.
σiT+1(I)(a)=⎩⎨⎧∑a′∈A(I)RiT,+(I,a′)RiT,+(I,a),∣A(I)∣1,if∑a′∈A(I)RiT,+(I,a′)>0otherwise
කොහේද RiT,+(I,a)=max(RiT(I,a),0)
487defcalculate\_strategy(self):
RiT,+(I,a)=max(RiT(I,a),0)
506regret={a:max(r,0)fora,rinself.regret.items()}
a′∈A(I)∑RiT,+(I,a′)
508regret\_sum=sum(regret.values())
නම් ∑a′∈A(I)RiT,+(I,a′)>0,
510ifregret\_sum\>0:
σiT+1(I)(a)=∑a′∈A(I)RiT,+(I,a′)RiT,+(I,a)
513self.strategy={a:r/regret\_sumfora,rinregret.items()}
එසේනොමැති නම්
515else:
∣A(I)∣
517count=len(list(aforainself.regret))
σiT+1(I)(a)=∣A(I)∣1
520self.strategy={a:1/countfora,rinregret.items()}
σˉiT(I)(a)=∑t=1Tπiσt(I)∑t=1Tπiσt(I)σt(I)(a)
522defget\_average\_strategy(self):
t=1∑Tπiσt(I)σt(I)(a)
531cum\_strategy={a:self.cumulative\_strategy.get(a,0.)forainself.actions()}
t=1∑Tπiσt(I)=a∈A(I)∑t=1∑Tπiσt(I)σt(I)(a)
535strategy\_sum=sum(cum\_strategy.values())
නම් ∑t=1Tπiσt(I)>0,
537ifstrategy\_sum\>0:
σˉiT(I)(a)=∑t=1Tπiσt(I)∑t=1Tπiσt(I)σt(I)(a)
541return{a:s/strategy\_sumfora,sincum\_strategy.items()}
එසේනොමැති නම්
543else:
∣A(I)∣
545count=len(list(aforaincum\_strategy))
σˉiT(I)(a)=∣A(I)∣1
548return{a:1/countfora,rincum\_strategy.items()}
මානවකියවිය හැකි නිරූපණය
550def\_\_repr\_\_(self):
554raiseNotImplementedError()
අපිඅහම්බෙන් නියැදීම් ( සීඑස් ) කරන්නෙමු, එහිදී සියලු අවස්ථා සිදුවීම් (නෝඩ්) නියැදි කර ඇති අතර අනෙක් සියලුම සිදුවීම් (නෝඩ්) ගවේෂණය කරනු ලැබේ.
අපිඅහම්බෙන් නියැදීම් සිදු කරන q(z) බැවින් එය සියලු පර්යන්ත ඉතිහාසයන් සඳහා සමාන බැවින් මෙම පදය නොසලකා හැරිය හැකි අතර උපාය ගණනය කිරීමේදී එය අවලංගු වේ (සංඛ්යාංකය සහ නිහාකය තුළ පොදු).
557classCFR:
I සියලු තොරතුරු කට්ටල කට්ටලයක්.
570info\_sets:Dict[str,InfoSet]
create_new_history නව හිස් ඉතිහාසයක් නිර්මාණය කරයිepochs මත පුහුණු කිරීමට පුනරාවර්තන සංඛ්යාව Tn_players ක්රීඩකයන් සංඛ්යාව572def\_\_init\_\_(self,\*,573create\_new\_history:Callable[[],History],574epochs:int,575n\_players:int=2):
581self.n\_players=n\_players582self.epochs=epochs583self.create\_new\_history=create\_new\_history
සියලුතොරතුරු කට්ටල I කට්ටලයක් සඳහා ශබ්ද කෝෂයක්
585self.info\_sets={}
විශ්ලේෂණසඳහා ට්රැකර්
587self.tracker=InfoSetTracker()
දීඇති ඉතිහාසයක් සඳහා වර්තමාන ක්රීඩකයාගේ තොරතුරු කට්ටලය I නැවත ලබා දෙයි h
589def\_get\_info\_set(self,h:History):
593info\_set\_key=h.info\_set\_key()594ifinfo\_set\_keynotinself.info\_sets:595self.info\_sets[info\_set\_key]=h.new\_info\_set()596returnself.info\_sets[info\_set\_key]
මෙමකාර්යය ක්රීඩා ගස ඇවිදිනවා.
එයඅපේක්ෂිත උපයෝගීතාව නැවත ලබා දෙයි, ඉතිහාසය සඳහා උපසර්ගය සහිත පර්යන්ත ඉතිහාස සමූහයක් h z∈Zh∑πσ(h,z)ui(z) Zh කොහේද? h
ටීඇවිදින අතරතුර එය සම්පූර්ණ කනගාටුව යාවත්කාලීන කරයි RiT(I,a).
598defwalk\_tree(self,h:History,i:Player,pi\_i:float,pi\_neg\_i:float)-\>float:
එයපර්යන්ත ඉතිහාසයක් නම් පර්යන්ත උපයෝගීතාව h∈Z නැවත ලබා දෙන්න ui(h).
619ifh.is\_terminal():620returnh.terminal\_utility(i)
එයඅහම්බෙන් සිදුවීම් P(h)=c නියැදියක් නම් සහ ඊළඟ පියවරට යන්න.
622elifh.is\_chance():623a=h.sample\_chance()624returnself.walk\_tree(h+a,i,pi\_i,pi\_neg\_i)
සඳහාවත්මන් ක්රීඩකයාගේ තොරතුරු ලබා ගන්න h
627I=self.\_get\_info\_set(h)
ගබඩාකිරීමට ∑z∈Zhπσ(h,z)ui(z)
629v=0
එක්එක් ක්රියාව z∈Zh∑πσt∣I→a(h,z)ui(z) සඳහා ගබඩා කිරීම a∈A(h)
633va={}
සියලුක්රියාවන් හරහා නැවත ක්රියා කරන්න
636forainI.actions():
වත්මන්ක්රීඩකයා නම් i,
638ifi==h.player():
# πiσt(h+a)π−iσt(h+a)=πiσt(h)σti(I)(a)=π−iσt(h)
643va[a]=self.walk\_tree(h+a,i,pi\_i\*I.strategy[a],pi\_neg\_i)
එසේනොමැති නම්
645else:
# πiσt(h+a)π−iσt(h+a)=πiσt(h)=π−iσt(h)∗σti(I)(a)
650va[a]=self.walk\_tree(h+a,i,pi\_i,pi\_neg\_i\*I.strategy[a])
z∈Zh∑πσ(h,z)ui(z)=a∈A(I)∑[σti(I)(a)z∈Zh∑πσt∣I→a(h,z)ui(z)]
655v=v+I.strategy[a]\*va[a]
වර්තමානක්රීඩකයා නම් i, සමුච්චිත උපාය මාර්ග සහ සම්පූර්ණ කනගාටු යාවත්කාලීන කරන්න
659ifh.player()==i:
සමුච්චිතඋපාය මාර්ග යාවත්කාලීන කරන්න t=1∑Tπiσt(I)σt(I)(a)=t=1∑T[h∈I∑πiσt(h)σt(I)(a)]
664forainI.actions():665I.cumulative\_strategy[a]=I.cumulative\_strategy[a]+pi\_i\*I.strategy[a]
#
rit(I,a)TRiT(I,a)=vi(σt∣I→a,I)−vi(σt,I)=π−iσt(h)(z∈Zh∑πσt∣I→a(h,z)ui(z)−z∈Zh∑πσ(h,z)ui(z))=t=1∑Trit(I,a)
678forainI.actions():679I.regret[a]+=pi\_neg\_i\*(va[a]-v)
උපායමාර්ගයයාවත්කාලීන කරන්න σt(I)(a)
682I.calculate\_strategy()
ක්රීඩකයාසඳහා අපේක්ෂිත උපයෝගීතාව ආපසු ලබා දෙන්න i, z∈Zh∑πσ(h,z)ui(z)
686returnv
මෙය T පුනරාවර්තන සඳහා උපාය මාර්ග යාවත්කාලීන කරයි.
688defiterate(self):
epochs වේලාවන් සඳහා ලූප්
696fortinmonit.iterate('Train',self.epochs):
ගසඇවිදින්න සහ එක් එක් ක්රීඩකයා සඳහා කනගාටු යාවත්කාලීන කරන්න
698foriinrange(self.n\_players):699self.walk\_tree(self.create\_new\_history(),cast(Player,i),1,1)
විශ්ලේෂණසඳහා දත්ත ලුහුබඳින්න
702tracker.add\_global\_step()703self.tracker(self.info\_sets)704tracker.save()
සෑම 1,000 පුනරාවර්තනයක්ම මුරපොලවල් සුරකින්න
707if(t+1)%1\_000==0:708experiment.save\_checkpoint()
තොරතුරුකට්ටල මුද්රණය කරන්න
711logger.inspect(self.info\_sets)
තොරතුරුකට්ටල වලින් දත්ත සොයා ගැනීම සඳහා මෙය කුඩා උපකාරක පන්තියකි
714classInfoSetTracker:
සොයාගැනීෙම් දර්ශක
720def\_\_init\_\_(self):
724tracker.set\_histogram(f'strategy.\*')725tracker.set\_histogram(f'average\_strategy.\*')726tracker.set\_histogram(f'regret.\*')
සියලුමතොරතුරු කට්ටල වලින් දත්ත නිරීක්ෂණය කරන්න
728def\_\_call\_\_(self,info\_sets:Dict[str,InfoSet]):
732forIininfo\_sets.values():733avg\_strategy=I.get\_average\_strategy()734forainI.actions():735tracker.add({736f'strategy.{I.key}.{a}':I.strategy[a],737f'average\_strategy.{I.key}.{a}':avg\_strategy[a],738f'regret.{I.key}.{a}':I.regret[a],739})
742classCFRConfigs(BaseConfigs):
746create\_new\_history:Callable[[],History]747epochs:int=1\_00\_000748cfr:CFR='simple\_cfr'
CFR ඇල්ගොරිතම ආරම්භ කරන්න
751@option(CFRConfigs.cfr)752defsimple\_cfr(c:CFRConfigs):
756returnCFR(create\_new\_history=c.create\_new\_history,757epochs=c.epochs)