搜索
bottom↓
回复: 57

网上找到了一篇如何生成 《模糊控制查询表》的C语言源程序,共享给大家。

  [复制链接]

出0入0汤圆

发表于 2010-10-7 17:16:19 | 显示全部楼层 |阅读模式
点击此处下载 ourdev_588089X4HA3T.TXT(文件大小:9K) (原文件名:fuzzyc.TXT)


#include<iostream.h>
#include<iomanip.h>
#include<fstream.h>
#include<stdlib.h>
struct Fzb
{
        int yyz; //语言之
        int ly; //论域
        float lsd; //隶属值
        struct Fzb *next;
};

class Fuzzy
{
private:
        int g[49][3];  //定义了规则库,用于函数间调用
        float R[169][13];  //定义了关系矩阵,用于函数间调用
        float H[13][13];   //定义了查询表矩阵,用于函数间的调用
public:
        struct Fzb * Creatfzb(); //建立赋值表函数
        void Printfzb(struct Fzb *head1); //输出赋值表
        void Inputgzk(); //导入规则库
        void jlgx(struct Fzb*E,struct Fzb*EC,struct Fzb*U);  //建立关系矩阵
        void jlcxb(struct Fzb*E,struct Fzb*EC,struct Fzb*U); //建立查询表
};
struct Fzb *Fuzzy::Creatfzb()
{
        float f[8][14]={
                {0,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6},
                {-3,1,0.5,0,0,0,0,0,0,0,0,0,0,0},       
                {-2,0,0.5,1,0.5,0,0,0,0,0,0,0,0,0},
                {-1,0,0,0,0.5,1,0.5,0,0,0,0,0,0,0},
                {0,0,0,0,0,0,0.5,1,0.5,0,0,0,0,0},
                {1,0,0,0,0,0,0,0,0.5,1,0.5,0,0,0},
                {2,0,0,0,0,0,0,0,0,0,0.5,1,0.5,0},
                {3,0,0,0,0,0,0,0,0,0,0,0,0.5,1}};  //默认输入赋值表
        int i,k,j;
        fstream in,out;
        struct Fzb *head,*p1,*p2;
        int n=0;
        head=NULL;
        p1=new(Fzb);
        for(k=1;k<8;k++)
                for(j=1;j<14;j++)
                {
                        n++;
                        p1->lsd=f[k][j];
                        p1->yyz=(int)f[k][0];
                        p1->ly=(int)f[0][j];
                        if(1==n) head=p1;
                        p2=p1;
                        p1=new(Fzb);
                        p2->next=p1;
                }
                p2->next=NULL;
        int        m=0;
                return (head);
}
void Fuzzy::Inputgzk()
{
        int G[49][3]={
                {-3,-3,-3},{-3,-2,-3},{-3,-1,-3},{-3,0,-3},
                {-3,1,-2},{-3,2,0},{-3,3,0},{-2,-3,-3},
                {-2,-2,-3},{-2,-1,-3},{-2,0,-3},{-2,1,-2},
                {-2,2,0},{-2,3,0},{-1,-3,-2},{-1,-2,-2},
                {-1,-1,-2},{-1,0,-2},{-1,1,0},{-1,2,1},
                {-1,3,1},{0,-3,-2},{0,-2,-2},{0,-1,-1},
                {0,0,0},{0,1,1},{0,2,2},{0,3,2},{1,-3,-1},
                {1,-2,-1},{1,-1,0},{1,0,2},{1,1,2},{1,2,2},
                {1,3,2},{2,-3,0},{2,-2,0},{2,-1,2},{2,0,3},
                {2,1,3},{2,2,3},{2,3,3},{3,-3,0},{3,-2,0},
                {3,-1,2},{3,0,3},{3,1,3},{3,2,3},{3,3,3}}; //默认输入规则库
        int i,j;
        int n=0;
        for(i=0;i<49;i++)
                for(j=0;j<3;j++)
                {
                        n++;
                        g[j]=G[j];
                        cout<<setw(5)<<g[j];   //显示规则库
                        if(3==n) {cout<<endl;n=0;}
                }
}
void Fuzzy::Printfzb(struct Fzb *head1)
{
        struct Fzb *p;
        p=head1;
        int n,i,j;
        float a[8][14];
        while(NULL!=p)
        {
                a[p->yyz+4][p->ly+7]=p->lsd;
                p=p->next;
        }
        p=head1;
        while (NULL!=p)
        {
                a[0][p->ly+7]=p->ly;
                p=p->next;
        }
        p=head1;
        while (NULL!=p)
        {
        a[p->yyz+4][0]=p->yyz;
                p=p->next;
        }
        a[0][0]=0;
        int k;
                for(i=0;i<8;i++)  //用于输出标准形式的赋值表
                {
                    n=0;
                        for(j=0;j<14;j++)
                        {
                                n++;
                                if(0==j&&0!=i)
                                {
                                        switch((int)a[j]) {
                                        case -3:
                                                cout<<setw(5)<<"NB";
                                                break;
                                        case -2:
                                                cout<<setw(5)<<"NM";
                                                break;
                                        case -1:
                                                cout<<setw(5)<<"NS";
                                                break;
                                        case 0:
                                                cout<<setw(5)<<"Z";
                                                break;
                                        case 1:
                                                cout<<setw(5)<<"PS";
                                                break;
                                        case 2:
                                                cout<<setw(5)<<"PM";
                                                break;
                                        case 3:
                                                cout<<setw(5)<<"PB";
                                        }
                                }
                                else
                                        cout<<setw(5)<<a[j];
                                if(14==n) cout<<endl;
                        }
                }
       
}
void Fuzzy::jlgx(struct Fzb*E,struct Fzb*EC,struct Fzb*U)
{
        int i,j,k,m,n,l,z;
        struct Fzb*p1,*p2,*p3;
    p1=E; p2=EC; p3=U;
        float a[13],b[13],c[13];
        float R1[169],R2[169][13];  //前者用于存储转置后的一维向量,后者用于暂时存储每条规则生成的关系矩阵
        for(i=0;i<49;i++)
                {
       
                        p1=E; p2=EC; p3=U;
                        k=0;m=0;n=0;z=0;
                        while(NULL!=p1)
                        {                               
                                if(p1->yyz==g[0])
                                a[k++]=p1->lsd;                                       
                                p1=p1->next;
                        }
                                       
                        while(NULL!=p2)
                        {
                                if(p2->yyz==g[1])
                                b[m++]=p2->lsd;
                                p2=p2->next;
                        }
                        while(NULL!=p3)
                        {
                                if(p3->yyz==g[2])
                                c[n++]=p3->lsd;
                                p3=p3->next;
                        }
                        for(j=0;j<13;j++)
                           for(l=0;l<13;l++)
                                {
                    if(a[j]>b[l])
                                    R1[z++]=b[l];
                                    else
                                        R1[z++]=a[j];
                                }
                        for(j=0;j<169;j++)
                                for(l=0;l<13;l++)
                                {
                                    if(R1[j]>c[l])
                                    R2[j][l]=c[l];
                                    else
                                    R2[j][l]=R1[j];
                                }
                        if(0==i)
                        for(j=0;j<169;j++)  //以下于对所有规则对应的关系矩阵作加法
                            for(l=0;l<13;l++)
                                {
                              R[j][l]=R2[j][l];
                          }
                   for(j=0;j<169;j++)
                                 for(l=0;l<13;l++)
                                 {
                                         if(R2[j][l]>R[j][l])
                                     R[j][l]=R2[j][l];
                           }
                                                       


        }
        i=0;
        for(j=0;j<169;j++)
                for(l=0;l<13;l++)
                {
                        i++;
                    cout<<setw(5)<<R[j][l];  //输出总的关系矩
                        if(13==i)
                        {cout<<endl;i=0;}               
                }
       
                return;
}
void Fuzzy::jlcxb(struct Fzb*E,struct Fzb*EC,struct Fzb*U)
{
        int e,ec,u;
        int i,j,k,n=0,l=0,x=0;
        float m=0;
        struct Fzb*p1,*p2,*p3;
    p1=E;p2=EC;p3=U;
        float a[13],b[13];
        float gg[169];
        float max=0,min;
        float t[13];  //用于存储每次生成的U的隶属函数,从而求得每组e,ec对应的u
        for(i=0;i<13;i++)       
                for(j=0;j<13;j++)
                {
                        m=0;
                        p1=E;p2=EC;p3=U;
                        l=0;
                        e=i-6;
                        ec=j-6;
                        while (NULL!=p1)
                        {
                                if(e<0)
                                {
                                  if(e==p1->ly&&m<p1->lsd)
                                  {
                                                 n=p1->yyz;
                                                 m=p1->lsd;
                                  }
                                }
                                else
                                {
                                        if(e==p1->ly&&m<=p1->lsd)
                                        {
                                                n=p1->yyz;
                                                m=p1->lsd;
                                        }
                                }

                                 p1=p1->next;
                        }
                        p1=E;
               while (NULL!=p1)
                           {
                                   if(n==p1->yyz) a[l++]=p1->lsd;
                                   p1=p1->next;
               }
                           m=0;
                           while (NULL!=p2)
                           {
                                   if(ec<0)
                                   {
                                           if(ec==p2->ly&&m<p2->lsd)
                                           {
                                                   n=p2->yyz;
                                                   m=p2->lsd;
                                           }
                                   }
                                   else
                                   {
                                           if(ec==p2->ly&&m<=p2->lsd)
                                           {
                                                   n=p2->yyz;
                                                   m=p2->lsd;
                                           }
                                   }
                                   p2=p2->next;
                           }
                           p2=EC;
                           l=0;
               while (NULL!=p2)
                           {
                                   if(n==p2->yyz) b[l++]=p2->lsd;
                                   p2=p2->next;
               }
                           /*
                           cout<<e<<"  "<<ec<<endl;
                                                      for(x=0;x<13;x++)
                                                      {
                                                              cout<<a[x]<<"  ";
                                                      }
                                                      cout<<endl;
                                                      for(x=0;x<13;x++)
                                                      {
                                                              cout<<b[x]<<"  ";
                                                      }
                          
                                                      cout<<endl;*/
                           n=0;
                           for(x=0;x<13;x++)
                for(l=0;l<13;l++)
                                {
                                        if(a[x]<b[l]) gg[n++]=a[x];
                                        else gg[n++]=b[l];
                                }
                                for(x=0;x<13;x++)   //进行推理合成规则计算
                                {
                                        max=0;
                                        for(l=0;l<169;l++)
                                        {
                       if(gg[l]<R[l][x]) min=gg[l];
                                           else min=R[l][x];
                                           if(max<min) max=min;
                                        }
                                        t[x]=max;
                                }
                                p3=U;
                 float sum=0;
                                 float s=0;
                                 float u=0;
                                for(x=0;x<13;x++)
                                {
                                        if(0!=t[x])
                                        {
                                                s=x-6;
                                            sum+=t[x]*s;
                                                u+=t[x];
                                        }
                                }
                                        H[j]=sum/u;
                }
                for(i=0;i<13;i++)
                {
                        for(j=0;j<13;j++)
                        {
                                if(H[j]<0)
                                cout<<setw(4)<<(int)(H[j]-0.5);
                                else
                                cout<<setw(4)<<(int)(H[j]+0.5);

                        }
                        cout<<endl;
                }
}

void main()
{
        struct Fzb *E,*EC,*U;
        E=EC=U=NULL;
        Fuzzy p;
        int jg;
        int n=1;
        E=p.Creatfzb();  //默认建立E的赋值表
        EC=p.Creatfzb(); //默认建立EC的赋值表
        U=p.Creatfzb();  //默认建立U的赋值表
        int t=1;
while (1==1) {

        cout<<endl<<"想做什么:"<<endl<<"1、输出E的赋值表"<<endl<<"2、输出EC的赋值表"<<endl<<"3、输出U的赋值表"<<endl<<"4、显示规则库"<<endl<<"5、求解关系函数"<<endl<<"6、输出查询表"<<endl<<"6、退出"<<endl;
        cout<<"---->  ";
        cin>>jg;
        switch(jg) {
        case 1:
        cout<<"*************************************************************"<<endl;
        cout<<"E的赋值表如下:"<<endl;
        p.Printfzb(E);
                break;
        case 2:
        cout<<"*************************************************************"<<endl;
        cout<<"EC的赋值表如下:"<<endl;
        p.Printfzb(EC);
                break;
        case 3:
        cout<<"*************************************************************"<<endl;
        cout<<"U的赋值表如下:"<<endl;
        p.Printfzb(U);
                break;
        case 4:
        p.Inputgzk();
                n=0;
                break;
        case 5:
                if(n)
                {
                        cout<<"*************************************************************"<<endl;
                        cout<<"             未调入规则库,请先运行步骤4"<<'\a'<<endl;
                        cout<<"*************************************************************"<<endl;
                }
                else
                {
                        p.jlgx(E,EC,U);
                        t=0;
                }
                break;
        case 6:
        if(t)
                {
                        cout<<"*************************************************************"<<endl;
                        cout<<"             未创建关系矩阵,请先运行步骤5"<<'\a'<<endl;
                        cout<<"*************************************************************"<<endl;
                }
                else
                {
                        cout<<"*************************************************************"<<endl;
                        cout<<"查询表如下:"<<endl;
                        p.jlcxb(E,EC,U);
                }
                break;
        default:
                return;
        }
}
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-10-8 08:32:09 | 显示全部楼层
好东西啊,急需,多谢楼主了

出0入0汤圆

发表于 2010-10-8 08:35:59 | 显示全部楼层
标记

出0入98汤圆

发表于 2010-10-8 11:40:07 | 显示全部楼层
标记

出0入0汤圆

发表于 2010-10-8 12:17:26 | 显示全部楼层
留作以后用。谢谢

出0入0汤圆

发表于 2010-10-11 09:01:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-11 09:04:34 | 显示全部楼层
必须mark

出0入0汤圆

发表于 2010-10-11 09:51:56 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-10-11 09:54:52 | 显示全部楼层
好东西

出0入0汤圆

发表于 2010-10-11 10:17:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-24 18:22:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-24 18:47:58 | 显示全部楼层
这个一定要收藏了!

出0入0汤圆

发表于 2011-3-24 20:23:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-4 02:53:10 | 显示全部楼层
好东西要标记!

出0入0汤圆

发表于 2011-11-4 04:26:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-4 06:43:28 | 显示全部楼层
mark

出0入4汤圆

发表于 2011-11-4 07:36:44 | 显示全部楼层
记号

出0入0汤圆

发表于 2011-11-4 07:49:22 | 显示全部楼层
模糊控制

出0入0汤圆

发表于 2011-11-4 08:20:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-16 12:08:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-11 10:59:42 | 显示全部楼层
mark,模糊控制

出0入0汤圆

发表于 2012-1-11 11:45:40 | 显示全部楼层
模糊控制  好深奥啊。。。

出0入0汤圆

发表于 2012-1-12 04:16:29 | 显示全部楼层

出0入0汤圆

发表于 2012-1-12 09:01:03 | 显示全部楼层
看来要好好研究一下了。

出0入0汤圆

发表于 2012-1-12 10:17:06 | 显示全部楼层
mark 还没看懂

出0入0汤圆

发表于 2012-1-12 10:29:45 | 显示全部楼层
模糊控制

出0入0汤圆

发表于 2012-4-1 14:49:25 | 显示全部楼层
先保存了,以后慢慢研究

出0入0汤圆

发表于 2012-4-1 15:32:49 | 显示全部楼层
不错的程序,看能否用上

出0入0汤圆

发表于 2012-4-9 11:55:37 | 显示全部楼层
保存称慢慢研究

出0入0汤圆

发表于 2012-4-9 12:34:30 | 显示全部楼层
感谢楼主共享

出0入0汤圆

发表于 2012-5-11 16:38:03 | 显示全部楼层
好东西啊   现在正准备用

出0入0汤圆

发表于 2012-7-19 09:46:17 | 显示全部楼层
模糊控制

出0入53汤圆

发表于 2012-9-11 17:02:33 | 显示全部楼层
正用上 谢谢喽

出0入0汤圆

发表于 2012-9-11 23:16:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-9-12 08:32:44 | 显示全部楼层
标记。有时间研究下。

出100入0汤圆

发表于 2012-9-12 09:05:37 | 显示全部楼层
藏起来了

出0入0汤圆

发表于 2012-9-12 10:13:06 | 显示全部楼层
模糊控制标记

出0入85汤圆

发表于 2012-9-12 10:19:51 | 显示全部楼层
这个隶属度表也是需要实践整定的吧?

出0入0汤圆

发表于 2012-9-12 10:33:07 | 显示全部楼层
好东西。mark。

出0入0汤圆

发表于 2012-9-13 19:49:35 来自手机 | 显示全部楼层
感谢分享。。。。。。。。。。。

出0入0汤圆

发表于 2012-9-13 21:13:15 | 显示全部楼层
小白的问一下,这个东西有什么作用

出0入0汤圆

发表于 2012-9-13 22:50:45 | 显示全部楼层
这是做什么用的,看不懂

出0入0汤圆

发表于 2012-12-16 10:26:33 | 显示全部楼层
好东西,mark一下!

出0入0汤圆

发表于 2012-12-16 20:20:08 来自手机 | 显示全部楼层
学习学习.......

出0入21汤圆

发表于 2012-12-16 20:45:09 | 显示全部楼层
好东西,啊莫这里,遍地金子

出0入0汤圆

发表于 2012-12-21 11:30:13 | 显示全部楼层
好东西 下来学习

出0入0汤圆

发表于 2012-12-21 12:44:18 | 显示全部楼层
very interesting !!!

出0入0汤圆

发表于 2012-12-21 12:58:24 来自手机 | 显示全部楼层
很留的说

出0入17汤圆

发表于 2012-12-21 18:11:08 | 显示全部楼层
mark,很好~~~~~~~

出0入0汤圆

发表于 2013-6-4 13:08:47 | 显示全部楼层
这个看起来不错哦。。

出0入85汤圆

发表于 2013-6-4 13:39:42 | 显示全部楼层
这玩意咋用?不同的负载是需要重新建立隶属度表的吧

出0入0汤圆

发表于 2016-3-3 11:37:06 | 显示全部楼层
兄弟 有没时间应用过这个程序,效果如何

出0入0汤圆

发表于 2017-3-31 00:06:10 | 显示全部楼层
谢谢!!!!!

出0入0汤圆

发表于 2017-4-7 18:43:40 | 显示全部楼层
mark!!!!

出0入0汤圆

发表于 2017-4-7 18:52:30 | 显示全部楼层
不错,值得保存

出0入0汤圆

发表于 2017-6-6 06:31:40 | 显示全部楼层
哇,好厉害的样子。。。

出0入0汤圆

发表于 2017-6-6 10:59:10 | 显示全部楼层
收藏一个,多谢

出0入0汤圆

发表于 2017-6-6 11:17:22 | 显示全部楼层
关键是有人成功用过么??
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 13:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表