#!/usr/bin/env python # coding: utf-8 # In[1]: from simpful import * import matplotlib.pyplot as plt # ## Sterownik 1 - Decyzja o udziale w grze # ##### Dane wejściowe: # - Wartość żetonów # - Liczba przegranych z rzędu # # ##### Dane wyjściowe: # - Decyzja dot. udziału w grze # In[27]: def getStartDecision(chipVal, lossNum): """ Args: chipVal (int): current value of the player's chips lossNum (int): number of losses in a row Returns: str: decision """ FS = FuzzySystem(show_banner=False) FS.add_linguistic_variable("chipValue", AutoTriangle(3, terms=['low', 'average', 'high'], universe_of_discourse=[0, 10])) FS.add_linguistic_variable("numLossInRow", AutoTriangle(3, terms=['low', 'average', 'high'], universe_of_discourse=[0, 10])) O1 = TriangleFuzzySet(0,0,13, term="leave") O2 = TriangleFuzzySet(0,13,25, term="play") O3 = TriangleFuzzySet(13,25,25, term="playDouble") FS.add_linguistic_variable("decision", LinguisticVariable([O1, O2, O3], universe_of_discourse=[0, 25])) FS.add_rules([ "IF (numLossInRow IS average) AND (chipValue IS average) THEN (decision IS play)", "IF (numLossInRow IS low) OR (chipValue IS low) THEN (decision IS leave)", "IF (numLossInRow IS high) AND (chipValue IS high) THEN (decision IS playDouble)", ]) FS.set_variable("chipValue", chipVal) FS.set_variable("numLossInRow", lossNum) result = FS.inference() decision_terms = [(i.get_term(), FS.get_fuzzy_set('decision', i.get_term()).get_value(result['decision'])) for i in FS.get_fuzzy_sets('decision')] endDecision = max(decision_terms, key=lambda item:item[1])[0] return endDecision # In[28]: getStartDecision(7, 7) # In[1]: # FS.plot_variable('chipValue') # FS.plot_variable('numLossInRow') # FS.plot_variable('decision') # ## Sterownik 2 - Decyzja o strategii w przypadku pary # ##### Dane wejściowe: # - Wartość widocznej karty krupiera # - Wartość karty gracza (jednej z pary) # # ##### Dane wyjściowe: # - Decyzja dot. akcji w grze # In[12]: def getSplitDecision(dealerCard, playerCard): """ Args: dealerCard (int): value of the dealer card playerCard (int): value of the player card (one of the pair) Returns: str: decision """ FS = FuzzySystem(show_banner=False) T1 = TriangleFuzzySet(0,0,6, term="low") T2 = TriangleFuzzySet(4,6,8, term="average") T3 = TriangleFuzzySet(6,11,11, term="high") FS.add_linguistic_variable("dealerCardValue", LinguisticVariable([T1, T2, T3], universe_of_discourse=[0, 11])) FS.add_linguistic_variable("playerCardValue", LinguisticVariable([T1, T2, T3], universe_of_discourse=[0, 11])) O1 = TriangleFuzzySet(0,0,15, term="continue") O2 = TriangleFuzzySet(11,25,25, term="split") FS.add_linguistic_variable("decision", LinguisticVariable([O1, O2], universe_of_discourse=[0, 25])) FS.add_rules([ "IF (playerCardValue IS high) THEN (decision IS split)", "IF (playerCardValue IS average) AND (dealerCardValue IS average) THEN (decision IS split)", "IF (playerCardValue IS average) AND (dealerCardValue IS low) THEN (decision IS split)", "IF (playerCardValue IS low) AND (dealerCardValue IS high) THEN (decision IS continue)", "IF (playerCardValue IS low) AND (dealerCardValue IS average) THEN (decision IS split)", "IF (playerCardValue IS low) AND (dealerCardValue IS low) THEN (decision IS continue)", "IF (playerCardValue IS low) AND (dealerCardValue IS high) THEN (decision IS continue)" ]) FS.set_variable("dealerCardValue", dealerCard) FS.set_variable("playerCardValue", playerCard) result = FS.inference() decision_terms = [(i.get_term(), FS.get_fuzzy_set('decision', i.get_term()).get_value(result['decision'])) for i in FS.get_fuzzy_sets('decision')] endDecision = max(decision_terms, key=lambda item:item[1])[0] return endDecision # In[13]: getSplitDecision(5, 3) # In[7]: #FS.plot_variable('dealerCardValue') #FS.plot_variable('playerCardValue') #FS.plot_variable('decision') # ## Sterownik 3 - Decyzja jaką akcję podjąć (gracz bez asa wśród dwóch kart) # ##### Dane wejściowe: # - Wartość widocznej karty krupiera # - Suma kart gracza # - Suma zliczonych kart # # ##### Dane wyjściowe: # - Decyzja dot. akcji w grze # In[29]: def getHardHandDecision(dealerCard, playerCardsVal, countedCardsVal, playerCardsNum): """ Args: dealerCard (int): value of the dealer card playerCardsVal (int): sum of the players hand countedCardsVal (int): value of the counted cards playerCardsNum (int): number of cards in players hadn Returns: str: decision """ FS = FuzzySystem(show_banner=False) FS.add_linguistic_variable("dealerCardValue", LinguisticVariable([ TriangleFuzzySet(0,0,6, term="low"), TriangleFuzzySet(4,6,8, term="average"), TriangleFuzzySet(6,11,11, term="high")], universe_of_discourse=[0, 11])) FS.add_linguistic_variable("playerCardsValue", LinguisticVariable([ TriangleFuzzySet(0,0,12, term="low"), TriangleFuzzySet(11,14,17, term="average"), TriangleFuzzySet(12,21,21, term="high")], universe_of_discourse=[0, 21])) FS.add_linguistic_variable("countedCardsValue", LinguisticVariable([ TriangleFuzzySet(-20,-20,0, term="low"), TriangleFuzzySet(-5,0,5, term="average"), TriangleFuzzySet(0,20,20, term="high")], universe_of_discourse=[-20, 20])) O1 = TriangleFuzzySet(0,0,13, term="double down") O2 = TriangleFuzzySet(0,13,25, term="hit") O3 = TriangleFuzzySet(13,25,25, term="stand") FS.add_linguistic_variable("decision", LinguisticVariable([O1, O2, O3], universe_of_discourse=[0, 25])) if playerCardsNum == 2: FS.add_rules([ "IF (playerCardsValue IS low) THEN (decision IS double down)", "IF (playerCardsValue IS average) AND (dealerCardValue IS high) THEN (decision IS double down)", "IF (playerCardsValue IS high) THEN (decision IS stand)", "IF (playerCardsValue IS average) AND (dealerCardValue IS average) THEN (decision IS stand)", "IF (playerCardsValue IS average) AND (dealerCardValue IS average) THEN (decision IS double down)" ]) else: FS.add_rules([ "IF (playerCardsValue IS high) THEN (decision IS stand)", "IF (playerCardsValue IS low) THEN (decision IS hit)", "IF (playerCardsValue IS average) AND (dealerCardValue IS low) THEN (decision IS stand)", "IF (playerCardsValue IS average) AND (dealerCardValue IS high) THEN (decision IS hit)", "IF (playerCardsValue IS average) AND (dealerCardValue IS average) AND (countedCardsValue IS low) THEN (decision IS hit)", ]) FS.set_variable("dealerCardValue", dealerCard) FS.set_variable("playerCardsValue", playerCardsVal) FS.set_variable("countedCardsValue", countedCardsVal) result = FS.inference() decision_terms = [(i.get_term(), FS.get_fuzzy_set('decision', i.get_term()).get_value(result['decision'])) for i in FS.get_fuzzy_sets('decision')] endDecision = max(decision_terms, key=lambda item:item[1])[0] return endDecision # In[19]: getHardHandDecision(4, 10, 0, 2) # In[7]: # FS.plot_variable('dealerCardValue') # FS.plot_variable('playerCardsValue') # FS.plot_variable('countedCardsValue') # FS.plot_variable('decision') # ## Sterownik 4 - Decyzja jaką akcję podjąć (gracz z asem wśród dwóch kart) # ##### Dane wejściowe: # - Wartość widocznej karty krupiera # - Wartość drugiej karty gracza # - Suma zliczonych kart # # ##### Dane wyjściowe: # - Decyzja dot. akcji w grze # In[25]: def getSoftHandDecision(dealerCard, playerCardsVal, countedCardsVal, playerCardsNum): FS = FuzzySystem(show_banner=False) FS.add_linguistic_variable("dealerCardValue", LinguisticVariable([ TriangleFuzzySet(0,0,6, term="low"), TriangleFuzzySet(4,6,8, term="average"), TriangleFuzzySet(6,11,11, term="high")], universe_of_discourse=[0, 11])) FS.add_linguistic_variable("playerCardValue", LinguisticVariable([ TriangleFuzzySet(0,0,5, term="low"), TriangleFuzzySet(4,6,8, term="average"), TriangleFuzzySet(7,9,9, term="high")], universe_of_discourse=[0, 9])) FS.add_linguistic_variable("countedCardsValue", LinguisticVariable([ TriangleFuzzySet(-20,-20,0, term="low"), TriangleFuzzySet(-5,0,5, term="average"), TriangleFuzzySet(0,20,20, term="high")], universe_of_discourse=[-20, 20])) O1 = TriangleFuzzySet(0,0,13, term="double down") O2 = TriangleFuzzySet(0,13,25, term="hit") O3 = TriangleFuzzySet(13,25,25, term="stand") FS.add_linguistic_variable("decision", LinguisticVariable([O1, O2, O3], universe_of_discourse=[0, 25])) if playerCardsNum == 2: FS.add_rules([ "IF (playerCardValue IS average) AND (dealerCardValue IS average) THEN (decision IS double down)", "IF (playerCardValue IS high) THEN (decision IS Stand)", "IF (playerCardValue IS average) AND (dealerCardValue IS high) THEN (decision IS hit)", "IF (playerCardValue IS low) AND (dealerCardValue IS low) THEN (decision IS hit)", ]) else: FS.add_rules([ "IF (playerCardValue IS high) THEN (decision IS Stand)", "IF (playerCardValue IS low) THEN (decision IS hit)", "IF (playerCardValue IS average) AND (dealerCardValue IS high) THEN (decision IS Hit)", "IF (playerCardValue IS average) AND (dealerCardValue IS average) AND (countedCardsValue IS high) THEN (decision IS Stand)", "IF (playerCardValue IS average) AND (dealerCardValue IS average) AND (countedCardsValue IS low) THEN (decision IS Hit)" ]) FS.set_variable("dealerCardValue", dealerCard) FS.set_variable("playerCardValue", playerCardsVal) FS.set_variable("countedCardsValue", playerCardsNum) result = FS.inference() decision_terms = [(i.get_term(), FS.get_fuzzy_set('decision', i.get_term()).get_value(result['decision'])) for i in FS.get_fuzzy_sets('decision')] endDecision = max(decision_terms, key=lambda item:item[1])[0] return endDecision # In[26]: getSoftHandDecision(2, 8, 0, 3) # In[2]: # FS.plot_variable('dealerCardValue') # FS.plot_variable('playerCardValue') # FS.plot_variable('countedCardsValue') # FS.plot_variable('decision')