අසම්පූර්ණතොරතුරු සහිත ක්රීඩා වල අවම කිරීම කනගාටු කරන්න (CFR)

කඩදාසි කනගාටුව අසම්පූර්ණ තොරතුරු සහිත ක්රීඩා වල අවම කිරීම ප්රතිවිරුද්ධ කනගාටුව හඳුන්වා දෙන අතර ස්වයං නාට්යය තුළින් ප්රතිවිරුද්ධ කනගාටුව අවම කිරීම නැෂ් සමතුලිතතාවයට ළඟා වීමට භාවිතා කළ හැකි ආකාරය. ඇල්ගොරිතම හැඳින්වෙන්නේ ප්රතිවිරුද්ධ කනගාටුව අවම කිරීම (CFR) ලෙසිනි.

පුළුල් ක්රීඩා වල කනගාටුව අවම කිරීම සඳහා මොන්ටේ කාලෝ නියැදීම කඩදාසි මොන්ටේ කාලෝ ප්රතිවිරුද්ධ කනගාටුව අවම කිරීම (MCCFR) හඳුන්වා දෙයි, එහිදී අපි ක්රීඩා ගසෙන් සාම්පල ලබාගෙන කනගාටුව තක්සේරු කරමු.

අපගේපයිතන් ක්රියාත්මක කිරීම නිබන්ධනයක් මෙන් පහසුවෙන් තේරුම් ගැනීමට අපි උත්සාහ කළෙමු. අපි එය ඉතා සරල අසම්පූර්ණ තොරතුරු ක්රීඩාවක් මත ධාවනය කරමු Kuhn පෝකර් ගහන්න දන්නවානම්.

Open In Colab

Twitter thread ට්විටර් නූල්

හැඳින්වීම

අපිඅහම්බෙන් නියැදීම් (CS) සමඟ මොන්ටේ කාලෝ ප්රතිවිරුද්ධ කනගාටුව අවම කිරීම (MCCFR) ක්රියාත්මක කරමු. එය iteratively, සියලු ක්රීඩකයා ක්රියා උත්සාහ ක්රීඩාව ගස කොටසක් ගවේෂණය, නමුත් අවස්ථාවක් සිදුවීම් නියැදීම්. අවස්ථාවක් සිදුවීම් කාඩ්පත් ගනුදෙනු වැනි දේවල් ය; ඔවුන් නැවත එක් වරක් sampled තබා ඇත. එවිට එය ගණනය කරන්නේ, එක් එක් ක්රියාව සඳහා, එම පියවර ගැනීම වෙනුවට වර්තමාන උපායමාර්ගය අනුගමනය කිරීමේ කනගාටුව . ඉන්පසු එය කනගාටුව ගැලපීම භාවිතා කරමින් ඊළඟ පුනරාවර්තනය සඳහා මෙම කනගාටු මත පදනම් වූ උපාය යාවත්කාලීන කරයි. අවසාන වශයෙන්, එය පුනරාවර්තන පුරා උපාය මාර්ගවල සාමාන්යය ගණනය කරයි, එය අප ප්රමාණවත් පුනරාවර්තන දිව ගියහොත් නැෂ් සමතුලිතතාවයට ඉතා සමීප වේ.

අපිමුලින්ම ගණිතමය අංකනය සහ න්යාය හඳුන්වා දෙන්නෙමු.

ක්රීඩකයා

ක්රීඩකයෙක්විසින් දැක්වේ , ක්රීඩකයන් සමූහයක් කොහෙද.

ඉතිහාසය

ඉතිහාසය යනු ඇතුළු ක්රියා වල අනුක්රමයකි අවස්ථාවක් සිදුවීම්, එය සියලු ඉතිහාසයන්ගේ සමූහයයි.

යනු පර්යන්ත ඉතිහාස සමූහයයි (ක්රීඩාව අවසන්).

ක්රියාව

ක්රියාව , පර්යන්ත නොවන ඉතිහාසයක් කොහේද?

තොරතුරු කට්ටලය

ක්රීඩකයා සඳහාසකසා ඇති තොරතුරු ඉතිහාසයකට සමාන වන නමුත් ක්රීඩකයාට පෙනෙන ක්රියාවන් පමණක් අඩංගු වේ . එනම්, ඉතිහාසයේ ප්රතිවිරුද්ධ ක්රීඩකයාට ගනුදෙනු කරන කාඩ්පත් වැනි ක්රියාවන්/සිදුවීම් අඩංගු වන අතර ඒවා නොලැබෙනු ඇත.

ක්රීඩකයාගේ තොරතුරු කොටස ලෙස හැඳින්වේ .

යනු ලබා දී ඇති තොරතුරු කට්ටලයකට අයත් සියලු ඉතිහාස සමූහයයි; එනම් එම සියලු ඉතිහාසයන් ක්රීඩකයාගේ ඇසට සමාන වේ.

උපායමාර්ගය

ක්රීඩකයාගේඋපාය මාර්ගය , ක්රියාවන්ට වඩා බෙදා හැරීමකි , ක්රීඩකයා සඳහා සියලු උපාය මාර්ග සමූහයක් කොහේද . -th පුනරාවර්තනය පිළිබඳ උපාය මාර්ග මගින් දැක්වේ.

මූලෝපායඅර්ථ දක්වා ඇත්තේ දී ඇති තොරතුරු කට්ටලයක් සඳහා ක්රියාමාර්ගයක් ගැනීමේ සම්භාවිතාවක් ලෙස ය ,

සියලුම ක්රීඩකයන්ගේ උපාය මාර්ග වලින් සමන්විත උපාය මාර්ග පැතිකඩයි

හැර සියලුම ක්රීඩකයන්ගේ උපාය මාර්ග වේ

ඉතිහාසයේසම්භාවිතාව

උපාය මාර්ග පැතිකඩ සමඟ ඉතිහාසය කරා ළඟා වීමේ සම්භාවිතාව වේ. ක්රීඩකයාගේ දායකත්වය නොමැතිව ළඟා වීමේ සම්භාවිතාව; එනම් ක්රීඩකයා අනුගමනය කළ යුතු ක්රියාමාර්ග සම්භාවිතාවක් සමඟ .

පමණක් ක්රීඩකයා දායකත්වය සමග ළඟා වීමේ සම්භාවිතාව වේ. එනම්,

තොරතුරුකට්ටලයක් වෙත ළඟා වීමේ සම්භාවිතාව,

උපයෝගීතාව(ගෙවන්න)

පර්යන්ත උපයෝගීතාව යනු පර්යන්ත ඉතිහාසයක් සඳහා ක්රීඩකයෙකුගේ උපයෝගීතාව (හෝ ගෙවීම) ය.

කොහේද

උපාය මාර්ග පැතිකඩ සහිත ක්රීඩකයා සඳහා අපේක්ෂිත උපයෝගීතාව (ගෙවීම්) වේ.

නැෂ්සමතුලිතතාවය

නැෂ්සමතුලිතතාවය යනු ක්රීඩකයින්ගෙන් කිසිවෙකුට ඔවුන්ගේ උපාය මාර්ගය වෙනස් කිරීමෙන් ඔවුන්ගේ අපේක්ෂිත උපයෝගීතාව (හෝ ගෙවීම්) වැඩි කළ නොහැකි රාජ්යයකි.

ක්රීඩකයන්දෙදෙනෙකු සඳහා, නැෂ් සමතුලිතතාවය යනු උපාය මාර්ගික පැතිකඩකි

-නැෂ් සමතුලිතතාවය,

අවමකිරීම කනගාටු

කනගාටුවවන්නේ උපයෝගීතාව (හෝ ගෙවීම) ක්රීඩකයාට නොලැබුනේ ඇය ප්රශස්ත උපාය මාර්ගයක් අනුගමනය නොකිරීම හෝ හොඳම පියවර ගැනීම නිසාය.

ක්රීඩකයා සඳහා සාමාන්ය සමස්ත කනගාටුව පුනරාවර්තන සෑම වටයකම ප්රශස්ත උපාය අනුගමනය නොකිරීම පිළිබඳ සාමාන්ය කනගාටුවයි.

පුනරාවර්තනයේසියලුම ක්රීඩකයින්ගේ උපාය මාර්ග පැතිකඩ කොහේද , සහ

යනු ක්රීඩකයාගේ උපාය සමඟ ප්රතිස්ථාපනය කරන ලද උපාය මාර්ගයයි.

සාමාන්යඋපායමාර්ගය වන්නේ සෑම වටයකදීම අනුගමනය කරන උපාය මාර්ගවල සාමාන්යයයි

ප්රශස්තඋපායමාර්ගය සමඟ සෙල්ලම් නොකිරීමේ මධ්යන්ය කනගාටුව එයයි.

සියලුමක්රීඩකයින් සඳහා නම් -නැෂ් සමතුලිතතාවයකි.

එයශුන්ය මුදලක් ක්රීඩාවක් බැවින්, අපට එකතු කළ හැකි අතර දෙවන වාරය අවලංගු වේ.

උපාය මාර්ග

සමූහයක් පුරා උපයෝගිතා වල සාමාන්යය සාමාන්ය උපාය මාර්ගයේ උපයෝගීතාවයට සමාන වේ.

එබැවින්,

අර්ථදැක්වීමෙන් ,

එවිට,

මෙය -නැෂ් සමතුලිතතාවයයි. ඔබට ඒ හා සමානව ක්රීඩකයින් 2 කට වඩා ඇති ක්රීඩා සඳහා ඔප්පු කළ හැකිය.

එබැවින්නැෂ් සමතුලිතතාවයකට සමීප වීමට අප අවම කළ යුතුය.

ප්රතිවිරුද්ධකනගාටුව

Counterfactualඅගය ක්රීඩකයා ළඟා වීමට උත්සාහ නම් ක්රීඩකයා සඳහා අපේක්ෂිත උපයෝගීතාව (ක්රියා ගෙන ක සම්භාවිතාව සමග ප්රමුඛ ).

පර්යන්තඉතිහාස කට්ටලය වෙත ළඟා විය හැකි අතර එය දක්වා උපසර්ගය වේ . සිට z වෙත ළඟා වීමේ සම්භාවිතාව වේ.

ක්ෂණිකප්රතිවිරුද්ධ කනගාටුව නම්,

කොහේද

තොරතුරුකට්ටලයේ සෑම විටම පියවර ගැනීම වෙනස් කිරීම සමඟ උපාය පැතිකඩ කොහේද?

පත්රිකාව එය සනාථ කරයි (ප්රමේයය 3),

කොහේද

කනගාටුගැලපීම

උපායමාර්ගයගණනය කරනු ලබන්නේ කනගාටු ගැලපීම භාවිතා කරමිනි.

එක්එක් තොරතුරු කට්ටලය සහ ක්රියාකාරී යුගලය සඳහා කනගාටුව පවත්වා ගෙන යනු ලැබේ,

උපායමාර්ගයගණනය කරනු ලබන්නේ කනගාටු ගැලපීමෙන්,

කොහේද

කඩදාසි අසම්පූර්ණ තොරතුරු සහිත ක්රීඩා වල කනගාටුව අවම කිරීම ඉහත සමීකරණයට අනුව උපාය මාර්ගය තෝරා ගන්නේ නම් ඊට සමානුපාතිකව කුඩා වන බව ඔප්පු කරයි , එබැවින් ළඟා වේ -නෂ් සමතුලිතතාවය.

මොන්ටේකාලෝ CFR (MCCFR)

පරිගණකකරණයටඑක් එක් පුනරාවර්තනයේ සම්පූර්ණ ක්රීඩා ගස පුළුල් කිරීම අවශ්ය වේ.

පුළුල් ක්රීඩා වල කනගාටුව අවම කිරීම සඳහා කඩදාසි මොන්ටේ කාලෝ නියැදීම අපට ක්රීඩා ගසෙන් සාම්පල ලබා ගත හැකි අතර කනගාටුව තක්සේරු කළ හැකිය.

යනු උප කට්ටල සමූහයකි () එහිදී අපි පුනරාවර්තනයක තනි බ්ලොක් එකක් පමණක් දෙස බලමු. සියලුම උප කුලවල සංගමය විහිදේ (). බ්ලොක් තෝරා ගැනීමේ සම්භාවිතාව .

වත්මන් පුනරාවර්තනයේ දී තෝරා ගැනීමේ සම්භාවිතාව; i.e. - කොතැනද එකතුව .

එවිටඅපි වාරණ සිට sampled counterfactual අගය ලබා ,

කඩදාසිබව පෙන්නුම්

සරලසාක්ෂියක් සමඟ.

එබැවින්අපට ක්රීඩා ගසේ කොටසක් සාම්පල ගත කර කනගාටු ගණනය කළ හැකිය. කනගාටුව පිළිබඳ ඇස්තමේන්තුවක් අපි ගණනය කරමු

එක්එක් පුනරාවර්තනයේ උපාය යාවත්කාලීන කිරීමට සහ ගණනය කිරීමට එය භාවිතා කරන්න. අවසාන වශයෙන්, අපි සමස්ත සාමාන්ය උපාය ගණනය කරමු .

මෙන්න කුහ්න් පෝකර් මත CFR උත්සාහ කිරීමට Kuhn පෝකර් ක්රියාත්මක කිරීම.

අපි

කේතයට කිමිදෙමු!

328from typing import NewType, Dict, List, Callable, cast
329
330from labml import monit, tracker, logger, experiment
331from labml.configs import BaseConfigs, option

ක්රීඩකයන්ගේකට්ටලය කොහෙද ක්රීඩකයෙක්

334Player = NewType('Player', int)

ක්රියාව , පර්යන්ත නොවන ඉතිහාසයක් කොහේද?

336Action = NewType('Action', str)

ඉතිහාසය

ඉතිහාසය යනු ඇතුළු ක්රියා වල අනුක්රමයකි අවස්ථාවක් සිදුවීම්, එය සියලු ඉතිහාසයන්ගේ සමූහයයි.

මෙමපන්තිය ක්රීඩා විශේෂිත තර්කනය සමඟ දීර් can කළ යුතුය.

339class History:

එයපර්යන්ත ඉතිහාසයක් වේවා; එනම් ක්රීඩාව අවසන්.

351    def is_terminal(self):
356        raise NotImplementedError()

පර්යන්ත ඉතිහාසයක් සඳහා ක්රීඩකයාගේ උපයෝගීතාව. කොහේද

358    def terminal_utility(self, i: Player) -> float:
364        raise NotImplementedError()

වත්මන්ක්රීඩකයා ලබා ගන්න, විසින් දැක්වේ , එහිදී ක්රීඩකයා උත්සවයලෙස හැඳින්වේ.

වර්තමාන සිදුවීම අවස්ථාවක් අවස්ථාවක් බව එයින් අදහස් කරන්නේ නම්. කාඩ්පත් ගනුදෙනු කිරීම හෝ පෝකර් වල පොදු කාඩ්පත් විවෘත කිරීම වැනි දෙයක්.

366    def player(self) -> Player:
373        raise NotImplementedError()

ඊළඟපියවර අහම්බෙන් පියවරක් වේවා; නව කාඩ්පතක් ගනුදෙනු කිරීම වැනි දෙයක්.

375    def is_chance(self) -> bool:
380        raise NotImplementedError()

කවදාදඅවස්ථාවක් සාම්පලය .

382    def sample_chance(self) -> Action:
386        raise NotImplementedError()

ඉතිහාසයටක්රියාවක් එක් කරන්න.

388    def __add__(self, action: Action):
392        raise NotImplementedError()

වත්මන්ක්රීඩකයා සඳහා තොරතුරු ලබා ගන්න

394    def info_set_key(self) -> str:
398        raise NotImplementedError

වත්මන්ක්රීඩකයා සඳහා නව තොරතුරු කට්ටලයක් සාදන්න

400    def new_info_set(self) -> 'InfoSet':
404        raise NotImplementedError()

මානවකියවිය හැකි නිරූපණය

406    def __repr__(self):
410        raise NotImplementedError()

තොරතුරුකට්ටලය

413class InfoSet:

අද්විතීයයතුර තොරතුරු කට්ටලය හඳුනා ගැනීම

421    key: str

, ක්රීඩකයාගේ උපාය

423    strategy: Dict[Action, float]

එක්එක් පියවර නොගැනීම පිළිබඳ සම්පූර්ණ කනගාටුව ,

පරිගණකඋපාය විට කාලීන කෙසේ හෝ සිදු අවලංගු සිට අපි ඒ වෙනුවට පවත්වාගෙන

438    regret: Dict[Action, float]

සමස්තසාමාන්ය උපායමාර්ගය ගණනය කිරීම සඳහා අපි සමුච්චිත උපාය මාර්ගය පවත්වා ගනිමු

445    cumulative_strategy: Dict[Action, float]

ආරම්භකරන්න

447    def __init__(self, key: str):
451        self.key = key
452        self.regret = {a: 0 for a in self.actions()}
453        self.cumulative_strategy = {a: 0 for a in self.actions()}
454        self.calculate_strategy()

ක්‍රියා

456    def actions(self) -> List[Action]:
460        raise NotImplementedError()

සුරකිනලද ශබ්දකෝෂයකින් තොරතුරු කට්ටලය පූරණය කරන්න

462    @staticmethod
463    def from_dict(data: Dict[str, any]) -> 'InfoSet':
467        raise NotImplementedError()

ශබ්දකෝෂයකට සකසා ඇති තොරතුරු සුරකින්න

469    def to_dict(self):
473        return {
474            'key': self.key,
475            'regret': self.regret,
476            'average_strategy': self.cumulative_strategy,
477        }

සුරකිනලද ශබ්දකෝෂයකින් දත්ත පූරණය කරන්න

479    def load_dict(self, data: Dict[str, any]):
483        self.regret = data['regret']
484        self.cumulative_strategy = data['average_strategy']
485        self.calculate_strategy()

උපායගණනය

කනගාටු ගැලපීමභාවිතා කරමින් වත්මන් උපාය ගණනය කරන්න.

කොහේද

487    def calculate_strategy(self):

506        regret = {a: max(r, 0) for a, r in self.regret.items()}

508        regret_sum = sum(regret.values())

නම් ,

510        if regret_sum > 0:

513            self.strategy = {a: r / regret_sum for a, r in regret.items()}

එසේනොමැති නම්

515        else:

517            count = len(list(a for a in self.regret))

520            self.strategy = {a: 1 / count for a, r in regret.items()}

සාමාන්යඋපාය ලබා ගන්න

522    def get_average_strategy(self):

531        cum_strategy = {a: self.cumulative_strategy.get(a, 0.) for a in self.actions()}

535        strategy_sum = sum(cum_strategy.values())

නම් ,

537        if strategy_sum > 0:

541            return {a: s / strategy_sum for a, s in cum_strategy.items()}

එසේනොමැති නම්

543        else:

545            count = len(list(a for a in cum_strategy))

548            return {a: 1 / count for a, r in cum_strategy.items()}

මානවකියවිය හැකි නිරූපණය

550    def __repr__(self):
554        raise NotImplementedError()

ප්රතිවිරුද්ධකනගාටුව අවම කිරීම (CFR) ඇල්ගොරිතම

අපිඅහම්බෙන් නියැදීම් (සීඑස්) කරන්නෙමු, එහිදී සියලු අවස්ථා සිදුවීම් (නෝඩ්) නියැදි කර ඇති අතර අනෙක් සියලුම සිදුවීම් (නෝඩ්) ගවේෂණය කරනු ලැබේ.

අපිඅහම්බෙන් නියැදීම් සිදු කරන බැවින් එය සියලු පර්යන්ත ඉතිහාසයන් සඳහා සමාන බැවින් මෙම පදය නොසලකා හැරිය හැකි අතර උපාය ගණනය කිරීමේදී එය අවලංගු වේ (සංඛ්යාංකය සහ නිහාකය තුළ පොදු).

557class CFR:

සියලු තොරතුරු කට්ටල කට්ටලයක්.

570    info_sets: Dict[str, InfoSet]
  • create_new_history නව හිස් ඉතිහාසයක් නිර්මාණය කරයි
  • epochs මත පුහුණු කිරීමට පුනරාවර්තන සංඛ්යාව
  • n_players ක්රීඩකයන් සංඛ්යාව
572    def __init__(self, *,
573                 create_new_history: Callable[[], History],
574                 epochs: int,
575                 n_players: int = 2):
581        self.n_players = n_players
582        self.epochs = epochs
583        self.create_new_history = create_new_history

සියලුතොරතුරු කට්ටල කට්ටලයක් සඳහා ශබ්ද කෝෂයක්

585        self.info_sets = {}

විශ්ලේෂණසඳහා ට්රැකර්

587        self.tracker = InfoSetTracker()

දීඇති ඉතිහාසයක් සඳහා වර්තමාන ක්රීඩකයාගේ තොරතුරු කට්ටලය නැවත ලබා දෙයි

589    def _get_info_set(self, h: History):
593        info_set_key = h.info_set_key()
594        if info_set_key not in self.info_sets:
595            self.info_sets[info_set_key] = h.new_info_set()
596        return self.info_sets[info_set_key]

රුක්ඇවිදින්න

මෙමකාර්යය ක්රීඩා ගස ඇවිදිනවා.

  • h වර්තමාන ඉතිහාසය
  • i අපි පරිගණක කනගාටු වන ක්රීඩකයා වේ
  • pi_i වේ
  • pi_neg_i වේ
  • එයඅපේක්ෂිත උපයෝගීතාව නැවත ලබා දෙයි, ඉතිහාසය සඳහා උපසර්ගය සහිත පර්යන්ත ඉතිහාස සමූහයක් කොහේද?

    ටීඇවිදින අතරතුර එය සම්පූර්ණ කනගාටුව යාවත්කාලීන කරයි .

    598    def walk_tree(self, h: History, i: Player, pi_i: float, pi_neg_i: float) -> float:

    එයපර්යන්ත ඉතිහාසයක් නම් පර්යන්ත උපයෝගීතාව නැවත ලබා දෙන්න .

    619        if h.is_terminal():
    620            return h.terminal_utility(i)

    එයඅහම්බෙන් සිදුවීම් නියැදියක් නම් සහ ඊළඟ පියවරට යන්න.

    622        elif h.is_chance():
    623            a = h.sample_chance()
    624            return self.walk_tree(h + a, i, pi_i, pi_neg_i)

    සඳහාවත්මන් ක්රීඩකයාගේ තොරතුරු ලබා ගන්න

    627        I = self._get_info_set(h)

    ගබඩාකිරීමට

    629        v = 0

    එක්එක් ක්රියාව සඳහා ගබඩා කිරීම

    633        va = {}

    සියලුක්රියාවන් හරහා නැවත ක්රියා කරන්න

    636        for a in I.actions():

    වත්මන්ක්රීඩකයා නම් ,

    638            if i == h.player():

    643                va[a] = self.walk_tree(h + a, i, pi_i * I.strategy[a], pi_neg_i)

    එසේනොමැති නම්

    645            else:

    650                va[a] = self.walk_tree(h + a, i, pi_i, pi_neg_i * I.strategy[a])

    655            v = v + I.strategy[a] * va[a]

    වර්තමානක්රීඩකයා නම් , සමුච්චිත උපාය මාර්ග සහ සම්පූර්ණ කනගාටු යාවත්කාලීන කරන්න

    659        if h.player() == i:

    සමුච්චිතඋපාය මාර්ග යාවත්කාලීන කරන්න

    664            for a in I.actions():
    665                I.cumulative_strategy[a] = I.cumulative_strategy[a] + pi_i * I.strategy[a]

    678            for a in I.actions():
    679                I.regret[a] += pi_neg_i * (va[a] - v)

    උපායමාර්ගයයාවත්කාලීන කරන්න

    682            I.calculate_strategy()

    ක්රීඩකයාසඳහා අපේක්ෂිත උපයෝගීතාව ආපසු ලබා දෙන්න ,

    686        return v

    නැවතයාවත්කාලීන කිරීම

    මෙය පුනරාවර්තන සඳහා උපාය මාර්ග යාවත්කාලීන කරයි.

    688    def iterate(self):

    epochs වේලාවන් සඳහා ලූප්

    696        for t in monit.iterate('Train', self.epochs):

    ගසඇවිදින්න සහ එක් එක් ක්රීඩකයා සඳහා කනගාටු යාවත්කාලීන කරන්න

    698            for i in range(self.n_players):
    699                self.walk_tree(self.create_new_history(), cast(Player, i), 1, 1)

    විශ්ලේෂණසඳහා දත්ත ලුහුබඳින්න

    702            tracker.add_global_step()
    703            self.tracker(self.info_sets)
    704            tracker.save()

    සෑම පුනරාවර්තනයක්ම මුරපොලවල් සුරකින්න

    707            if (t + 1) % 1_000 == 0:
    708                experiment.save_checkpoint()

    තොරතුරුකට්ටල මුද්රණය කරන්න

    711        logger.inspect(self.info_sets)

    තොරතුරුකට්ටලයක් ට්රැකර්

    තොරතුරුකට්ටල වලින් දත්ත සොයා ගැනීම සඳහා මෙය කුඩා උපකාරක පන්තියකි

    714class InfoSetTracker:

    සොයාගැනීෙම් දර්ශක

    720    def __init__(self):
    724        tracker.set_histogram(f'strategy.*')
    725        tracker.set_histogram(f'average_strategy.*')
    726        tracker.set_histogram(f'regret.*')

    සියලුමතොරතුරු කට්ටල වලින් දත්ත නිරීක්ෂණය කරන්න

    728    def __call__(self, info_sets: Dict[str, InfoSet]):
    732        for I in info_sets.values():
    733            avg_strategy = I.get_average_strategy()
    734            for a in I.actions():
    735                tracker.add({
    736                    f'strategy.{I.key}.{a}': I.strategy[a],
    737                    f'average_strategy.{I.key}.{a}': avg_strategy[a],
    738                    f'regret.{I.key}.{a}': I.regret[a],
    739                })

    වින්යාසගතකළ හැකි CFR මොඩියුලය

    742class CFRConfigs(BaseConfigs):
    746    create_new_history: Callable[[], History]
    747    epochs: int = 1_00_000
    748    cfr: CFR = 'simple_cfr'

    CFR ඇල්ගොරිතම ආරම්භ කරන්න

    751@option(CFRConfigs.cfr)
    752def simple_cfr(c: CFRConfigs):
    756    return CFR(create_new_history=c.create_new_history,
    757               epochs=c.epochs)