スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Pythonで機械学習Extra 1-1

こちらでは機械学習を学ぶ上で私が行っている、本では紹介されていないことを載せてます。

1つ目に行ったことはブラックジャックを機械学習で考えてみようと言うことです。

理由は2つ
・ブラックジャックは数学的に解析されているので、結果の比較がしやすいと考えたこと
・取り扱う情報量が少なく。ランダムを使用することでパターンの収集が楽に行えること

早速、機械学習を行う為にブラックジャックのプログラムを作成してみます。
# -*- coding: utf-8 -*-
#import numpy as np
import random

picture=["heart","spade","diamond","club"]
number=["A",2,3,4,5,6,7,8,9,10,"J","Q","K"]
deck=[True]*52#トランプの残り枚数 こいつはローカル変数
player=[]#「マーク、数」の順に2つでセット
dealer=[]
n=2#枚数

def score(players):
x=0#ループのカウント数
point=0#得点
a=0#エースの枚数
while x < len(players):
if players[x+1]=="A":
a+=1
point+=1
elif players[x+1]=="J":
point+=10
elif players[x+1]=="Q":
point+=10
elif players[x+1]=="K":
point+=10
else:
point+=number.index(players[x+1])+1
x+=2
while a > 0:
if point+10 < 22:#エースの調整
point+=10
a-=1
return point

def shuffle(decks):
decks=[True]*52
x=0
while x < len(dealer):
decks[picture.index(dealer[x])*13+number.index(dealer[x+1])]=False
x+=2
y=0
while y < len(player):
decks[picture.index(player[y])*13+number.index(player[y+1])]=False
y+=2
return decks

def hit(players):
global deck #グローバル変数化させる
x=0#ループのカウント数
while x < 2:
b=deck.count(True)
if b == 0:
deck=shuffle(deck)
R = random.choice(number)#ランダムに数を抽出
r = random.choice(picture)# ランダムにマークを抽出
if deck[picture.index(r)*13+number.index(R)]:#デッキの残りにあればTrue一致で処理する
# print ("drow->",r , R)
deck[picture.index(r)*13+number.index(R)]=False#デッキ情報の更新
players.append(r)
players.append(R)
x+=2

def display():
print ("dealer hands->",dealer[0],dealer[1])
print ("your hands->",player)
print ("your score->",score(player))
print ("deck->",deck.count(True))

def choose(player):
x=0#ループのカウント数
while x < 2:
if score(player) > 21:
break
print ("if you pull is your input [hit].")
print ("if you stop is your input [stand].")
input_line = input(">>> ")#入力
if input_line == 'hit':
hit(player)
display()
elif input_line == 'stand':
break
elif input_line == 'deck':
print (deck)
else:
print ("code error. select again your choose")

def setup(Dealer,players):#始まりの処理
while len(Dealer) < n*2:
hit(Dealer)
while len(players) < n*2:
hit(players)
display()

def finish():#終わりの処理
x=0#ループのカウント数
player_score = score(player)#確定してるのでループ外で変数化
while x < 2:
dealer_score = score(dealer)#更新が必要なのでループ内で変数化
print ("dealer hands->",dealer)
print ("dealer score->",score(dealer))
print ("your hands->",player)
print ("your score->",score(player))
print ("deck->",deck.count(True))
if dealer_score > 21:#ディーラーがバスト
print ("dealer is bust!")
print ("you win!")
x+=2
elif dealer_score > player_score:#ディーラーの勝利
print ("dealer choose")
print (">>> stand")
print ("you lose")
x+=2
elif dealer_score == player_score:#引き分け判定
print ("dealer choose")
print (">>> stand")
print ("draw")
x+=2
elif dealer_score > 16:#ディーラーの投了
print ("dealer choose")
print (">>> stand")
print ("you win!")
x+=2
else:
print ("dealer choose")
print(">>> hit")
hit(dealer)

#処理開始
setup(dealer,player)
choose(player)
print("finish")
if score(player) > 21:
print ("you are bust!")
print ("you lose")
else:
finish()
z=0
while z < 2:
print ("continue? y/n")
input_line = input(">>> ")#入力
if input_line == 'y':
del player[:]
del dealer[:]
print ("<>")
setup(dealer,player)
choose(player)
print("finish")
if score(player) > 21:
print ("you are bust!")
print ("you lose")
else:
finish()
elif input_line == 'n':
break
else:
print ("code error. select again your choose")

print("end")

覚え立てのptyhonで四苦八苦しながら組んだプログラムなので、細かい粗には目をつぶって頂いて・・・
困った箇所はいっぱいありますが、しいていくつか挙げるなら、
・勝敗条件の決定
・デッキのリシャッフル
・ブラックジャックの判定

プレイヤーの行動がhit/standの2つしかありませんが、これでブラックジャックの仕組みを再現できました。
今現在ではdouble down , surrender , insuranceも実装できましたがsplitはまだできていません。

これを使って簡単な機械学習を行いたいと思います。
細かい内容は次回に回します。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。

スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

yamoto.tvp

Author:yamoto.tvp
FC2ブログへようこそ!
大学の数学科に通うほど、数学が好きな私です。
趣味で勉強している”機械学習”などの進捗を載せています。

最新記事
最新コメント
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。