කඩදාසි කනගාටුව අසම්පූර්ණ තොරතුරු සහිත ක්රීඩා වල අවම කිරීම ප්රතිවිරුද්ධ කනගාටුව හඳුන්වා දෙන අතර ස්වයං නාට්යය තුළින් ප්රතිවිරුද්ධ කනගාටුව අවම කිරීම නැෂ් සමතුලිතතාවයට ළඟා වීමට භාවිතා කළ හැකි ආකාරය. ඇල්ගොරිතම හැඳින්වෙන්නේ ප්රතිවිරුද්ධ කනගාටුව අවම කිරීම (CFR) ලෙසිනි.
පුළුල් ක්රීඩා වල කනගාටුව අවම කිරීම සඳහා මොන්ටේ කාලෝ නියැදීම කඩදාසි මොන්ටේ කාලෝ ප්රතිවිරුද්ධ කනගාටුව අවම කිරීම (MCCFR) හඳුන්වා දෙයි, එහිදී අපි ක්රීඩා ගසෙන් සාම්පල ලබාගෙන කනගාටුව තක්සේරු කරමු.
අපගේපයිතන් ක්රියාත්මක කිරීම නිබන්ධනයක් මෙන් පහසුවෙන් තේරුම් ගැනීමට අපි උත්සාහ කළෙමු. අපි එය ඉතා සරල අසම්පූර්ණ තොරතුරු ක්රීඩාවක් මත ධාවනය කරමු Kuhn පෝකර් ගහන්න දන්නවානම්.
අපිඅහම්බෙන් නියැදීම් (CS) සමඟ මොන්ටේ කාලෝ ප්රතිවිරුද්ධ කනගාටුව අවම කිරීම (MCCFR) ක්රියාත්මක කරමු. එය iteratively, සියලු ක්රීඩකයා ක්රියා උත්සාහ ක්රීඩාව ගස කොටසක් ගවේෂණය, නමුත් අවස්ථාවක් සිදුවීම් නියැදීම්. අවස්ථාවක් සිදුවීම් කාඩ්පත් ගනුදෙනු වැනි දේවල් ය; ඔවුන් නැවත එක් වරක් sampled තබා ඇත. එවිට එය ගණනය කරන්නේ, එක් එක් ක්රියාව සඳහා, එම පියවර ගැනීම වෙනුවට වර්තමාන උපායමාර්ගය අනුගමනය කිරීමේ කනගාටුව . ඉන්පසු එය කනගාටුව ගැලපීම භාවිතා කරමින් ඊළඟ පුනරාවර්තනය සඳහා මෙම කනගාටු මත පදනම් වූ උපාය යාවත්කාලීන කරයි. අවසාන වශයෙන්, එය පුනරාවර්තන පුරා උපාය මාර්ගවල සාමාන්යය ගණනය කරයි, එය අප ප්රමාණවත් පුනරාවර්තන දිව ගියහොත් නැෂ් සමතුලිතතාවයට ඉතා සමීප වේ.
අපිමුලින්ම ගණිතමය අංකනය සහ න්යාය හඳුන්වා දෙන්නෙමු.
ක්රීඩකයෙක්විසින් දැක්වේ , ක්රීඩකයන් සමූහයක් කොහෙද.
ඉතිහාසය යනු ඇතුළු ක්රියා වල අනුක්රමයකි අවස්ථාවක් සිදුවීම්, එය සියලු ඉතිහාසයන්ගේ සමූහයයි.
යනු පර්යන්ත ඉතිහාස සමූහයයි (ක්රීඩාව අවසන්).
ක්රියාව , පර්යන්ත නොවන ඉතිහාසයක් කොහේද?
ක්රීඩකයා සඳහාසකසා ඇති තොරතුරු ඉතිහාසයකට සමාන වන නමුත් ක්රීඩකයාට පෙනෙන ක්රියාවන් පමණක් අඩංගු වේ . එනම්, ඉතිහාසයේ ප්රතිවිරුද්ධ ක්රීඩකයාට ගනුදෙනු කරන කාඩ්පත් වැනි ක්රියාවන්/සිදුවීම් අඩංගු වන අතර ඒවා නොලැබෙනු ඇත.
ක්රීඩකයාගේ තොරතුරු කොටස ලෙස හැඳින්වේ .
යනු ලබා දී ඇති තොරතුරු කට්ටලයකට අයත් සියලු ඉතිහාස සමූහයයි; එනම් එම සියලු ඉතිහාසයන් ක්රීඩකයාගේ ඇසට සමාන වේ.
ක්රීඩකයාගේඋපාය මාර්ගය , ක්රියාවන්ට වඩා බෙදා හැරීමකි , ක්රීඩකයා සඳහා සියලු උපාය මාර්ග සමූහයක් කොහේද . -th පුනරාවර්තනය පිළිබඳ උපාය මාර්ග මගින් දැක්වේ.
මූලෝපායඅර්ථ දක්වා ඇත්තේ දී ඇති තොරතුරු කට්ටලයක් සඳහා ක්රියාමාර්ගයක් ගැනීමේ සම්භාවිතාවක් ලෙස ය ,
සියලුම ක්රීඩකයන්ගේ උපාය මාර්ග වලින් සමන්විත උපාය මාර්ග පැතිකඩයි
හැර සියලුම ක්රීඩකයන්ගේ උපාය මාර්ග වේ
උපාය මාර්ග පැතිකඩ සමඟ ඉතිහාසය කරා ළඟා වීමේ සම්භාවිතාව වේ. ක්රීඩකයාගේ දායකත්වය නොමැතිව ළඟා වීමේ සම්භාවිතාව; එනම් ක්රීඩකයා අනුගමනය කළ යුතු ක්රියාමාර්ග සම්භාවිතාවක් සමඟ .
පමණක් ක්රීඩකයා දායකත්වය සමග ළඟා වීමේ සම්භාවිතාව වේ. එනම්,
තොරතුරුකට්ටලයක් වෙත ළඟා වීමේ සම්භාවිතාව,
පර්යන්ත උපයෝගීතාව යනු පර්යන්ත ඉතිහාසයක් සඳහා ක්රීඩකයෙකුගේ උපයෝගීතාව (හෝ ගෙවීම) ය.
කොහේද
උපාය මාර්ග පැතිකඩ සහිත ක්රීඩකයා සඳහා අපේක්ෂිත උපයෝගීතාව (ගෙවීම්) වේ.
නැෂ්සමතුලිතතාවය යනු ක්රීඩකයින්ගෙන් කිසිවෙකුට ඔවුන්ගේ උපාය මාර්ගය වෙනස් කිරීමෙන් ඔවුන්ගේ අපේක්ෂිත උපයෝගීතාව (හෝ ගෙවීම්) වැඩි කළ නොහැකි රාජ්යයකි.
ක්රීඩකයන්දෙදෙනෙකු සඳහා, නැෂ් සමතුලිතතාවය යනු උපාය මාර්ගික පැතිකඩකි
-නැෂ් සමතුලිතතාවය,
කනගාටුවවන්නේ උපයෝගීතාව (හෝ ගෙවීම) ක්රීඩකයාට නොලැබුනේ ඇය ප්රශස්ත උපාය මාර්ගයක් අනුගමනය නොකිරීම හෝ හොඳම පියවර ගැනීම නිසාය.
ක්රීඩකයා සඳහා සාමාන්ය සමස්ත කනගාටුව පුනරාවර්තන සෑම වටයකම ප්රශස්ත උපාය අනුගමනය නොකිරීම පිළිබඳ සාමාන්ය කනගාටුවයි.
පුනරාවර්තනයේසියලුම ක්රීඩකයින්ගේ උපාය මාර්ග පැතිකඩ කොහේද , සහ
යනු ක්රීඩකයාගේ උපාය සමඟ ප්රතිස්ථාපනය කරන ලද උපාය මාර්ගයයි.
සාමාන්යඋපායමාර්ගය වන්නේ සෑම වටයකදීම අනුගමනය කරන උපාය මාර්ගවල සාමාන්යයයි
ප්රශස්තඋපායමාර්ගය සමඟ සෙල්ලම් නොකිරීමේ මධ්යන්ය කනගාටුව එයයි.
සියලුමක්රීඩකයින් සඳහා නම් -නැෂ් සමතුලිතතාවයකි.
එයශුන්ය මුදලක් ක්රීඩාවක් බැවින්, අපට එකතු කළ හැකි අතර දෙවන වාරය අවලංගු වේ.
උපාය මාර්ගසමූහයක් පුරා උපයෝගිතා වල සාමාන්යය සාමාන්ය උපාය මාර්ගයේ උපයෝගීතාවයට සමාන වේ.
එබැවින්,
අර්ථදැක්වීමෙන් ,
එවිට,
මෙය -නැෂ් සමතුලිතතාවයයි. ඔබට ඒ හා සමානව ක්රීඩකයින් 2 කට වඩා ඇති ක්රීඩා සඳහා ඔප්පු කළ හැකිය.
එබැවින්නැෂ් සමතුලිතතාවයකට සමීප වීමට අප අවම කළ යුතුය.
Counterfactualඅගය ක්රීඩකයා ළඟා වීමට උත්සාහ නම් ක්රීඩකයා සඳහා අපේක්ෂිත උපයෝගීතාව (ක්රියා ගෙන ක සම්භාවිතාව සමග ප්රමුඛ ).
පර්යන්තඉතිහාස කට්ටලය වෙත ළඟා විය හැකි අතර එය දක්වා උපසර්ගය වේ . සිට z වෙත ළඟා වීමේ සම්භාවිතාව වේ.
ක්ෂණිකප්රතිවිරුද්ධ කනගාටුව නම්,
කොහේද
තොරතුරුකට්ටලයේ සෑම විටම පියවර ගැනීම වෙනස් කිරීම සමඟ උපාය පැතිකඩ කොහේද?
පත්රිකාව එය සනාථ කරයි (ප්රමේයය 3),
කොහේද
උපායමාර්ගයගණනය කරනු ලබන්නේ කනගාටු ගැලපීම භාවිතා කරමිනි.
එක්එක් තොරතුරු කට්ටලය සහ ක්රියාකාරී යුගලය සඳහා කනගාටුව පවත්වා ගෙන යනු ලැබේ,
උපායමාර්ගයගණනය කරනු ලබන්නේ කනගාටු ගැලපීමෙන්,
කොහේද
කඩදාසි අසම්පූර්ණ තොරතුරු සහිත ක්රීඩා වල කනගාටුව අවම කිරීම ඉහත සමීකරණයට අනුව උපාය මාර්ගය තෝරා ගන්නේ නම් ඊට සමානුපාතිකව කුඩා වන බව ඔප්පු කරයි , එබැවින් ළඟා වේ -නෂ් සමතුලිතතාවය.
පරිගණකකරණයටඑක් එක් පුනරාවර්තනයේ සම්පූර්ණ ක්රීඩා ගස පුළුල් කිරීම අවශ්ය වේ.
පුළුල් ක්රීඩා වල කනගාටුව අවම කිරීම සඳහා කඩදාසි මොන්ටේ කාලෝ නියැදීම අපට ක්රීඩා ගසෙන් සාම්පල ලබා ගත හැකි අතර කනගාටුව තක්සේරු කළ හැකිය.
යනු උප කට්ටල සමූහයකි () එහිදී අපි පුනරාවර්තනයක තනි බ්ලොක් එකක් පමණක් දෙස බලමු. සියලුම උප කුලවල සංගමය විහිදේ (). බ්ලොක් තෝරා ගැනීමේ සම්භාවිතාව .
වත්මන් පුනරාවර්තනයේ දී තෝරා ගැනීමේ සම්භාවිතාව; 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)
ඉතිහාසය යනු ඇතුළු ක්රියා වල අනුක්රමයකි අවස්ථාවක් සිදුවීම්, එය සියලු ඉතිහාසයන්ගේ සමූහයයි.
මෙමපන්තිය ක්රීඩා විශේෂිත තර්කනය සමඟ දීර් 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
එක්එක් පියවර නොගැනීම පිළිබඳ සම්පූර්ණ කනගාටුව ,
පරිගණකඋපාය විට කාලීන කෙසේ හෝ සිදු අවලංගු සිට අපි ඒ වෙනුවට පවත්වාගෙන
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()
අපිඅහම්බෙන් නියැදීම් (සීඑස්) කරන්නෙමු, එහිදී සියලු අවස්ථා සිදුවීම් (නෝඩ්) නියැදි කර ඇති අතර අනෙක් සියලුම සිදුවීම් (නෝඩ්) ගවේෂණය කරනු ලැබේ.
අපිඅහම්බෙන් නියැදීම් සිදු කරන බැවින් එය සියලු පර්යන්ත ඉතිහාසයන් සඳහා සමාන බැවින් මෙම පදය නොසලකා හැරිය හැකි අතර උපාය ගණනය කිරීමේදී එය අවලංගු වේ (සංඛ්යාංකය සහ නිහාකය තුළ පොදු).
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 })
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)