Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions algorithm/feature_context.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,23 @@
import numpy as np
from numpy.typing import NDArray
from dataclasses import dataclass
from dataclasses import dataclass, field
from game.board import compute_prefix_sum

from game.action import Action
from game.board import Board

@dataclass
class FeatureContext:
board: NDArray[np.int8] # 숫자 λ°°μ—΄μ˜ μ’Œν‘―κ°’
prefix: NDArray # λˆ„μ ν•©
count_by_value: dict[int, int] #μˆ«μžλ³„ λ‚¨μ•„μžˆλŠ” 개수
action : Action
_valid_actions: list | None = field(default=None, repr=False)

@property
def valid_actions(self): #valid action ν•¨μˆ˜ 뢈러였기
if self._valid_actions is None:
self._valid_actions = Board.get_valid_actions(self.board) # next_board κΈ°μ€€μœΌλ‘œ λ”± 1번
return self._valid_actions

@classmethod
def from_board(cls, board: NDArray[np.int8]) -> "FeatureContext":
Expand Down
63 changes: 30 additions & 33 deletions algorithm/features.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

#숫자 편ν–₯ features ex) μ§€μšΈ 수 μžˆλŠ” 'n'μ΄λΌλŠ” μˆ«μžκ°€ λͺ‡ 개 λ‚¨μ•˜λŠ”κ°€ 점수λ₯Ό 올림으둜써 μ§€μš°κ²Œλ” μœ λ„
def feature_remove_nine(ctx: FeatureContext) -> float:
area = ctx.area
area = ctx.board
if not(area == 9).any(): #격자 μ•ˆμ— 9κ°€ μ—†μ„μ‹œ 0을 returnν•œλ‹€
return 0.0
nine_count = int((area==9).sum()) #areaμ•ˆμ— 9κ°€ μžˆλŠ” 수의 개수
Expand All @@ -12,44 +12,41 @@ def feature_remove_nine(ctx: FeatureContext) -> float:
return sigmoid(nine_count, k = 0.5, x0 = 3.0) #μΆ”ν›„ 이 값을 μ‘°μ •ν•˜λ©΄μ„œ k κ°’κ³Ό x0 값을 찾아도 됨

def feature_remove_eight(ctx: FeatureContext) -> float:
area = ctx.area
if not(area == 8).any(): #격자 μ•ˆμ— 9κ°€ μ—†μ„μ‹œ 0을 returnν•œλ‹€
area = ctx.board
if not(area == 8).any():
return 0.0
eight_count = int((area==8).sum()) #areaμ•ˆμ— 9κ°€ μžˆλŠ” 수의 개수
if not _has_eight_pair(ctx): #9와 짝 μ§€μ–΄μ§€λŠ” 경우의 μˆ˜κ°€ 판 내에 μ‘΄μž¬ν•˜λŠ”μ§€
eight_count = int((area==8).sum())
if not _has_eight_pair(ctx):
return 0.0
return sigmoid(eight_count, k = 0.5, x0 = 3.0) #μΆ”ν›„ 이 값을 μ‘°μ •ν•˜λ©΄μ„œ k κ°’κ³Ό x0 값을 찾아도 됨
return sigmoid(eight_count, k = 0.5, x0 = 3.0)


def feature_remove_seven(ctx: FeatureContext) -> float:
area = ctx.area
if not(area == 7).any(): #격자 μ•ˆμ— 9κ°€ μ—†μ„μ‹œ 0을 returnν•œλ‹€
area = ctx.board
if not(area == 7).any():
return 0.0
seven_count = int((area==7).sum()) #areaμ•ˆμ— 9κ°€ μžˆλŠ” 수의 개수
if not _has_seven_pair(ctx): #9와 짝 μ§€μ–΄μ§€λŠ” 경우의 μˆ˜κ°€ 판 내에 μ‘΄μž¬ν•˜λŠ”μ§€
seven_count = int((area==7).sum())
if not _has_seven_pair(ctx):
return 0.0
return sigmoid(seven_count, k = 0.5, x0 = 3.0) #μΆ”ν›„ 이 값을 μ‘°μ •ν•˜λ©΄μ„œ k κ°’κ³Ό x0 값을 찾아도 됨
return sigmoid(seven_count, k = 0.5, x0 = 3.0)

def feature_remove_six(ctx: FeatureContext) -> float:
area = ctx.area
if not(area == 6).any(): #격자 μ•ˆμ— 9κ°€ μ—†μ„μ‹œ 0을 returnν•œλ‹€
area = ctx.board
if not(area == 6).any():
return 0.0
six_count = int((area==6).sum()) #areaμ•ˆμ— 9κ°€ μžˆλŠ” 수의 개수
if not _has_six_pair(ctx): #9와 짝 μ§€μ–΄μ§€λŠ” 경우의 μˆ˜κ°€ 판 내에 μ‘΄μž¬ν•˜λŠ”μ§€
six_count = int((area==6).sum())
if not _has_six_pair(ctx):
return 0.0
return sigmoid(six_count, k = 0.5, x0 = 3.0) #μΆ”ν›„ 이 값을 μ‘°μ •ν•˜λ©΄μ„œ k κ°’κ³Ό x0 값을 찾아도 됨
return sigmoid(six_count, k = 0.5, x0 = 3.0)

def feature_remove_five(ctx: FeatureContext) -> float:
area = ctx.area
if not(area == 5).any(): #격자 μ•ˆμ— 9κ°€ μ—†μ„μ‹œ 0을 returnν•œλ‹€
area = ctx.board
if not(area == 5).any():
return 0.0
five_count = int((area==5).sum()) #areaμ•ˆμ— 9κ°€ μžˆλŠ” 수의 개수
if not _has_five_pair(ctx): #9와 짝 μ§€μ–΄μ§€λŠ” 경우의 μˆ˜κ°€ 판 내에 μ‘΄μž¬ν•˜λŠ”μ§€
five_count = int((area==5).sum())
if not _has_five_pair(ctx):
return 0.0
return sigmoid(five_count, k = 0.5, x0 = 3.0) #μΆ”ν›„ 이 값을 μ‘°μ •ν•˜λ©΄μ„œ k κ°’κ³Ό x0 값을 찾아도 됨

def feature_remove_middle(ctx: FeatureContext) -> float:
area
return sigmoid(five_count, k = 0.5, x0 = 3.0)


#feature_remove seriesλ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ 보쑰 ν•¨μˆ˜
Expand All @@ -59,43 +56,43 @@ def _has_nine_one_pair(ctx : FeatureContext) -> bool:
for action in ctx.valid_actions:
r1, c1 = action.top_left
r2, c2 = action.bottom_right
region = ctx.area[r1:r2+1, c1:c2+1]
region = ctx.board[r1:r2+1, c1:c2+1]
if (region == 9).any():
return True
return False
def _has_eight_pair(ctx : FeatureContext) -> bool:

for action in ctx.valid_actions:
for action in ctx._valid_actions:
r1, c1 = action.top_left
r2, c2 = action.bottom_right
region = ctx.area[r1:r2+1, c1:c2+1]
region = ctx.board[r1:r2+1, c1:c2+1]
if (region == 8).any():
return True
return False
def _has_seven_pair(ctx : FeatureContext) -> bool:

for action in ctx.valid_actions:
for action in ctx._valid_actions:
r1, c1 = action.top_left
r2, c2 = action.bottom_right
region = ctx.area[r1:r2+1, c1:c2+1]
region = ctx.board[r1:r2+1, c1:c2+1]
if (region == 7).any():
return True
return False
def _has_six_pair(ctx : FeatureContext) -> bool:

for action in ctx.valid_actions:
for action in ctx._valid_actions:
r1, c1 = action.top_left
r2, c2 = action.bottom_right
region = ctx.area[r1:r2+1, c1:c2+1]
region = ctx.board[r1:r2+1, c1:c2+1]
if (region == 6).any():
return True
return False
def _has_five_pair(ctx : FeatureContext) -> bool:

for action in ctx.valid_actions:
for action in ctx._valid_actions:
r1, c1 = action.top_left
r2, c2 = action.bottom_right
region = ctx.area[r1:r2+1, c1:c2+1]
region = ctx.board[r1:r2+1, c1:c2+1]
if (region == 5).any():
return True
return False
Expand Down