示例#1
0
void CAstar::Astar(CAstarNode*& result)
{
	CAstarNode s0(m_hgevStart,0,CalculateH(m_hgevStart),NULL);

	//open表中插入起点
	m_vOpenList.push_back(s0);

	make_heap(m_vOpenList.begin(),m_vOpenList.end());
//	CAstarNode* min;

	while(!m_vOpenList.empty())
	{
		//pop出堆顶节点
		pop_heap(m_vOpenList.begin(),m_vOpenList.end(),cmpAstarNode);
		result = new CAstarNode(m_vOpenList.back().m_hgevCoordinate,m_vOpenList.back().m_nG,
			m_vOpenList.back().m_nH, m_vOpenList.back().m_pParent);
		//若节点是目标节点,则返回
		if(result->m_hgevCoordinate == m_hgevGoal)
		{
		//	memcpy(result,&min,sizeof(CAstarNode));
			return ;
		}

		m_vOpenList.pop_back();	
	//	make_heap(m_vOpenList.begin(),m_vOpenList.end());
		//扩展该节点
		ExtendNode(result);
	//	make_heap(m_vOpenList.begin(),m_vOpenList.end());
		m_vClosedList.push_back(*result);
	}
	result = NULL;
}
示例#2
0
NODE *create_tree_sub (const char **tree_str, NODE * parent, TREE * tree)
{
  NODE *node,*node_new;
  char c;
  int bufflen;
  double l;
  char * name;

  node = CreateNode ();
  if (parent != NULL) {
    node->nbran++;
    node->branch[0] = parent;
  }
  else{
      (*tree_str)++;
  }

  while ( (c = GetTreeElt (tree_str)) != EOF) {
    if (c == '(') {
      node->branch[node->nbran]
	= create_tree_sub (tree_str, node, tree);
      (node->branch[node->nbran])->bnumber = tree->n_br;
      tree->branches[tree->n_br++] = node->branch[node->nbran++];
      if ( node->nbran >= node->maxbran - 1 ){ ExtendNode(node); }
    }
    else if (c == ')') {
      node->branch[node->nbran] = NULL;
      return node;
    }
    else if (c == ',') {
      node_new = CreateNode();
      node->branch[node->nbran] = node_new;
      node_new->bnumber = tree->n_br;
      tree->branches[tree->n_br++] = node->branch[node->nbran];
      CHILD (node, node->nbran)->branch[0] = node;
      CHILD (node, node->nbran)->branch[1] = NULL;
      CHILD (node, node->nbran)->nbran = 1;
      name = GetLeafName(tree_str);
      bufflen = 1+strlen(name);
      node_new->name = malloc (bufflen*sizeof(char));
      strncpy(node_new->name,name,bufflen);
      if ( insertelt_rbtree(tree->leaves,name,node_new) ){
         fprintf(stderr,"Species name %s already used in tree. Please make unique and rerun program.\n",name);
         exit(EXIT_FAILURE);
      }

      tree->n_sp++; node->nbran++;
      if ( node->nbran >= node->maxbran - 1){ ExtendNode(node); }
    }
    else if (c == ':') {
      l = GetLength (tree_str);
      node->blength[node->nbran - 1] = l;
      CHILD (node, node->nbran - 1)->blength[0] = l;
    }

  }

  fprintf (stderr,"Error creating tree.\n");
  fprintf (stderr,"Tree string is %s.\n",*tree_str);
  fprintf (stderr,"This is probably a bug. Please report to [email protected]\n");
  print_tree(stderr, parent,parent,tree);
  exit(EXIT_FAILURE);

  return node;
}