ba_wang_mao 发表于 2010-10-7 17:16:19

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

点击此处下载 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;//定义了规则库,用于函数间调用
        float R;//定义了关系矩阵,用于函数间调用
        float H;   //定义了查询表矩阵,用于函数间的调用
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={
                {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;
                        p1->yyz=(int)f;
                        p1->ly=(int)f;
                        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={
                {-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=G;
                        cout<<setw(5)<<g;   //显示规则库
                        if(3==n) {cout<<endl;n=0;}
                }
}
void Fuzzy::Printfzb(struct Fzb *head1)
{
        struct Fzb *p;
        p=head1;
        int n,i,j;
        float a;
        while(NULL!=p)
        {
                a=p->lsd;
                p=p->next;
        }
        p=head1;
        while (NULL!=p)
        {
                a=p->ly;
                p=p->next;
        }
        p=head1;
        while (NULL!=p)
        {
      a=p->yyz;
                p=p->next;
        }
        a=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) {
                                        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;
                                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,b,c;
        float R1,R2;//前者用于存储转置后的一维向量,后者用于暂时存储每条规则生成的关系矩阵
        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)
                                a=p1->lsd;                                       
                                p1=p1->next;
                        }
                                       
                        while(NULL!=p2)
                        {
                                if(p2->yyz==g)
                                b=p2->lsd;
                                p2=p2->next;
                        }
                        while(NULL!=p3)
                        {
                                if(p3->yyz==g)
                                c=p3->lsd;
                                p3=p3->next;
                        }
                        for(j=0;j<13;j++)
                           for(l=0;l<13;l++)
                                {
                  if(a>b)
                                  R1=b;
                                  else
                                        R1=a;
                                }
                        for(j=0;j<169;j++)
                                for(l=0;l<13;l++)
                                {
                                  if(R1>c)
                                  R2=c;
                                  else
                                  R2=R1;
                                }
                        if(0==i)
                        for(j=0;j<169;j++)//以下于对所有规则对应的关系矩阵作加法
                          for(l=0;l<13;l++)
                                {
                              R=R2;
                          }
                   for(j=0;j<169;j++)
                               for(l=0;l<13;l++)
                               {
                                       if(R2>R)
                                     R=R2;
                           }
                                                       


        }
        i=0;
        for(j=0;j<169;j++)
                for(l=0;l<13;l++)
                {
                        i++;
                  cout<<setw(5)<<R;//输出总的关系矩
                        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,b;
        float gg;
        float max=0,min;
        float t;//用于存储每次生成的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=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=p2->lsd;
                                   p2=p2->next;
               }
                           /*
                           cout<<e<<""<<ec<<endl;
                                                      for(x=0;x<13;x++)
                                                      {
                                                              cout<<a<<"";
                                                      }
                                                      cout<<endl;
                                                      for(x=0;x<13;x++)
                                                      {
                                                              cout<<b<<"";
                                                      }
                          
                                                      cout<<endl;*/
                           n=0;
                           for(x=0;x<13;x++)
                for(l=0;l<13;l++)
                                {
                                        if(a<b) gg=a;
                                        else gg=b;
                                }
                                for(x=0;x<13;x++)   //进行推理合成规则计算
                                {
                                        max=0;
                                        for(l=0;l<169;l++)
                                        {
                     if(gg<R) min=gg;
                                           else min=R;
                                           if(max<min) max=min;
                                        }
                                        t=max;
                                }
                                p3=U;
               float sum=0;
                               float s=0;
                               float u=0;
                                for(x=0;x<13;x++)
                                {
                                        if(0!=t)
                                        {
                                                s=x-6;
                                          sum+=t*s;
                                                u+=t;
                                        }
                                }
                                        H=sum/u;
                }
                for(i=0;i<13;i++)
                {
                        for(j=0;j<13;j++)
                        {
                                if(H<0)
                                cout<<setw(4)<<(int)(H-0.5);
                                else
                                cout<<setw(4)<<(int)(H+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;
        }
}
}

tigerchen 发表于 2010-10-8 08:32:09

好东西啊,急需,多谢楼主了

XQGG 发表于 2010-10-8 08:35:59

标记

cdust 发表于 2010-10-8 11:40:07

标记

guozs1984 发表于 2010-10-8 12:17:26

留作以后用。谢谢

411412 发表于 2010-10-11 09:01:59

mark

zhanghzhan 发表于 2010-10-11 09:04:34

必须mark

avrwoo 发表于 2010-10-11 09:51:56

MARK

ggyyll8683 发表于 2010-10-11 09:54:52

好东西

hy317 发表于 2010-10-11 10:17:38

mark

yfguangking 发表于 2011-3-24 18:22:00

mark

gentlerain 发表于 2011-3-24 18:47:58

这个一定要收藏了!

jackielau 发表于 2011-3-24 20:23:56

mark

WOTASOM 发表于 2011-11-4 02:53:10

好东西要标记!

huangstone 发表于 2011-11-4 04:26:45

mark

kingboy100 发表于 2011-11-4 06:43:28

mark

wx2k 发表于 2011-11-4 07:36:44

记号

sufeila 发表于 2011-11-4 07:49:22

模糊控制

10000years 发表于 2011-11-4 08:20:11

mark

xingkongyao 发表于 2011-11-16 12:08:58

mark

bondxie3 发表于 2012-1-11 10:59:42

mark,模糊控制

tangxh 发表于 2012-1-11 11:45:40

模糊控制好深奥啊。。。

dingliming 发表于 2012-1-12 04:16:29

ahuang227 发表于 2012-1-12 09:01:03

看来要好好研究一下了。

pytyj 发表于 2012-1-12 10:17:06

mark 还没看懂

rockli 发表于 2012-1-12 10:29:45

模糊控制

baimawang188 发表于 2012-4-1 14:49:25

先保存了,以后慢慢研究

davidd 发表于 2012-4-1 15:32:49

不错的程序,看能否用上

qy815fj 发表于 2012-4-9 11:55:37

保存称慢慢研究

farfar 发表于 2012-4-9 12:34:30

感谢楼主共享

selina1983 发表于 2012-5-11 16:38:03

好东西啊   现在正准备用{:biggrin:}{:biggrin:}{:biggrin:}{:biggrin:}

zfzdhz_2012 发表于 2012-7-19 09:46:17

模糊控制

zhcj66 发表于 2012-9-11 17:02:33

正用上 谢谢喽

lcmdw 发表于 2012-9-11 23:16:44

mark{:smile:}

32MCU 发表于 2012-9-12 08:32:44

标记。有时间研究下。

wochai 发表于 2012-9-12 09:05:37

藏起来了

terencechang 发表于 2012-9-12 10:13:06

模糊控制标记

marshallemon 发表于 2012-9-12 10:19:51

这个隶属度表也是需要实践整定的吧?

roguebear2012 发表于 2012-9-12 10:33:07

好东西。mark。

jz701209李 发表于 2012-9-13 19:49:35

感谢分享。。。。。。。。。。。

xue_pic 发表于 2012-9-13 21:13:15

小白的问一下,这个东西有什么作用

wswh2o 发表于 2012-9-13 22:50:45

这是做什么用的,看不懂

ethan_free 发表于 2012-12-16 10:26:33

好东西,mark一下!

jz701209李 发表于 2012-12-16 20:20:08

学习学习.......

qd118118 发表于 2012-12-16 20:45:09

好东西,啊莫这里,遍地金子

airwolf09921 发表于 2012-12-21 11:30:13

好东西 下来学习

hclin 发表于 2012-12-21 12:44:18

very interesting !!!

ELYGM 发表于 2012-12-21 12:58:24

很留的说

llysc 发表于 2012-12-21 18:11:08

mark,很好~~~~~~~

fish198868 发表于 2013-6-4 13:08:47

这个看起来不错哦。。

marshallemon 发表于 2013-6-4 13:39:42

这玩意咋用?不同的负载是需要重新建立隶属度表的吧

linlonghuazbdx 发表于 2016-3-3 11:37:06

兄弟 有没时间应用过这个程序,效果如何

jorry 发表于 2017-3-31 00:06:10

谢谢!!!!!

jorry 发表于 2017-4-7 18:43:40

mark!!!!

adcr 发表于 2017-4-7 18:52:30

不错,值得保存

nn5499 发表于 2017-6-6 06:31:40

哇,好厉害的样子。。。

luoweips 发表于 2017-6-6 10:59:10

收藏一个,多谢

pcwinner 发表于 2017-6-6 11:17:22

关键是有人成功用过么??
页: [1]
查看完整版本: 网上找到了一篇如何生成 《模糊控制查询表》的C语言源程序,共享给大家。