提交 7cfc60bc 编写于 作者: D dev@dev.com

降低内存开销

上级 d4863242
...@@ -23,7 +23,7 @@ struct chess_node{ ...@@ -23,7 +23,7 @@ struct chess_node{
//遍历 //遍历
float weight = 1; float weight = 1;
unsigned int parent = 0; unsigned int parent = 0;
unsigned int leaves = 0; //unsigned int leaves = 0;
float jump_cost[2]{0,0};//跳转损失 float jump_cost[2]{0,0};//跳转损失
char side = 0; char side = 0;
char depth = 0; char depth = 0;
...@@ -44,8 +44,8 @@ void print_node(const chess_node & node,const chess_node & old_node); ...@@ -44,8 +44,8 @@ void print_node(const chess_node & node,const chess_node & old_node);
//X镜像反转坐标 //X镜像反转坐标
void mirror_coordx(const unsigned char cod1[/*32*/],unsigned char cod2[/*32*/]); void mirror_coordx(const unsigned char cod1[/*32*/],unsigned char cod2[/*32*/]);
//计算棋盘哈希 //计算棋盘哈希
std::vector<std::string> node2hash(const std::vector<chess_node> & nodes); std::vector<size_t> node2hash(const std::vector<chess_node> & nodes);
std::string node2hash(const unsigned char cod[/*32*/], const unsigned int alive); size_t node2hash(const unsigned char cod[/*32*/], const unsigned int alive);
//AI //AI
//------------------------------------------- //-------------------------------------------
......
...@@ -93,7 +93,7 @@ float calc_cost(const int coordx[/*32*/], const int coordy[/*32*/],const int ali ...@@ -93,7 +93,7 @@ float calc_cost(const int coordx[/*32*/], const int coordy[/*32*/],const int ali
std::vector<chess_node> build_tree(const chess_node & root, const int side,const std::vector<chess_node> & history) std::vector<chess_node> build_tree(const chess_node & root, const int side,const std::vector<chess_node> & history)
{ {
std::vector<chess_node> tree; std::vector<chess_node> tree;
std::unordered_set <std::string> dict; std::unordered_set <size_t> dict;
for (const chess_node & n: history) for (const chess_node & n: history)
dict.insert(node2hash(n.coords,n.alive)); dict.insert(node2hash(n.coords,n.alive));
tree.push_back(root); tree.push_back(root);
...@@ -133,7 +133,7 @@ std::vector<chess_node> build_tree(const chess_node & root, const int side,const ...@@ -133,7 +133,7 @@ std::vector<chess_node> build_tree(const chess_node & root, const int side,const
const size_t sz = next_status.size(); const size_t sz = next_status.size();
for (size_t j=0;j<sz;++j) for (size_t j=0;j<sz;++j)
{ {
std::string ha = node2hash(next_status[j].coords,next_status[j].alive); size_t ha = node2hash(next_status[j].coords,next_status[j].alive);
bool needI = false; bool needI = false;
#pragma omp critical #pragma omp critical
{ {
...@@ -157,7 +157,7 @@ std::vector<chess_node> build_tree(const chess_node & root, const int side,const ...@@ -157,7 +157,7 @@ std::vector<chess_node> build_tree(const chess_node & root, const int side,const
next_status[j].side = curr_side; next_status[j].side = curr_side;
next_status[j].depth = clock+1; next_status[j].depth = clock+1;
vec_appends[tid].push_back(next_status[j]); vec_appends[tid].push_back(next_status[j]);
++tree[i].leaves; //++tree[i].leaves;
++new_appends; ++new_appends;
if (new_appends%1000==0) if (new_appends%1000==0)
{ {
......
...@@ -367,7 +367,8 @@ void print_node(const chess_node & node,const chess_node & old_node) ...@@ -367,7 +367,8 @@ void print_node(const chess_node & node,const chess_node & old_node)
int alive_o[32]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; int alive_o[32]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
std::string nhash = node2hash(node.coords,node.alive); size_t nhash = node2hash(node.coords,node.alive);
printf ("HASH=%X\n",nhash);
for (int i=0;i<32;++i) for (int i=0;i<32;++i)
{ {
coordx[i] = node.coords[i] >> 4; coordx[i] = node.coords[i] >> 4;
...@@ -376,8 +377,6 @@ void print_node(const chess_node & node,const chess_node & old_node) ...@@ -376,8 +377,6 @@ void print_node(const chess_node & node,const chess_node & old_node)
coord_oy[i] = old_node.coords[i] & 0x0f; coord_oy[i] = old_node.coords[i] & 0x0f;
alive[i] = (node.alive & (1<<i))?1:0; alive[i] = (node.alive & (1<<i))?1:0;
alive_o[i] = (old_node.alive & (1<<i))?1:0; alive_o[i] = (old_node.alive & (1<<i))?1:0;
//printf ("%X",((unsigned char)(nhash[i]))>>4);
//printf ("%X",((unsigned char)(nhash[i]))&0x0F);
} }
//printf ("\n"); //printf ("\n");
//制作坐标站位表 //制作坐标站位表
...@@ -446,16 +445,16 @@ void print_node(const chess_node & node,const chess_node & old_node) ...@@ -446,16 +445,16 @@ void print_node(const chess_node & node,const chess_node & old_node)
} }
std::vector<std::string> node2hash(const std::vector<chess_node> & nodes) std::vector<size_t> node2hash(const std::vector<chess_node> & nodes)
{ {
std::vector<std::string> v; std::vector<size_t> v;
const size_t sz = nodes.size(); const size_t sz = nodes.size();
for (size_t i=0;i<sz;++i) for (size_t i=0;i<sz;++i)
v.push_back(node2hash(nodes[i].coords,nodes[i].alive)); v.push_back(node2hash(nodes[i].coords,nodes[i].alive));
return v; return v;
} }
std::string node2hash(const unsigned char coords[/*32*/], const unsigned int alive) size_t node2hash(const unsigned char coords[/*32*/], const unsigned int alive)
{ {
std::string res; std::string res;
std::string str1; std::string str1;
...@@ -512,7 +511,9 @@ std::string node2hash(const unsigned char coords[/*32*/], const unsigned int ali ...@@ -512,7 +511,9 @@ std::string node2hash(const unsigned char coords[/*32*/], const unsigned int ali
else else
res = str1 + str2; res = str1 + str2;
return res; std::hash<std::string> ha;
size_t r = ha(res);
return r;
} }
void mirror_coordx(const unsigned char cod1[/*32*/],unsigned char cod2[/*32*/]) void mirror_coordx(const unsigned char cod1[/*32*/],unsigned char cod2[/*32*/])
......
...@@ -16,7 +16,7 @@ int main() ...@@ -16,7 +16,7 @@ int main()
int coordx[32]{5,4,6,3,7,2,8,1,9,2,8,1,3,5,7,9,5,4,6,3,7,2,8,1,9,2,8,1,3,5,7,9}; int coordx[32]{5,4,6,3,7,2,8,1,9,2,8,1,3,5,7,9,5,4,6,3,7,2,8,1,9,2,8,1,3,5,7,9};
int coordy[32]{1,1,1,1,1,1,1,1,1,3,3,4,4,4,4,4,10,10,10,10,10,10,10,10,10,8,8,7,7,7,7,7}; int coordy[32]{1,1,1,1,1,1,1,1,1,3,3,4,4,4,4,4,10,10,10,10,10,10,10,10,10,8,8,7,7,7,7,7};
int alive[32]{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; int alive[32]{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
printf ("Node Size=%lu Bytes\n",sizeof(chess_node));
srand(time(0)); srand(time(0));
chess_node root; chess_node root;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册