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

降低内存开销

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