def new_yuukouhai_explore(shanten_suu, janshi, taku): hash_table = taku.hash_table tehai = np.array(function.tehai_convert(janshi.tehai)) #ツモって来る牌に赤ドラは考慮しない yama = np.array( function.tehai_convert( function.akadora_convert(janshi.vertual_yama)[0])) init_shanten_suu = shanten_suu #index_list = [0]*len(tehai) sum_list = [0] * len(tehai) #mean_list = [0]*len(tehai) hai_list = find_yuukou_sutehai(janshi, init_shanten_suu, hash_table) #print(hai_list) #副露した時でアガリ役なしの場合 if len(hai_list) == 0: return random.choice(range(len(janshi.tehai))), 0 #バグ防止用 for i in hai_list: sum_list[i] += 0.001 #print(hai_list) itr = 25 for i in hai_list: for j in range(itr): count = 1. temp_janshi = copy.deepcopy(janshi) temp_tehai = tehai.copy() temp_yama = yama.copy() temp_tehai[i] -= 1 temp_janshi.tehai = function.tehai_convert_reverse(temp_tehai) a = yuukouhai_explore(temp_yama, init_shanten_suu, count, hash_table, temp_janshi, taku) #index_list[i] += 1 sum_list[i] += a sum_list[i] /= float(itr) #for i in range(len(tehai)): # mean_list[i] = sum_list[i]/float(itr) maximum_index_num = -1 #print(janshi.tehai) #print(np.round(sum_list,2)) maximum_expect = np.max(sum_list) return_hai_str = function.hai_convert_reverse(np.argmax(sum_list)) #print(return_hai_str) for i in range(len(janshi.tehai)): if janshi.tehai[i] == return_hai_str: maximum_index_num = i break #print(maximum_index_num) assert maximum_index_num >= 0 return maximum_index_num, maximum_expect
def daiminkan_convert(janshi, hai_str, teban): janshi.tsumohai_list.append(hai_str + "大明槓") temp_tehai = function.tehai_convert(janshi.tehai) hai_index = function.hai_convert(hai_str) temp_tehai[hai_index] -= 3 janshi.tehai = function.tehai_convert_reverse(temp_tehai) return [3, hai_index, teban]
def ankan_convert(janshi, hai_str): janshi.tsumohai_list.append(hai_str + "暗槓") temp_tehai = function.tehai_convert(janshi.tehai) hai_index = function.hai_convert(hai_str) temp_tehai[hai_index] -= 4 janshi.tehai = function.tehai_convert_reverse(temp_tehai) return hai_index
def new_yuukouhai_explore(shanten_suu, janshi, taku): hash_table = taku.hash_table #tehai = np.array(function.tehai_convert(janshi.tehai)) #ツモって来る牌に赤ドラは考慮しない yama = np.array( function.tehai_convert( function.akadora_convert(janshi.vertual_yama)[0])) init_shanten_suu = shanten_suu #index_list = [0]*len(tehai) sum_val = 0 #mean_list = [0]*len(tehai) #hai_list = find_yuukou_sutehai(janshi, init_shanten_suu, hash_table) #print(hai_list) #print(hai_list) if init_shanten_suu >= 3: itr = 15 else: itr = 25 for j in range(itr): count = 1. temp_janshi = copy.deepcopy(janshi) if len(temp_janshi.fuurohai) == 0: temp_janshi.riichi = 1 temp_yama = yama.copy() sum_val += yuukouhai_explore(temp_yama, init_shanten_suu, count, hash_table, temp_janshi, taku) sum_val /= float(itr) return sum_val
def jm_convert(tehai_exc_fuuro, fuurohai, ankan): #手牌を面子と雀頭に分解し、フウロしている面子とともに手役計算用表示に変換したリストにする。 #出力は可能なすべての分解パターンのリスト。 #ひとつの分解パターン[n,[[i1,j1,k1],[i2,j2,k2],[i3,j2,k2],[i3,j3,k3]]] #(雀頭):n (n=牌のインデックス) #(面子):[i,j,k] # i=0(暗) ,1(明) # j=0(順子),1(刻子),2(槓子) # k=(順子なら)先頭の牌のインデックス,(刻子なら)その牌のインデックス tehai = function.tehai_convert(tehai_exc_fuuro) fuurosu = len(fuurohai) + len(ankan) rets = decomp_tehai(tehai, fuurosu) for ret in rets: if len(fuurohai) >= 1: for f in fuurohai: if f[0] == 1: ret[1].append([1, 0, f[1] - 2 + f[2]]) elif f[0] == 2: ret[1].append([1, 1, f[1]]) elif f[0] == 3: ret[1].append([1, 2, f[1]]) if len(ankan) >= 1: for a in ankan: ret[1].append([0, 2, a]) return rets
def new_yuukouhai_explore(shanten_suu, janshi, taku, kuikae_list): hash_table = taku.hash_table tehai = np.array(function.tehai_convert(janshi.tehai)) yama = np.array(function.tehai_convert(function.akadora_convert(janshi.vertual_yama)[0])) init_shanten_suu = shanten_suu sum_list = [0]*len(tehai) hai_list = find_yuukou_sutehai(janshi, init_shanten_suu, hash_table) #hai_listからkuikae_listを削除 temp_hai_list = hai_list.copy() for i in range(len(hai_list)): if temp_hai_list[i] in kuikae_list: hai_list.remove(temp_hai_list) #副露した時でアガリ役なしの場合 if len(hai_list) == 0: return random.choice(range(len(janshi.tehai))), 0 #バグ防止用 for i in hai_list: sum_list[i] += 0.001 itr = 25 for j in range(itr): count = 1. for i in hai_list: temp_janshi = copy.deepcopy(janshi) temp_tehai = tehai.copy() temp_yama = yama.copy() temp_tehai[i] -= 1 temp_janshi.tehai = function.tehai_convert_reverse(temp_tehai) a = yuukouhai_explore(temp_yama, init_shanten_suu, count, hash_table, temp_janshi, taku) sum_list[i] += a maximum_index_num = -1 maximum_expect = np.max(sum_list) return_hai_str = function.hai_convert_reverse(np.argmax(sum_list)) for i in range(len(janshi.tehai)): if janshi.tehai[i] == return_hai_str: maximum_index_num = i break assert maximum_index_num >= 0 return maximum_index_num, maximum_expect
def pon_convert(janshi, hai_str, teban, akadora_flag): janshi.tsumohai_list.append(hai_str + "ポン") janshi.fuuro_akadora_list.append(akadora_flag) temp_tehai = function.tehai_convert(janshi.tehai) hai_index = function.hai_convert(function.akadora_hai_convert(hai_str)) temp_tehai[hai_index] -= 2 janshi.tehai = function.tehai_convert_reverse(temp_tehai) return [2, hai_index, teban]
def kakan_convert(janshi, hai_str, fuuro_index): if janshi.fuurohai[fuuro_index][1] % 10 == 5 and janshi.fuurohai[ fuuro_index][1] < 30: janshi.fuuro_akadora_list[fuuro_index] = True janshi.tsumohai_list.append(hai_str + "加槓") temp_tehai = function.tehai_convert(janshi.tehai) hai_index = function.hai_convert(hai_str) temp_tehai[hai_index] -= 1 janshi.tehai = function.tehai_convert_reverse(temp_tehai) return [3, hai_index, 0]
def find_yuukouhai(janshi, old_shanten_suu, hash_table): yuukouhai_index_list = [] tehai = function.tehai_convert(janshi.tehai) for i in range(len(tehai)): if (i !=30) and (tehai[i] < 4): temp_janshi = copy.deepcopy(janshi) temp_tehai = tehai.copy() temp_tehai[i] += 1 temp_janshi.tehai = function.tehai_convert_reverse(temp_tehai) if shanten_check_new.shanten_check(temp_janshi, hash_table) < old_shanten_suu: yuukouhai_index_list.append(i) return yuukouhai_index_list
def yuukouhai_explore(yama, shanten_suu, count, hash_table, janshi, taku): yuukouhai_boost = 1.45 yuukouhai_list = find_yuukouhai(janshi, shanten_suu, hash_table) yuukouhai_prob_list = create_yuukouhai_prob_list(yuukouhai_list, yama) #yuukouhai_prob_listの要素がない場合 if len(yuukouhai_prob_list) == 0: yuukouhai_prob_list = yuukouhai_list index = random.choice(yuukouhai_prob_list) tehai = function.tehai_convert(janshi.tehai) tehai[index] += 1 yuukouhai_num = 0 for i in yuukouhai_list: yuukouhai_num += yama[i] #テンパイ時に待ち牌に対してブーストを行う if shanten_suu == 0: count *= yuukouhai_num**(yuukouhai_boost)/len(yama) else: count *= yuukouhai_num/len(yama) yama[index] -= 1 shanten_suu -= 1 if shanten_suu == -1: agarihai_str = function.hai_convert_reverse(index) tehai_str = function.tehai_convert_reverse(tehai) temp_janshi = copy.deepcopy(janshi) temp_janshi.tehai = tehai_str point_temp = tensu_calc.tensu_calc(temp_janshi, taku, agarihai_str) if len(point_temp) == 0: point = 0 elif point_temp[0] == point_temp[1]: point = point_temp[0]*3 else: point = point_temp[0] * 2 + point_temp[1] return count * point temp_janshi2 = copy.deepcopy(janshi) temp_tehai = tehai.copy() temp_janshi2.tehai = function.tehai_convert_reverse(temp_tehai) yuukou_sutehai_index_list = find_yuukou_sutehai(temp_janshi2, shanten_suu, hash_table) index2 = random.choice(yuukou_sutehai_index_list) tehai[index2] -= 1 temp_tehai = tehai.copy() temp_janshi2.tehai = function.tehai_convert_reverse(temp_tehai) return yuukouhai_explore(yama, shanten_suu, count, hash_table, temp_janshi2, taku)
def mentsu_count(janshi): global mentsu_suu global maximum_mentsu_suu mentsu_suu = len(janshi.fuurohai) temp_tehai = function.tehai_convert(janshi.tehai) for j in range(31,38): if temp_tehai[j] >= 3: mentsu_suu += 1 mentsu_suu_copy = mentsu_suu maximum_mentsu_suu = mentsu_suu for i in range(1, 30): mentsu_suu = mentsu_suu_copy mentsu_cut(temp_tehai, i) return maximum_mentsu_suu
def tehai_fuuro_mix_convert(tehai_str, fuurohai, ankan): #手牌と副露牌を混ぜて[0,0,1,2,0,...]形式にする mix = function.tehai_convert(tehai_str) for f in fuurohai: if f[0] == 1: mix[f[1] - 2 + f[2]] += 1 mix[f[1] - 1 + f[2]] += 1 mix[f[1] + f[2]] += 1 elif f[0] == 2: mix[f[1]] += 3 elif f[0] == 3: mix[f[1]] += 4 if len(ankan) >= 1: for a in ankan: mix[a] += 4 return mix
def find_yuukou_sutehai(janshi, old_shanten_suu, hash_table): yuukou_sutehai_index_list = [] tehai = function.tehai_convert(janshi.tehai) for i in range(len(tehai)): if tehai[i] != 0: temp_janshi = copy.deepcopy(janshi) temp_tehai = tehai.copy() temp_tehai[i] -=1 temp_janshi.tehai = function.tehai_convert_reverse(temp_tehai) if shanten_check_new.shanten_check(temp_janshi, hash_table) == old_shanten_suu: yuukou_sutehai_index_list.append(i) #普通の5があるときは赤ドラ5を除外 if 0 in yuukou_sutehai_index_list and 5 in yuukou_sutehai_index_list: yuukou_sutehai_index_list.remove(0) if 10 in yuukou_sutehai_index_list and 15 in yuukou_sutehai_index_list: yuukou_sutehai_index_list.remove(10) if 20 in yuukou_sutehai_index_list and 25 in yuukou_sutehai_index_list: yuukou_sutehai_index_list.remove(20) return yuukou_sutehai_index_list
def chii_convert(janshi, hai_str, chii_index, akadora_flag): janshi.tsumohai_list.append(hai_str + "チー") janshi.fuuro_akadora_list.append(akadora_flag) temp_tehai = function.tehai_convert(janshi.tehai) hai_index = function.hai_convert(function.akadora_hai_convert(hai_str)) if chii_index == 0: temp_tehai[hai_index - 2] -= 1 temp_tehai[hai_index - 1] -= 1 janshi.tehai = function.tehai_convert_reverse(temp_tehai) return [1, hai_index, chii_index] elif chii_index == 1: temp_tehai[hai_index - 1] -= 1 temp_tehai[hai_index + 1] -= 1 janshi.tehai = function.tehai_convert_reverse(temp_tehai) return [1, hai_index, chii_index] elif chii_index == 2: temp_tehai[hai_index + 1] -= 1 temp_tehai[hai_index + 2] -= 1 janshi.tehai = function.tehai_convert_reverse(temp_tehai) return [1, hai_index, chii_index]
def shanten_check(janshi, hash_table): tehai = function.tehai_convert(function.akadora_convert(janshi.tehai)[0]) fuurosu = len(janshi.fuurohai) + len(janshi.ankan_list) #国士無双形 Sh_kokushi = 13 # ここから1、9、字牌の数を引いていく kokushi_l = [1, 9, 11, 19, 21, 29, 31, 32, 33, 34, 35, 36, 37] kokushi_toitsu = 0 for i in kokushi_l: if tehai[i] >= 1: Sh_kokushi -= 1 if kokushi_toitsu == 0 and tehai[i] >= 2: #1,9、字牌の対子があれば1つだけシャンテン数が下がる kokushi_toitsu = 1 Sh_kokushi -= kokushi_toitsu #七対子形 Sh_chiitoi = 6 #ここから対子の数だけ引く haisyu = 0 #牌の種類 for i in range(0, 38): if tehai[i] >= 1: haisyu += 1 if tehai[i] >= 2: Sh_chiitoi -= 1 if haisyu < 7: Sh_chiitoi += 7 - haisyu #4面子1雀頭形 #tehaiを色ごとにハッシュ化 manzu_hash = 0 #萬子部分のハッシュ値 for i in range(1, 10): manzu_hash = manzu_hash * 5 + tehai[i] pinzu_hash = 0 #筒子部分のハッシュ値 for i in range(11, 20): pinzu_hash = pinzu_hash * 5 + tehai[i] souzu_hash = 0 #索子部分のハッシュ値 for i in range(21, 30): souzu_hash = souzu_hash * 5 + tehai[i] zihai_hash = 0 #字牌部分のハッシュ値 for i in range(31, 38): zihai_hash = zihai_hash * 5 + tehai[i] #各ハッシュ値をキーにハッシュテーブルにある部分置換数t,uを取得 t_manzu = [] #萬子部分の部分置換数tの配列 u_manzu = [] #萬子部分の部分置換数uの配列 for i in range(0, 5): t_manzu.append(int(hash_table[0][manzu_hash].split()[i])) for i in range(5, 10): u_manzu.append(int(hash_table[0][manzu_hash].split()[i])) t_pinzu = [] #筒子部分の部分置換数tの配列 u_pinzu = [] #筒子部分の部分置換数uの配列 for i in range(0, 5): t_pinzu.append(int(hash_table[0][pinzu_hash].split()[i])) for i in range(5, 10): u_pinzu.append(int(hash_table[0][pinzu_hash].split()[i])) t_souzu = [] #索子部分の部分置換数tの配列 u_souzu = [] #索子部分の部分置換数uの配列 for i in range(0, 5): t_souzu.append(int(hash_table[0][souzu_hash].split()[i])) for i in range(5, 10): u_souzu.append(int(hash_table[0][souzu_hash].split()[i])) t_zihai = [] #字牌部分の部分置換数tの配列 u_zihai = [] #字牌部分の部分置換数uの配列 for i in range(0, 5): t_zihai.append(int(hash_table[1][zihai_hash].split()[i])) for i in range(5, 10): u_zihai.append(int(hash_table[1][zihai_hash].split()[i])) t = [t_manzu, t_pinzu, t_souzu, t_zihai] u = [u_manzu, u_pinzu, u_souzu, u_zihai] #計算部分 x = [[0 for m in range(0, 5)] for n in range(0, 4)] y = [[0 for m in range(0, 5)] for n in range(0, 4)] for m in range(0, 5): x[0][m] = t[0][m] y[0][m] = u[0][m] for n in range(1, 4): for m in range(0, 5): x_temp = 15 y_temp = 15 for l in range(0, m + 1): x_temp = min(x_temp, x[n - 1][l] + t[n][m - l]) y_temp = min( y_temp, min(y[n - 1][l] + t[n][m - l], x[n - 1][l] + u[n][m - l])) x[n][m] = x_temp y[n][m] = y_temp Th_temp = 15 for l in range(0, 5 - fuurosu): Th_temp = min( Th_temp, min(x[2][l] + u[3][(4 - fuurosu) - l], y[2][l] + t[3][(4 - fuurosu) - l])) Sh_normal = Th_temp - 1 #最終的なシャンテン数 Shanten_su = min(Sh_normal, Sh_kokushi, Sh_chiitoi) return Shanten_su
def create_danger_degree_list(janshi, taku, bakyou_list): danger_degree_list = [0] * 38 danger_degree_list_return = [1.0] * 38 #オーラスで最下位ならぜんぶ1.0 if bakyou_list[0] == 4: return danger_degree_list_return janshi_list = copy.deepcopy(janshi) janshi_p = janshi_list[0] nokori_tsumo_kaisuu = int(taku.yama_nokori / 4) vertual_yama = janshi_p.vertual_yama vertual_yama_index = function.tehai_convert(vertual_yama) for i in range(1, 4): #とりあえず立直者だけ警戒 if janshi_list[i].riichi: tenpai_prob = 1.0 elif janshi_list[i].fuurosuu != 0: tenpai_prob = janshi_list[i].fuurosuu * 0.09 * math.exp( ((17 - nokori_tsumo_kaisuu) / 17 - 1) * math.sqrt(5)) else: continue #max_pointの設定 genbutsu_list = function.akadora_convert( janshi_list[i].sutehai)[0] + function.akadora_convert( janshi_list[i].temp_genbutsu)[0] #手出しリスト作成 tedashi_list = [] for j in range(len(janshi_list[i].sutehai)): if janshi_list[i].tedashi_flag: tedashi_list.append(janshi_list[i].sutehai[j]) ############メイン######################### temp_list = list(range(len(danger_degree_list))) temp_list.remove(0) temp_list.remove(10) temp_list.remove(20) temp_list.remove(30) for j in temp_list: hai_index = j #現物ならcontinue temp_hai_str = function.akadora_hai_convert(j) if temp_hai_str in genbutsu_list: continue #字牌 if hai_index > 30: if vertual_yama_index[hai_index] == 0: continue elif vertual_yama_index[hai_index] == 1: continue elif vertual_yama_index[hai_index] == 2: danger_degree_list[j] += 0.05 continue elif vertual_yama_index[hai_index] == 3: danger_degree_list[j] += 0.2 continue #筋牌ならばcontinue if suji_hantei(genbutsu_list, hai_index): continue #序盤に切れた数牌の外側ならばcontinue sutehai_len = len(janshi_list[i].sutehai) if sutehai_len > 6: sotohai_list = sotohai_find(janshi_list[i].sutehai, min(int(sutehai_len / 3), 4)) if hai_index in sotohai_list: continue #カベの外側continue if kabe_eval(vertual_yama_index, hai_index) != 0: continue #補正 danger_degree_list[j] += tenpai_prob * 2.0 danger_degree_list = np.array(danger_degree_list) danger_degree_list_return = np.array(danger_degree_list_return) return danger_degree_list + danger_degree_list_return
#場風、自風 taku.kaze_honba[0] = random.randrange(8) janshi.kaze = random.randrange(4) #手牌、ドラ表示 input_data = [ "5p", "5p", "7p", "8p", "8p", "8p", "9p", "3s", "3s", "3s", "4s", "7s", "8s", "8s" ] taku.dorahyouji = ["1m"] janshi.tehai = input_data input_str = [] input_str.extend( function.tehai_convert_binary(function.tehai_convert(janshi.tehai))) input_str.extend( function.bin_convert(function.tehai_convert(taku.dorahyouji)[0], 5)) input_str.extend(function.bin_convert(janshi.kaze, 2)) input_str.extend(function.bin_convert(taku.kaze_honba[0], 3)) input_str = input_string_convert(input_str) print(input_str) #2→41 3→124 4→データ型改善 main_nn = N_network(124, 38) main_nn.model.load_weights("v1.hdf5") x = convert(input_str) x = np.array(x) y = x.reshape(1, 124) #重要
def eval_defense(janshi, taku, shanten_suu, temp_max, pure_point_list, bakyou_list): janshi_list = copy.deepcopy(janshi) janshi_p = janshi_list[0] nokori_tsumo_kaisuu = int(taku.yama_nokori / 4) vertual_yama = janshi_p.vertual_yama vertual_yama_index = function.tehai_convert(vertual_yama) tehai_len = len(janshi_p.tehai) eval_defense_point = np.zeros(tehai_len) for i in range(1, 4): #とりあえず立直者だけ警戒 if janshi_list[i].riichi: tenpai_prob = 3.0 elif janshi_list[i].fuurosuu != 0: tenpai_prob = janshi_list[i].fuurosuu * 0.1 * math.exp( ((17 - nokori_tsumo_kaisuu) / 17 - 1) * math.sqrt(5)) else: continue #打点期待値を設定 if janshi_list[i].kaze == 0: daten_expect = 10000 else: daten_expect = 7000 #max_pointの設定 #オーラスで最下位なら防御をほとんどしない if bakyou_list[0] == 4: max_point = temp_max * 0.1 else: max_point = temp_max #3シャンテン以上は倍 #if shanten_suu >= 3: # max_point *= 1.0 genbutsu_list = function.akadora_convert( janshi_list[i].sutehai)[0] + function.akadora_convert( janshi_list[i].temp_genbutsu)[0] #危険牌枚数を計上 temp_list = [ "1m", "2m", "3m", "4m", "5m", "6m", "7m", "8m", "9m", "1p", "2p", "3p", "4p", "5p", "6p", "7p", "8p", "9p", "1s", "2s", "3s", "4s", "5s", "6s", "7s", "8s", "9s", "1z", "2z", "3z", "4z", "5z", "6z", "7z" ] for j in range(len(genbutsu_list)): if genbutsu_list[j] in temp_list: temp_list.remove(genbutsu_list[j]) kikenhai_maisuu = len(temp_list) #save_max_point = max_point #手出しリスト作成 tedashi_list = [] for j in range(len(janshi_list[i].sutehai)): if janshi_list[i].tedashi_flag: tedashi_list.append(janshi_list[i].sutehai[j]) ############メイン######################### max_pure = max(pure_point_list) yuuido = max( (max_pure / (daten_expect * tenpai_prob / kikenhai_maisuu))**0.5, 0.66) print(yuuido) max_point /= yuuido for j in range(tehai_len): hai_index = function.hai_convert(janshi_p.tehai[j]) #現物ならmax_point与えてcontinue temp_hai_str = function.akadora_hai_convert(janshi_p.tehai[j]) if temp_hai_str in genbutsu_list: eval_defense_point[j] += max_point continue #字牌 if hai_index > 30: if vertual_yama_index[hai_index] == 0: eval_defense_point[j] += max_point continue elif vertual_yama_index[hai_index] == 1: eval_defense_point[j] += max_point * 0.8 continue elif vertual_yama_index[hai_index] == 2: eval_defense_point[j] += max_point * 0.5 continue elif vertual_yama_index[hai_index] == 3: eval_defense_point[j] += max_point * 0.2 continue #牌の種類によって減点 if hai_index < 30: if hai_index % 10 == 1 or hai_index % 10 == 9: eval_defense_point[j] -= max_point * 0.1 elif hai_index % 10 == 2 or hai_index % 10 == 2: eval_defense_point[j] -= max_point * 0.2 elif hai_index % 10 == 3 or hai_index % 10 == 4 or hai_index % 10 == 5 or hai_index % 10 == 6 or hai_index % 10 == 7: eval_defense_point[j] -= max_point * 0.3 #赤ドラ else: eval_defense_point[j] -= max_point * 0.5 #筋牌ならば加点。宣言牌の筋は知らん if suji_hantei(genbutsu_list, hai_index): eval_defense_point[j] += max_point * 0.5 #最終手出しおよびその一つ前の手出しのマタギならば減点。マタギは赤ドラを考えない。 matagi_list = matagi_henkan(hai_index) if len(tedashi_list) >= 1: if function.hai_convert(tedashi_list[-1]) in matagi_list: eval_defense_point[j] -= max_point * 0.5 if len(tedashi_list) >= 2: if function.hai_convert(tedashi_list[-2]) in matagi_list: eval_defense_point[j] -= max_point * 0.5 #裏筋ならば減点 urasuji_list = urasuji_henkan(hai_index) sutehai_index_list = function.akadora_convert3( function.tehai_convert3(tedashi_list))[0] for k in range(len(urasuji_list)): if urasuji_list[k] in sutehai_index_list: eval_defense_point[j] -= max_point * 0.4 #序盤に切れた数牌の外側に対して加点 sutehai_len = len(janshi_list[i].sutehai) if sutehai_len > 6: sotohai_list = sotohai_find(janshi_list[i].sutehai, min(int(sutehai_len / 3), 4)) if hai_index in sotohai_list: eval_defense_point[j] += max_point * 0.5 #カベの外側に対して加点 eval_defense_point[j] += max_point * kabe_eval( vertual_yama_index, hai_index) #max_pointに補正 if abs(eval_defense_point[j]) > max_point: eval_defense_point[j] *= max_point / abs(eval_defense_point[j]) return eval_defense_point
def new_yuukouhai_explore(shanten_suu, janshi, taku): #print("aaaaaaaaaaaaaaaaaaaaa") global sum_list, pure_point_sum global janshi_global, yama_global, taku_global, shanten_suu_global, itr_global hash_table = taku.hash_table tehai = np.array(function.tehai_convert(janshi.tehai)) #ツモって来る牌に赤ドラは考慮しない yama = np.array( function.tehai_convert( function.akadora_convert(janshi.vertual_yama)[0])) init_shanten_suu = shanten_suu #index_list = [0]*len(tehai) sum_list = [0] * len(tehai) pure_point_sum = [0] * len(tehai) print(len(sum_list)) #mean_list = [0]*len(tehai) if shanten_suu >= 2: hai_list = find_yuukou_sutehai(janshi, init_shanten_suu, hash_table) #テンパイならシャンテン戻しも考える else: hai_list = function.tehai_convert3(janshi.tehai) #print(hai_list) #副露した時でアガリ役なしの場合 if len(hai_list) == 0: #print("no_hai_list_error") return [0.001] * len(janshi.tehai), [0.001] * len( janshi.tehai), [0.001] * len(janshi.tehai) #バグ防止用 for i in hai_list: sum_list[i] += 0.001 #print(hai_list) if init_shanten_suu >= 2: itr = 25 elif init_shanten_suu == 1: itr = 20 else: itr = 15 itr_global = itr janshi_global = janshi yama_global = yama taku_global = taku taku.hash_table = None shanten_suu_global = shanten_suu temp_list = [[hai_id, janshi, yama, taku, shanten_suu, itr] for hai_id in reversed(hai_list)] p = Pool(multi.cpu_count()) print(multi.cpu_count()) print(hai_list) #print(time.time()) p.starmap(temp_process, temp_list) #p.map(test_process, hai_list) p.close() taku.hash_table = hash_table for i in hai_list: print(i) for j in range(itr): count = 1.0 temp_janshi = copy.deepcopy(janshi) #temp_tehai = tehai.copy() temp_yama = yama.copy() #temp_tehai[i] -= 1 temp_janshi.tehai.remove(function.hai_convert_reverse( i)) # = function.tehai_convert_reverse(temp_tehai) temp_janshi.sutehai.append(function.hai_convert_reverse(i)) if j == 0: init_shanten_suu = shanten_check_new.shanten_check( temp_janshi, taku.hash_table) a, b = yuukouhai_explore(temp_yama, init_shanten_suu, count, hash_table, temp_janshi, taku) #index_list[i] += 1 sum_list[i] += a pure_point_sum[i] += b #shanten_suu + 1で平均打点を割る pure_point_sum[i] /= max(init_shanten_suu + 1, 1) * itr
def tacha_dahai(key, janshi, taku, splitted_read_text): output2 = ["", ""] start = time.time() hai_136 = int(splitted_read_text[1].strip(key)) hai_str = function_tenhou.hai_convert_136_to_str(hai_136) janshi[0].vertual_yama.remove(hai_str) janshi[key_to_index[key]].sutehai.append(hai_str) janshi[key_to_index[key]].tedashi_flag.append(key.isupper) #keyが大文字なら手出し janshi[key_to_index[key]].temp_genbutsu = [] for k in range(1, 4): janshi[k].temp_genbutsu.append(hai_str) print(key_to_char[key] + " 打:" + hai_str) taku.last_dahai = hai_136 #直前の打牌。鳴きに利用する。 taku.last_teban = key_to_index[key] #直前の打牌をしたプレイヤー #以下鳴き 鳴きの基本方針→赤ドラを副露牌に含められるときは必ず含める if len(splitted_read_text) > 2: #ロン通知 if int(splitted_read_text[3]) >= 8: #あがる print("AI ロン") #天鳳に出力 if time.time() - start < taku.sleep_time_thresh: time.sleep(taku.sleep_time) gui_click("Agari") return None #ポン通知 elif splitted_read_text[3] == "1" or splitted_read_text[3] == "3": #ポン打診 pon_index = janshi[0].pon(taku, hai_str, janshi, taku.bakyou_list) if pon_index[0]: print("AI ポン") #ポンする #ポンする牌のindex pon_hai_index = function_tenhou.hai_convert_136_to_index( taku.last_dahai) #赤なら普通の5に書き換え if pon_hai_index % 10 == 0: pon_hai_index += 5 #もし赤じゃない5をポンするなら if pon_hai_index % 10 == 5 and pon_hai_index < 30: tehai_index = function.tehai_convert(janshi[0].tehai) #もし同じ色の赤を持っていたら if tehai_index[pon_hai_index - 5] == 1: output2 = [ function.hai_convert_reverse(pon_hai_index - 5), function.hai_convert_reverse(pon_hai_index) ] else: output2 = [ function.hai_convert_reverse(pon_hai_index), function.hai_convert_reverse(pon_hai_index) ] else: output2 = [ function.hai_convert_reverse(pon_hai_index), function.hai_convert_reverse(pon_hai_index) ] #print("ポンする牌:" + output2) #天鳳に出力 if time.time() - start < taku.sleep_time_thresh: time.sleep(taku.sleep_time) print(output2) gui_click("Pon_Chii", output2) #打牌時の情報を追加 taku.naki_dahai = pon_index[1] print("AI 打:" + taku.naki_dahai) return None else: #鳴かない print("AI スルー") #天鳳に出力 if time.time() - start < taku.sleep_time_thresh: time.sleep(taku.sleep_time) gui_click("Cancel") return None #チー通知 elif splitted_read_text[3] == "4": #チー打診 chii_index = janshi[0].chii(taku, hai_str, janshi, taku.bakyou_list) if chii_index[0] != -1: print("AI チー: index = " + str(chii_index[0])) #チーする #チーする牌のindex chii_hai_index = function_tenhou.hai_convert_136_to_index( taku.last_dahai) #赤をチー if chii_hai_index % 10 == 0: chii_hai_index += 5 if chii_index[0] == 0: output2[0] = function.hai_convert_reverse( chii_hai_index - 2) output2[1] = function.hai_convert_reverse( chii_hai_index - 1) elif chii_index[0] == 1: output2[0] = function.hai_convert_reverse( chii_hai_index - 1) output2[1] = function.hai_convert_reverse( chii_hai_index + 1) else: # chii_index[0] == 2: output2[0] = function.hai_convert_reverse( chii_hai_index + 1) output2[1] = function.hai_convert_reverse( chii_hai_index + 2) #赤以外をチー else: if chii_index[0] == 0: output2[0] = function.hai_convert_reverse( chii_hai_index - 2) output2[1] = function.hai_convert_reverse( chii_hai_index - 1) elif chii_index[0] == 1: output2[0] = function.hai_convert_reverse( chii_hai_index - 1) output2[1] = function.hai_convert_reverse( chii_hai_index + 1) else: # chii_index[0] == 2: output2[0] = function.hai_convert_reverse( chii_hai_index + 1) output2[1] = function.hai_convert_reverse( chii_hai_index + 2) #赤の書き換え if chii_index[2]: for j in range(2): if output2[j] == "5m": output2[j] = "5M" elif output2[j] == "5p": output2[j] = "5P" elif output2[j] == "5s": output2[j] = "5S" #天鳳に出力 print(output2) if time.time() - start < taku.sleep_time_thresh: time.sleep(taku.sleep_time) gui_click("Pon_Chii", output2) #打牌時の情報を追加 taku.naki_dahai = chii_index[1] print("AI 打:" + taku.naki_dahai) return None else: #鳴かない print("AI スルー") #天鳳に出力 if time.time() - start < taku.sleep_time_thresh: time.sleep(taku.sleep_time) gui_click("Cancel") return None #ポンチー通知#ポンチーダイミンカン通知 elif splitted_read_text[3] == "5" or splitted_read_text[3] == "7": #ポンチー打診 pon_index = janshi[0].pon(taku, hai_str, janshi, taku.bakyou_list) if pon_index[0]: print("AI ポン") #ポンする #ポンする牌のindex pon_hai_index = function_tenhou.hai_convert_136_to_index( taku.last_dahai) #赤なら普通の5に書き換え if pon_hai_index % 10 == 0: pon_hai_index += 5 #もし赤じゃない5をポンするなら if pon_hai_index % 10 == 5 and pon_hai_index < 30: tehai_index = function.tehai_convert(janshi[0].tehai) #もし同じ色の赤を持っていたら if tehai_index[pon_hai_index - 5] == 1: output2 = [ function.hai_convert_reverse(pon_hai_index - 5), function.hai_convert_reverse(pon_hai_index) ] else: output2 = [ function.hai_convert_reverse(pon_hai_index), function.hai_convert_reverse(pon_hai_index) ] else: output2 = [ function.hai_convert_reverse(pon_hai_index), function.hai_convert_reverse(pon_hai_index) ] #print("ポンする牌:" + output) #天鳳に出力 print(output2) if time.time() - start < taku.sleep_time_thresh: time.sleep(taku.sleep_time) gui_click("Pon_Chii", output2) #打牌時の情報を追加 taku.naki_dahai = pon_index[1] print("AI 打:" + taku.naki_dahai) return None chii_index = janshi[0].chii(taku, hai_str, janshi, taku.bakyou_list) if chii_index[0] != -1: print("AI チー: index = " + str(chii_index[0])) #チーする #チーする牌のindex chii_hai_index = function_tenhou.hai_convert_136_to_index( taku.last_dahai) #赤をチー if chii_hai_index % 10 == 0: chii_hai_index += 5 if chii_index[0] == 0: output2[0] = function.hai_convert_reverse( chii_hai_index - 2) output2[1] = function.hai_convert_reverse( chii_hai_index - 1) elif chii_index[0] == 1: output2[0] = function.hai_convert_reverse( chii_hai_index - 1) output2[1] = function.hai_convert_reverse( chii_hai_index + 1) else: # chii_index[0] == 2: output2[0] = function.hai_convert_reverse( chii_hai_index + 1) output2[1] = function.hai_convert_reverse( chii_hai_index + 2) #赤以外をチー else: if chii_index[0] == 0: output2[0] = function.hai_convert_reverse( chii_hai_index - 2) output2[1] = function.hai_convert_reverse( chii_hai_index - 1) elif chii_index[0] == 1: output2[0] = function.hai_convert_reverse( chii_hai_index - 1) output2[1] = function.hai_convert_reverse( chii_hai_index + 1) else: # chii_index[0] == 2: output2[0] = function.hai_convert_reverse( chii_hai_index + 1) output2[1] = function.hai_convert_reverse( chii_hai_index + 2) #赤の書き換え if chii_index[2]: for j in range(2): if output2[j] == "5m": output2[j] = "5M" elif output2[j] == "5p": output2[j] = "5P" elif output2[j] == "5s": output2[j] = "5S" #天鳳に出力 print(output2) if time.time() - start < taku.sleep_time_thresh: time.sleep(taku.sleep_time) gui_click("Pon_Chii", output2) #打牌時の情報を追加 taku.naki_dahai = chii_index[1] print("AI 打:" + taku.naki_dahai) return None #鳴かない print("AI スルー") #天鳳に出力 if time.time() - start < taku.sleep_time_thresh: time.sleep(taku.sleep_time) gui_click("Cancel") return None return None
def new_yuukouhai_explore(shanten_suu, janshi, taku, kuikae_list, top4_list, janshi_list, bakyou_list): hash_table = taku.hash_table tehai = np.array(function.tehai_convert(janshi.tehai)) danger_degree_list = danger_degree.create_danger_degree_list(janshi_list, taku, bakyou_list) #print(danger_degree_list) #ツモって来る牌に赤ドラは考慮しない yama = np.array(function.tehai_convert(function.akadora_convert(janshi.vertual_yama)[0])) init_shanten_suu = shanten_suu #index_list = [0]*len(tehai) sum_list = [0]*len(tehai) pure_point_sum = [0]*len(tehai) pure_pure_point_sum = [0]*len(tehai) max_point = [0]*len(tehai) #mean_list = [0]*len(tehai) if init_shanten_suu >= 2: hai_list = top4_list else: hai_list = find_yuukou_sutehai(janshi, init_shanten_suu, hash_table) #print(hai_list) #hai_listからkuikae_listを削除 temp_hai_list = hai_list.copy() for i in range(len(hai_list)): if temp_hai_list[i] in kuikae_list: hai_list.remove(temp_hai_list[i]) #副露した時でアガリ役なしの場合 if len(hai_list) == 0: #print("no_hai_list_error") return [0.001]*len(janshi.tehai), [0.001]*len(janshi.tehai), [0.001]*len(janshi.tehai), [0.001]*len(janshi.tehai), [0.001]*len(janshi.tehai), [0.001]*len(janshi.tehai) #バグ防止用 for i in hai_list: sum_list[i] += 0.001 #print(hai_list) if init_shanten_suu >= 2: itr = 20 else: itr = 25 for i in hai_list: for j in range(itr): count = 1. temp_janshi = copy.deepcopy(janshi) temp_yama = yama.copy() temp_janshi.tehai.remove(function.hai_convert_reverse(i)) temp_janshi.sutehai.append(function.hai_convert_reverse(i)) #評価用の修正されたpoint, 普通の点数 a, b, c = yuukouhai_explore(temp_yama, init_shanten_suu, count, hash_table, temp_janshi, taku , janshi_list, bakyou_list, danger_degree_list) #オーラス用max_pointの更新など if b > max_point[i]: max_point[i] = b pure_point_sum[i] += b pure_pure_point_sum[i] += c #index_list[i] += 1 sum_list[i] += a pure_pure_point_sum[i] /= max(init_shanten_suu + 1, 1)*itr normalized_index_list = np.array(sum_list)/np.sum(np.array(sum_list)) normalized_list = np.zeros(len(janshi.tehai)) sum_list_for_tehai_str = np.zeros(len(janshi.tehai)) pure_point_mean = np.array(pure_point_sum)/float(itr) max_point_list = np.zeros(len(janshi.tehai)) pure_point_mean_list = np.zeros(len(janshi.tehai)) pure_point_sum_for_tehai_str = np.zeros(len(janshi.tehai)) for i in range(len(janshi.tehai)): normalized_list[i] = normalized_index_list[function.hai_convert(janshi.tehai[i])] sum_list_for_tehai_str[i] = sum_list[function.hai_convert(janshi.tehai[i])] max_point_list[i] = max_point[function.hai_convert(janshi.tehai[i])] pure_point_mean_list[i] = pure_point_mean[function.hai_convert(janshi.tehai[i])] pure_point_sum_for_tehai_str[i] = pure_pure_point_sum[function.hai_convert(janshi.tehai[i])] mean_list_for_tehai_str = sum_list_for_tehai_str/float(itr) return normalized_list, sum_list_for_tehai_str, mean_list_for_tehai_str, max_point_list, pure_point_mean_list, pure_point_sum_for_tehai_str
def new_yuukouhai_explore(shanten_suu, janshi, taku): #print("aaaaaaaaaaaaaaaaaaaaa") global sum_list, pure_point_sum hash_table = taku.hash_table tehai = np.array(function.tehai_convert(janshi.tehai)) #ツモって来る牌に赤ドラは考慮しない yama = np.array( function.tehai_convert( function.akadora_convert(janshi.vertual_yama)[0])) init_shanten_suu = shanten_suu #index_list = [0]*len(tehai) sum_list = [0] * len(tehai) pure_point_sum = [0] * len(tehai) #mean_list = [0]*len(tehai) if shanten_suu >= 2: hai_list = find_yuukou_sutehai(janshi, init_shanten_suu, hash_table) #テンパイならシャンテン戻しも考える else: hai_list = function.tehai_convert3(janshi.tehai) #print(hai_list) #副露した時でアガリ役なしの場合 if len(hai_list) == 0: #print("no_hai_list_error") return [0.001] * len(janshi.tehai), [0.001] * len( janshi.tehai), [0.001] * len(janshi.tehai) #バグ防止用 for i in hai_list: sum_list[i] += 0.001 #print(hai_list) if init_shanten_suu >= 2: itr = 25 elif init_shanten_suu == 1: itr = 20 else: itr = 15 temp_list = [(hai_id, janshi, yama, taku, shanten_suu, pure_point_sum, itr) for hai_id in hai_list] p = Pool(multi.cpu_count()) p.map(test_process, range(1000)) p.close() ''' for i in hai_list: for j in range(itr): count = 1.0 temp_janshi = copy.deepcopy(janshi) #temp_tehai = tehai.copy() temp_yama = yama.copy() #temp_tehai[i] -= 1 temp_janshi.tehai.remove(function.hai_convert_reverse(i)) # = function.tehai_convert_reverse(temp_tehai) temp_janshi.sutehai.append(function.hai_convert_reverse(i)) if j == 0: init_shanten_suu = shanten_check_new.shanten_check(temp_janshi, taku.hash_table) a, b = yuukouhai_explore(temp_yama, init_shanten_suu, count, hash_table, temp_janshi, taku) #index_list[i] += 1 sum_list[i] += a pure_point_sum[i] += b #shanten_suu + 1で平均打点を割る pure_point_sum[i] /= max(init_shanten_suu + 1, 1)*itr ''' #print(np.max(sum_list)) normalized_index_list = np.array(sum_list) / np.sum(np.array(sum_list)) normalized_list = np.zeros(len(janshi.tehai)) sum_list_for_tehai_str = np.zeros(len(janshi.tehai)) pure_point_sum_for_tehai_str = np.zeros(len(janshi.tehai)) for i in range(len(janshi.tehai)): normalized_list[i] = normalized_index_list[function.hai_convert( janshi.tehai[i])] sum_list_for_tehai_str[i] = sum_list[function.hai_convert( janshi.tehai[i])] pure_point_sum_for_tehai_str[i] = pure_point_sum[function.hai_convert( janshi.tehai[i])] sum_list_for_tehai_str = np.array(sum_list_for_tehai_str) mean_list_for_tehai_str = sum_list_for_tehai_str / float(itr) pure_point_sum_for_tehai_str = np.array(pure_point_sum_for_tehai_str) return normalized_list, mean_list_for_tehai_str, pure_point_sum_for_tehai_str
def eval_tehai_point(janshi, taku): #デバッグモード debug_mode = 0 #パラメータ関連 #各シャンテン数に対する平均有効牌枚数 mean_list = [ 4.575752953784895, 12.18668553881974, 23.338351152742664, 40.50627978155267, 60.56931288649266, 77.81782501846193, 100.03097486813587 ] shanten_bonus = 5 yuukouhai_bonus = 2.0 yuukouhai_pow_const = 1.0 dora_bonus0 = 1.1 #ドラインデックスの牌 dora_bonus1 = 0.6 #ドラインデックス前後の牌 dora_bonus2 = 0.3 #ドラインデックスから2枚離れた牌 yakuhai_bonus = [0, 0.2, 0.7, 1.2] #0枚~3枚以上 ryanmen_bonus = 0.3 penchan_penalty = -0.5 koritsu_yaochu_penalty = -0.25 #1,9 koritsu_suuhai_penalty2 = -0.05 #2,8 koritsu_suuhai_penalty3 = -0.01 #3~7 koritsu_jihai_penalty = -0.33 koritsu_nokori_yakuhai_penalty = [-0.5, -0.35, -0.2, 0.0] toitsu_nokori_yakuhai_penalty = [-1.2, -0.7, 0.0, 0.0] koritsu_nokori_jihai_penalty = [-0.3, -0.2, -0.1, 0.0] toitsu_nokori_jihai_penalty = [-0.4, -0.3, 0.0, 0.0] tanyao_bonus = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.3, 0.6, 1.0] ittsuu_bonus = [0, 0, 0, 0, 0, 0, 0.2, 0.7, 1.1, 1.4] sansyoku_bonus = [0, 0, 0, 0, 0, 0, 0.2, 0.8, 1.2, 1.6] honitsu_bonus = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.5, 1.0, 2.0, 3.0] yipeko_param1 = 1.0 #222 yipeko_param2 = 0.8 #122, 221 yipeko_param3 = 0.6 #212 yipeko_param4 = 0.5 #212(1,9含む) yipeko_param5 = 0.4 #221, 122(1,9含む) furiten_penalty = [-0.2, -0.5, -0.2] furiten_penalty_for_yuukouhai = -0.4 mentsu_bonus = 1.0 #メイン eval_point_list = [0] * len(janshi.tehai) old_shanten_suu = shanten_check_new.shanten_check(janshi, taku.hash_table) for i in range(len(janshi.tehai)): if debug_mode: print("捨てる牌: " + janshi.tehai[i]) #コピーして手牌を1つ削除 temp_janshi = copy.deepcopy(janshi) temp_janshi.sutehai.append(temp_janshi.tehai[i]) del temp_janshi.tehai[i] #赤ドラだけ抜き出してあとは赤ナシで考える temp = function.akadora_convert(temp_janshi.tehai) akadora_maisuu = temp[1] temp_janshi.tehai = temp[0] tehai = function.tehai_convert(temp_janshi.tehai) #vertual_yama vertual_yama_index = function.tehai_convert(temp_janshi.vertual_yama) #print(vertual_yama_index) #メンツカウント mentsu_suu = mentsu_count.mentsu_count(temp_janshi) mentsu_point = mentsu_suu * mentsu_bonus eval_point_list[i] += mentsu_point if debug_mode: print("メンツボーナス: " + str(mentsu_point)) #シャンテン数関連 new_shanten_suu = shanten_check_new.shanten_check( temp_janshi, taku.hash_table) if old_shanten_suu == new_shanten_suu: eval_point_list[i] += shanten_bonus if debug_mode: print("シャンテンアップボーナス: " + str(shanten_bonus)) else: if debug_mode: print("シャンテンアップボーナス: " + str(0)) #print(eval_point_list[i]) #有効牌関連 yuukouhai_maisuu = function.calc_yuukouhai_maisuu( temp_janshi, new_shanten_suu, taku.hash_table) yuukouhai_point = ((yuukouhai_maisuu / (len(temp_janshi.vertual_yama) / 123.0 * mean_list[new_shanten_suu]))** yuukouhai_pow_const) * yuukouhai_bonus eval_point_list[i] += yuukouhai_point if debug_mode: print("有効牌ボーナス: " + str(yuukouhai_point)) #print(eval_point_list[i]) #ドラ関連とりあえず1枚の時だけ dora_index = [] dora_hyouji_index = function.tehai_convert2( function.akadora_convert(taku.dorahyouji)[0]).copy() for j in range(len(taku.dorahyouji)): ##まずドラのインデックスを求める if dora_hyouji_index[j] < 30: if dora_hyouji_index[j] % 10 == 9: dora_index.append(dora_hyouji_index[j] - 8) else: dora_index.append(dora_hyouji_index[j] + 1) else: if dora_hyouji_index[j] == 34: dora_index.append(31) elif dora_hyouji_index[j] == 37: dora_index.append(35) else: dora_index.append(dora_hyouji_index[j] + 1) dora_point = 0 #赤ドラ dora_point += akadora_maisuu * dora_bonus0 for j in range(len(dora_index)): if dora_index[j] < 30: if dora_index[j] % 10 == 1: dora_point += tehai[dora_index[j]] * dora_bonus0 dora_point += bool(tehai[dora_index[j] + 1]) * dora_bonus1 dora_point += bool(tehai[dora_index[j] + 2]) * dora_bonus2 elif dora_index[j] % 10 == 2: dora_point += bool(tehai[dora_index[j] - 1]) * dora_bonus2 dora_point += tehai[dora_index[j]] * dora_bonus0 dora_point += bool(tehai[dora_index[j] + 1]) * dora_bonus1 dora_point += bool(tehai[dora_index[j] + 2]) * dora_bonus2 elif dora_index[j] % 10 == 8: dora_point += bool(tehai[dora_index[j] - 2]) * dora_bonus2 dora_point += bool(tehai[dora_index[j] - 1]) * dora_bonus1 dora_point += tehai[dora_index[j]] * dora_bonus0 dora_point += bool(tehai[dora_index[j] + 1]) * dora_bonus2 elif dora_index[j] % 10 == 1: dora_point += tehai[dora_index[j]] * dora_bonus0 dora_point += bool(tehai[dora_index[j] - 1]) * dora_bonus1 dora_point += bool(tehai[dora_index[j] - 2]) * dora_bonus2 else: dora_point += bool(tehai[dora_index[j] - 2]) * dora_bonus2 dora_point += bool(tehai[dora_index[j] - 1]) * dora_bonus1 dora_point += tehai[dora_index[j]] * dora_bonus0 dora_point += bool(tehai[dora_index[j] + 1]) * dora_bonus1 dora_point += bool(tehai[dora_index[j] + 2]) * dora_bonus2 else: dora_point += tehai[dora_index[j]] * dora_bonus0 eval_point_list[i] += dora_point if debug_mode: print("ドラボーナス: " + str(dora_point)) #print(eval_point_list[i]) #役牌 if taku.kaze_honba[0] < 4: bakaze_index = 31 else: bakaze_index = 32 jikaze_index = temp_janshi.kaze + 31 yakuhai_point = 0 yakuhai_point += yakuhai_bonus[tehai[bakaze_index]] yakuhai_point += yakuhai_bonus[tehai[jikaze_index]] yakuhai_point += yakuhai_bonus[tehai[35]] yakuhai_point += yakuhai_bonus[tehai[36]] yakuhai_point += yakuhai_bonus[tehai[37]] #ペナ if tehai[bakaze_index] == 1: yakuhai_point += koritsu_nokori_yakuhai_penalty[ vertual_yama_index[bakaze_index]] elif tehai[bakaze_index] == 2: yakuhai_point += toitsu_nokori_yakuhai_penalty[ vertual_yama_index[bakaze_index]] if tehai[jikaze_index] == 1: yakuhai_point += koritsu_nokori_yakuhai_penalty[ vertual_yama_index[jikaze_index]] elif tehai[jikaze_index] == 2: yakuhai_point += toitsu_nokori_yakuhai_penalty[ vertual_yama_index[jikaze_index]] for j in range(3): if tehai[35 + j] == 1: yakuhai_point += koritsu_nokori_yakuhai_penalty[ vertual_yama_index[35 + j]] elif tehai[35 + j] == 2: yakuhai_point += toitsu_nokori_yakuhai_penalty[ vertual_yama_index[35 + j]] #役牌以外の字牌に対するペナ for j in range(4): if 31 + j != bakaze_index and 31 + j != jikaze_index: if tehai[31 + j] == 1: yakuhai_point += koritsu_nokori_jihai_penalty[ vertual_yama_index[31 + j]] elif tehai[31 + j] == 2: yakuhai_point += toitsu_nokori_jihai_penalty[ vertual_yama_index[31 + j]] eval_point_list[i] += yakuhai_point if debug_mode: print("役牌ボーナス: " + str(yakuhai_point)) #print(eval_point_list[i]) #リャンメンボーナス(テスト) ryanmen_point = 0 for j in range(30): if 2 <= j % 10 <= 7: if tehai[j - 1] == 0 and tehai[j] >= 1 and tehai[ j + 1] >= 1 and tehai[j + 2] == 0: ryanmen_point += ryanmen_bonus eval_point_list[i] += ryanmen_point if debug_mode: print("リャンメンボーナス: " + str(ryanmen_point)) #print(eval_point_list[i]) #ペンチャンペナルティ penchan_point = 0 for j in range(30): if j % 10 == 1 or j % 10 == 8: if tehai[j - 1] == 0 and tehai[j] == 1 and tehai[ j + 1] == 1 and tehai[j + 2] == 0: penchan_point += penchan_penalty elif tehai[j - 1] == 0 and tehai[j] >= 1 and tehai[ j + 1] >= 1 and tehai[j + 2] == 0: penchan_point += penchan_penalty * 0.1 if debug_mode: print("ペンチャンペナルティ: " + str(penchan_point)) eval_point_list[i] += penchan_point #孤立牌ペナルティandフリテンペナルティ koritsu_suuhai_point = 0 koritsu_jihai_point = 0 koritsu_list = function.tehai_koritsu_hantei(temp_janshi.tehai) for j in koritsu_list: koritsu_index = function.hai_convert(temp_janshi.tehai[j]) if koritsu_index < 30: if (koritsu_index % 10 == 2) or (koritsu_index % 10 == 8): koritsu_suuhai_point += koritsu_suuhai_penalty2 elif 3 <= koritsu_index % 10 <= 7: koritsu_suuhai_point += koritsu_suuhai_penalty3 else: koritsu_suuhai_point += koritsu_yaochu_penalty else: koritsu_jihai_point += koritsu_jihai_penalty eval_point_list[i] += koritsu_suuhai_point if debug_mode: print("孤立数牌ペナルティ: " + str(koritsu_suuhai_point)) eval_point_list[i] += koritsu_jihai_point if debug_mode: print("孤立字牌ペナルティ: " + str(koritsu_jihai_point)) #print(eval_point_list[i]) #フリテンペナルティ 孤立牌がフリテン絡みand有効牌がフリテン絡み furiten_point = 0 kawa_no_akadora = function.tehai_convert( function.akadora_convert(temp_janshi.sutehai)[0]) for j in range(len(kawa_no_akadora)): kawa_no_akadora[j] = bool(kawa_no_akadora[j]) #孤立牌に対して for j in koritsu_list: koritsu_index = function.hai_convert(temp_janshi.tehai[j]) if koritsu_index < 30: if 2 <= koritsu_index % 10 <= 8: if kawa_no_akadora[koritsu_index - 2]: furiten_point += furiten_penalty[2] if kawa_no_akadora[koritsu_index - 1]: furiten_point += furiten_penalty[1] if kawa_no_akadora[koritsu_index]: furiten_point += furiten_penalty[0] if kawa_no_akadora[koritsu_index + 1]: furiten_point += furiten_penalty[1] if kawa_no_akadora[koritsu_index + 2]: furiten_point += furiten_penalty[2] elif koritsu_index % 10 == 1: if kawa_no_akadora[koritsu_index]: furiten_point += furiten_penalty[0] if kawa_no_akadora[koritsu_index + 1]: furiten_point += furiten_penalty[1] if kawa_no_akadora[koritsu_index + 2]: furiten_point += furiten_penalty[2] elif koritsu_index % 10 == 9: if kawa_no_akadora[koritsu_index - 2]: furiten_point += furiten_penalty[2] if kawa_no_akadora[koritsu_index - 1]: furiten_point += furiten_penalty[1] if kawa_no_akadora[koritsu_index]: furiten_point += furiten_penalty[0] else: if kawa_no_akadora[koritsu_index]: furiten_point += furiten_penalty[0] #有効牌に対して yuukouhai_index_list = function.find_yuukouhai(temp_janshi, new_shanten_suu, taku.hash_table) for index in yuukouhai_index_list: if kawa_no_akadora[index]: furiten_point += furiten_penalty_for_yuukouhai eval_point_list[i] += furiten_point if debug_mode: print("フリテンペナルティ: " + str(furiten_point)) #タンヤオボーナス tanyao_point = 0 tanyao_sum = function.tanyao_sum_up(temp_janshi) tanyao_point = tanyao_bonus[tanyao_sum] eval_point_list[i] += tanyao_point if debug_mode: print("タンヤオボーナス: " + str(tanyao_point)) #print(eval_point_list[i]) #一通ボーナス ittsuu_point = 0 for j in range(3): ittsuu_point += ittsuu_bonus[function.ittsuu_sum_up( temp_janshi, j)] eval_point_list[i] += ittsuu_point if debug_mode: print("一通ボーナス: " + str(ittsuu_point)) #print(eval_point_list[i]) #三色ボーナス sansyoku_point = 0 for j in range(1, 8): sansyoku_point += sansyoku_bonus[function.sansyoku_sum_up( temp_janshi, j)] eval_point_list[i] += sansyoku_point if debug_mode: print("三色ボーナス: " + str(sansyoku_point)) #ホンイツボーナス honitsu_point = 0 for j in range(3): honitsu_point += honitsu_bonus[function.honitsu_sum_up( temp_janshi, j)] eval_point_list[i] += honitsu_point if debug_mode: print("ホンイツボーナス: " + str(honitsu_point)) #一盃口ボーナス yipeko_point = 0 for j in range(3): yipeko_point += function.yipeko_eval(janshi, j, yipeko_param1, yipeko_param2, yipeko_param3, yipeko_param4, yipeko_param5) eval_point_list[i] += yipeko_point if debug_mode: print("一盃口ボーナス: " + str(yipeko_point)) if debug_mode: print(" トータルポイント: " + str(eval_point_list[i])) print() eval_point_array = np.array(eval_point_list) normalized_eval_point_array = eval_point_array / np.sum(eval_point_array) return normalized_eval_point_array
def create_dataset(input_file_name, target_file_name): janshi = majang.Janshi_p(2) taku = majang.Taku() yama = Yama() t = str(int(time.time())) path1 = os.getcwd() + "\data\inputs\\" + input_file_name + ".txt" path2 = os.getcwd() + "\data\\targets\\" + target_file_name + ".txt" input_file = open(path1, "w") target_file = open(path2, "w") #create data for ep in range(1000): input_file.close() input_file.close() input_file = open(path1, "a") target_file = open(path2, "a") print() print("episode = " + str(ep)) yama.reset() janshi.janshi_reset() taku.taku_reset() #配牌 for _ in range(14): temp1 = random.randrange(len(yama.nokori_yama)) janshi.tehai.append(yama.nokori_yama[temp1]) del yama.nokori_yama[temp1] #ドラ表 temp2 = random.randrange(len(yama.nokori_yama)) taku.dorahyouji = [yama.nokori_yama[temp2]] del yama.nokori_yama[temp2] #仮想山更新 janshi.init_vertual_yama(taku) #print("ドラ表示" + taku.dorahyouji[0]) #風 taku.kaze_honba[0] = random.randrange(8) janshi.kaze = random.randrange(4) #ゲーム開始 for junme in range(50): #print(str(junme) + "巡目") janshi.riipai() #print(janshi.tehai) shanten_suu = shanten_check_new.shanten_check( janshi, taku.hash_table) taku.yama_nokori = 50 if shanten_suu >= 0: temp = np.argmax(eval_ensemble.eval_tehai_point( janshi, taku)) #temp:手牌中における打牌のindex #elif shanten_suu == 1 or shanten_suu == 0: # temp = np.argmax(eval_ensemble.new_yuukouhai_explore(shanten_suu, janshi, taku)[0]) else: break #print("打 " + janshi.tehai[temp]) ###inputs input_str = [] input_str.extend( function.tehai_convert_binary( function.tehai_convert(janshi.tehai))) input_str.extend( function.bin_convert( function.tehai_convert(taku.dorahyouji)[0], 5)) input_str.extend(function.bin_convert(janshi.kaze, 2)) input_str.extend(function.bin_convert(taku.kaze_honba[0], 3)) input_str = input_string_convert(input_str) input_file.write(input_str) print(input_str) temp_str = janshi.tehai[temp] temp_list = function.tehai_convert([temp_str]) #for i in range(14): # if janshi.tehai[i] == temp_str: # temp_list.append(1) # else: # temp_list.append(0) target_str = input_string_convert(temp_list) target_file.write(target_str) del janshi.tehai[temp] temp3 = random.randrange(len(yama.nokori_yama)) #print("ツモ " + yama.nokori_yama[temp3]) janshi.tehai.append(yama.nokori_yama[temp3]) janshi.vertual_yama.remove(yama.nokori_yama[temp3]) del yama.nokori_yama[temp3] if janshi.vertual_yama != yama.nokori_yama: print("ERROR") input_file.close() target_file.close()