Advertisement
Gnotiak

Equipment Expansion Supply

Aug 25th, 2019
667
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.36 KB | None | 0 0
  1. import numpy as np
  2.  
  3.  
  4. class Gacha:
  5.     def __init__(self, rate_r, rate_ssr, rate_target, guarantee, pity):
  6.         self.rate_r = rate_r
  7.         self.rate_ssr = rate_ssr
  8.         self.rate_target = rate_target
  9.         self.guarantee = guarantee
  10.         self.pity = pity
  11.         self.limit = 200
  12.         self.ops_count = 0
  13.  
  14.     def __init__(self):
  15.         self.hi3rd_expansion()
  16.  
  17.     def set_limit(self,limit):
  18.         self.limit = limit
  19.  
  20.     def prob(self,table,state,pulls):
  21.  
  22. ##        self.ops_count += 1
  23. ##        if self.ops_count == 1000000:
  24. ##            print(self.ops_count)
  25.  
  26.         wp_w8 = (state.targets_goal[0] - state.targets_counter[0])*2
  27.         stg_w8 = (state.targets_goal[1] - state.targets_counter[1])
  28.         max_w8 = wp_w8 + stg_w8
  29.        
  30.         if state.are_all_targets_acquired():
  31.             return [1,0]
  32.  
  33.         if pulls == self.limit:
  34.             return [0,0]
  35.        
  36.         if table.get(state.get_tuple()):
  37.             return table[state.get_tuple()]
  38.        
  39.         if self.pity == state.pity_counter+1:
  40.             val = [0,0]
  41.            
  42.             if state.targets_counter[0] < state.targets_goal[0]:
  43.                 pity_state = state.copy()
  44.                 pity_state.pulls += 1
  45.                 pity_state.got_target()
  46.                 pity_state.targets_counter = (pity_state.targets_counter[0]+1,
  47.                                               pity_state.targets_counter[1])
  48.                 temp_val = self.prob(table,pity_state,pulls+1)
  49.                 val[0] += temp_val[0]*wp_w8/max_w8
  50.                 val[1] += (temp_val[1]+1)*wp_w8/max_w8
  51.                
  52.             if state.targets_counter[1] < state.targets_goal[1]:
  53.                 pity_state = state.copy()
  54.                 pity_state.pulls += 1
  55.                 pity_state.got_target()
  56.                 pity_state.targets_counter = (pity_state.targets_counter[0],
  57.                                               pity_state.targets_counter[1]+1)
  58.                 temp_val = self.prob(table,pity_state,pulls+1)
  59.                 val[0] += temp_val[0]*stg_w8/max_w8
  60.                 val[1] += (temp_val[1]+1)*stg_w8/max_w8
  61.            
  62.             table[state.get_tuple()] = val
  63.             return val
  64.            
  65.         if self.guarantee == state.guarantee_counter+1:
  66.             val = [0,0]
  67.  
  68.             if state.targets_counter[0] < state.targets_goal[0]:
  69.                 brag_state = state.copy()
  70.                 brag_state.pulls += 1
  71.                 brag_state.got_target()
  72.                 brag_state.targets_counter = (brag_state.targets_counter[0]+1,
  73.                                               brag_state.targets_counter[1])
  74.                 temp_val = self.prob(table,brag_state,pulls+1)
  75.                 brag_mult = self.rate_target*wp_w8/self.rate_ssr
  76.                 val[0] += temp_val[0]*brag_mult
  77.                 val[1] += (temp_val[1]+1)*brag_mult
  78.                
  79.             if state.targets_counter[1] < state.targets_goal[1]:
  80.                 brag_state = state.copy()
  81.                 brag_state.pulls += 1
  82.                 brag_state.got_target()
  83.                 brag_state.targets_counter = (brag_state.targets_counter[0],
  84.                                               brag_state.targets_counter[1]+1)
  85.                 temp_val = self.prob(table,brag_state,pulls+1)
  86.                 brag_mult = self.rate_target*stg_w8/self.rate_ssr
  87.                 val[0] += temp_val[0]*brag_mult
  88.                 val[1] += (temp_val[1]+1)*brag_mult
  89.            
  90.  
  91.             salt_state = state.copy()
  92.             salt_state.pulls += 1
  93.             salt_state.got_salt()
  94.             temp_val = self.prob(table,salt_state,pulls+1)
  95.             salt_mult = 1-(self.rate_target*max_w8/self.rate_ssr)
  96.             val[0] += temp_val[0]*salt_mult
  97.             val[1] += (temp_val[1]+1)*salt_mult
  98.  
  99.             table[state.get_tuple()] = val
  100.             return val
  101.  
  102.         val = [0,0]
  103.  
  104.         if state.targets_counter[0] < state.targets_goal[0]:
  105.                 brag_state = state.copy()
  106.                 brag_state.pulls += 1
  107.                 brag_state.got_target()
  108.                 brag_state.targets_counter = (brag_state.targets_counter[0]+1,
  109.                                               brag_state.targets_counter[1])
  110.                 temp_val = self.prob(table,brag_state,pulls+1)
  111.                 brag_mult = self.rate_target*wp_w8
  112.                 val[0] += temp_val[0]*brag_mult
  113.                 val[1] += (temp_val[1]+1)*brag_mult
  114.                
  115.         if state.targets_counter[1] < state.targets_goal[1]:
  116.                 brag_state = state.copy()
  117.                 brag_state.pulls += 1
  118.                 brag_state.got_target()
  119.                 brag_state.targets_counter = (brag_state.targets_counter[0],
  120.                                               brag_state.targets_counter[1]+1)
  121.                 temp_val = self.prob(table,brag_state,pulls+1)
  122.                 brag_mult = self.rate_target*stg_w8
  123.                 val[0] += temp_val[0]*brag_mult
  124.                 val[1] += (temp_val[1]+1)*brag_mult
  125.  
  126.         salt_state = state.copy()
  127.         salt_state.pulls += 1
  128.         salt_state.got_salt()
  129.         temp_val = self.prob(table,salt_state,pulls+1)
  130.         salt_mult = self.rate_ssr - self.rate_target*max_w8
  131.         val[0] += temp_val[0]*salt_mult
  132.         val[1] += (temp_val[1]+1)*salt_mult
  133.  
  134.         uber_salt_state = state.copy()
  135.         uber_salt_state.pulls += 1
  136.         uber_salt_state.got_uber_salt()
  137.         temp_val = self.prob(table,uber_salt_state,pulls+1)
  138.         uber_salt_mult = self.rate_r
  139.         val[0] += temp_val[0]*uber_salt_mult
  140.         val[1] += (temp_val[1]+1)*uber_salt_mult
  141.  
  142.         table[state.get_tuple()] = val
  143.         return val
  144.  
  145.     def hi3rd_expansion(self):
  146.         self.rate_r = 0.876
  147.         self.rate_ssr = 0.124
  148.         self.rate_target = 0.0092
  149.         self.guarantee = 10
  150.         self.pity = 50
  151.         self.limit = -1
  152.         self.ops_count = 0
  153.        
  154.  
  155. class State:
  156.     def __init__(self, guarantee_counter, pity_counter, pulls):
  157.         self.guarantee_counter = guarantee_counter
  158.         self.pity_counter = pity_counter
  159.         self.pulls = pulls
  160.         self.targets_counter = (0,0)
  161.         self.targets_goal = (1,3)
  162.  
  163.     def are_all_targets_acquired(self):
  164.         return self.targets_counter == self.targets_goal
  165.  
  166.     def reset_counter(self):
  167.         self.guarantee_counter = 0
  168.         self.pity_counter = 0
  169.  
  170.     def copy(self):
  171.         copied_state = State(self.guarantee_counter, self.pity_counter, self.pulls)
  172.         copied_state.targets_counter = self.targets_counter
  173.         copied_state.targets_goal = self.targets_goal
  174.         return copied_state
  175.  
  176.     def got_target(self):
  177. ##      self.targets_counter += 1
  178.        
  179.         self.reset_counter()
  180.  
  181.     def got_salt(self):
  182.         self.guarantee_counter = 0
  183.         self.pity_counter += 1
  184.  
  185.     def got_uber_salt(self):
  186.         self.guarantee_counter += 1
  187.         self.pity_counter += 1
  188.  
  189.     def get_tuple(self):
  190.         return (self.guarantee_counter, self.pity_counter, self.pulls, self.targets_counter)
  191.  
  192. def prob_table():
  193.     gacha = Gacha()
  194.     for i in range(40):
  195.         for j in range(5):
  196.             gacha.set_limit(i*5+j+1)
  197.             table = {}
  198.             init_state = State(0,0,0)
  199.             val = gacha.prob(table,init_state,0)
  200.             print("%3i : %6.5f " % (i*5+j+1,val[0]), end=" ")
  201.         print(" ")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement