| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 316 人关注过本帖
标题:遗传算法求最优解的二叉树出现问题,出现堆栈溢出,求大神解释
只看楼主 加入收藏
纪老猴子zxy
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2014-12-28
结帖率:0
收藏
已结贴  问题点数:20 回复次数:2 
遗传算法求最优解的二叉树出现问题,出现堆栈溢出,求大神解释
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct BiTreeNode BiTreeNode ;
struct BiTreeNode
{
    char data;
    BiTreeNode *lchild;
    BiTreeNode *rchild;
};

void Intraverse (BiTreeNode *p_Root);
BiTreeNode* Create (BiTreeNode *p_Node,char *a);

int count = 0;

int main ()
{
    char a[17]={"+-*/^LSCEOTS1234"};
    BiTreeNode *p_Root[3] = {NULL};
    int i = 0;
    
    srand (time (NULL));

    for (i = 0;i<3;i++)
    {
        p_Root[i] = Create (p_Root[i],a);
    }
    
    for (i = 0;i<3;i++)
    {
        Intraverse (p_Root[i]);
        putchar (10);
        printf (",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,");
        putchar (10);
    }
    printf ("%d ",count);//count用来统计递归次数;

    system ("pause");
    return 0;
}

BiTreeNode* Create (BiTreeNode *p_Node,char *a)
{
    count++;
    printf ("count = %d\n",count);//输出当前递归次数;

    long r = 0;

 
    r = rand();
    r = r%16;
    
    printf ("%d\n",r);

    if (p_Node != NULL)
    {
        return p_Node;
    }
    else
    {
        p_Node = (BiTreeNode*) malloc (sizeof (BiTreeNode));
    
        if (p_Node == NULL)
        {
            printf ("内存分配错误");
            system ("pause");
            exit (1);
        }
        else
        {
            p_Node->lchild = p_Node->rchild = NULL;
            p_Node->data = a[r];
            
            //加减乘除需要运算左右子树;
            if (r<=4 && r>=0)
            {
                p_Node->lchild = Create (p_Node->lchild,a);
                p_Node->rchild = Create (p_Node->rchild,a);
            }
            else if (r>= 5 && r<= 11)
            {
                //log sin cos tan exp cot仅仅运算左子树;
                p_Node->lchild = Create (p_Node->lchild,a);
            }
            return p_Node;
        }
    }
}

void Intraverse (BiTreeNode *p_Root)
{
    if (p_Root)
    {
        Intraverse (p_Root->lchild);
        
        printf (" %c ",p_Root->data);
        
        Intraverse (p_Root->rchild);
    }
}
        

搜索更多相关主题的帖子: 二叉树 
2014-12-28 11:38
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
堆栈溢出,通常问题就是递归太深过度消耗资源。

授人以渔,不授人以鱼。
2014-12-28 12:24
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:10 
本来想看看你怎么构造你的遗传算法的,不过你的代码只建了一棵随机的运算树而已。还处于试验阶段吧?

说一下你的问题所在。树的创建过程中对节点的数量没有没有限制,更准确地说只有当创建的节点为数字(对应a数组中第13至16元素)时都会停止当前分支。

也就是说,每个节点创建后只有1/4的概率停止为该节点创建子节点,有5/16的概率会继续创建2个节点,7/16的概率继续创建1个节点。

粗略估计你只有大约20%的概率可以成功创建一棵树,大部分情况下会由于不断的创建新节点直至内存耗尽程序被迫退出。

具体解决方案可以限制节点的创建数量或树的深度。限制结点数量可以利用你的count变量,限制树深可以给create函数再增加一个代表深度的参数。

最后再提醒一点,你的代码没有释放动态申请的内存。

重剑无锋,大巧不工
2014-12-28 15:14
快速回复:遗传算法求最优解的二叉树出现问题,出现堆栈溢出,求大神解释
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.051439 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved