-
Notifications
You must be signed in to change notification settings - Fork 0
/
MergeFeature.cpp
84 lines (71 loc) · 1.99 KB
/
MergeFeature.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "MergeFeature.h"
// 0000 + 00000 + 00000 , totally 14 bits
// blankCount mergeCount layerCount
//
MergeFeature::MergeFeature(float weight):
TileTuple(weight)
{
score_table_ = new float[16384];
memset(score_table_, 0, sizeof(float) * 16384);
}
MergeFeature::~MergeFeature()
{
delete[] score_table_;
}
unsigned long long MergeFeature::get_index(const BitBoard& game_board) const
{
int tileArray[16];
int shiftNum;
unsigned long long mask = 0xf000000000000000;
int count = 0;
for(shiftNum = 60 ;shiftNum >= 0;shiftNum-=4,mask=mask>>4)
tileArray[count++] = (game_board.getBoard()&mask)>>shiftNum;
int featureIndex;
int layerDifferent;
int blankTileCount = 0;
int mergeCount = 0;
int layerMergeCount = 0;
for(int i=0;i<16;i++)
{
if(tileArray[i]==0)
{
blankTileCount++;
continue;
}
switch(tileArray[i])
{
case 1:case 2:
if(tileArray[i]+tileArray[i+1]==3 && i%4!=3)
mergeCount++;
if(tileArray[i]+tileArray[i+4]==3 && i<12)
mergeCount++;
break;
default:
if((tileArray[i] == tileArray[i+1]) && (i%4!=3))
mergeCount++;
if((tileArray[i] == tileArray[i+4]) && (i<12))
mergeCount++;
layerDifferent = abs(tileArray[i]-tileArray[i+1]);
if((layerDifferent==1)&& (i%4!=3) && (tileArray[i+1]!=2))
layerMergeCount++;
layerDifferent = abs(tileArray[i]-tileArray[i+4]);
if((layerDifferent==1)&& (i<12) && tileArray[i+4]!=2 )
layerMergeCount++;
}
}
featureIndex = (blankTileCount<<10)| (mergeCount<<5)|layerMergeCount;
return featureIndex;
}
/*int LargeTileFeature::get_isomorphic_indexes(const board_t& original_index, board_t* isomorphic_indexes) const
{
isomorphic_indexes[0] = original_index;
return 1;
}*/
void MergeFeature::save_tuple(ofstream& fout) const
{
fout.write((char*)score_table_, sizeof(float) * 16384);
}
void MergeFeature::load_tuple(ifstream& fin)
{
fin.read((char*)score_table_, sizeof(float) * 16384);
}