Fuzzylogic

Started by
0 comments, last by Tevong 22 years, 6 months ago
Can someone give me a quick brief or source code in c++ of fuzzylogic? I know it involves taking 2 FLV and using a FAM to output a behavior but I''m not sure how it''s supposed to be written.
Signed: ___T____
Advertisement
These two file listings give you a fuzzifier. I got them out of a book on neural nets. I forget the book title, I remember it was something about C++ and neural nets. But this is fuzzy logic, don't worry.

BTW, this doesn't really sound like what you're asking for, it doesn't output a behavior or anything like that... :/

    // fuzzfier.h// program to fuzzify dataclass category{    private:        char name[30];        float lowval, highval, midval    public:        category(){};        void setname(char *);        char * getname();        void setval(float&, float&, float&);        float getlowval;        float getmidval();        float gethighval();        float getshare(const float&);        ~category(){};};int randnum(int);  


...

        // fuzzfier.cpp// program to fuzzify data#include <iostream.h>#include <stdlib.h>#include <time.h>#include <string.h>#include "fuzzfier.h"void category::setname(char *n){    strcpy(name,n);}char * category::getname(){    return name;}void category::setval(float &h, float &m; float &l){    highval = h;    midval = m;    lowval = l;}float category::getlowval(){    return lowval;}float category::getmidval(){    return midval;}float category::gethighval(){    return highval;}float category::getshare(conts float & input){    // this member function returns the relative membership    // of an input in a category, with a maximum of 1.0    float output;    float midlow, highmid;    midlow = midval-lowval;    highmid = highval - midval;    // if outside the range, then output = 0    if((input <= lowval) || (input >= highval))        output = 0;    else    {        if (input > midval)            output = (highval - input)/highmid;        else            if (input == midval)                output = 1.0;            else                output = (input - lowval)/midlow;    }    return output;}int randomnum(int maxval){    // random number generator    // will return an integer up to maxval    srand((unsigned)time(NULL));    return rand() % maxval;}void main(){    // a fuzzifier program that takes category information:    // lowval, midval and highval and category name    // and fuzzifies an input based on the total number of    // categories and the membership in each category    int i=0,j=0,numcat,randnum;    float l,m,h, inval=1.0;    char input[30]="                              ";    category * ptr[10];    float relprog[10];    float total=0,runtotal=0;    // input the category information; terminate with 'done'    while(1)    {        cout << "\nPlease type in a category name, e.g. Cool\n";        cout << "Enter one word without spaces\n";        cout << "When you are done, type 'done':\n\n";        ptr = <span class="cpp-keyword">new</span> category;<br>        cin &gt;&gt; input;<br><br>        <span class="cpp-keyword">if</span> ((input[<span class="cpp-number">0</span>]=='d' &amp;&amp; input[<span class="cpp-number">1</span>] == 'o' &amp;&amp; input[<span class="cpp-number">2</span>] == 'n' &amp;&amp; input[<span class="cpp-number">3</span>] == 'e')) <span class="cpp-keyword">break</span>;<br><br>        ptr-&gt;setname(input);<br><br>        cout &lt;&lt; <span class="cpp-literal">"\nType in the lowval, midval and highval\n"</span>;<br>        cout &lt;&lt; <span class="cpp-literal">"for each category, seperated by spaces\n"</span>;<br>        cout &lt;&lt; <span class="cpp-literal">" e.g. 1.0 3.0 5.0 :\n\n"</span>;<br><br>        cin &gt;&gt; l &gt;&gt; m &gt;&gt; h;<br>        ptr-&gt;setval(h,m,l);<br><br>        i++<br>    }<br><br>    numcat=i; <span class="cpp-comment">// number of categories</span><br><br>    <span class="cpp-comment">// Categories are now set up: Now input the data to fuzzify</span><br>    cout &lt;&lt; <span class="cpp-literal">"\n\n"</span>;<br>    cout &lt;&lt; <span class="cpp-literal">"===========================================\n"</span>;<br>    cout &lt;&lt; <span class="cpp-literal">"==      Fuzzifier is ready for data      ==\n"</span>;<br>    cout &lt;&lt; <span class="cpp-literal">"===========================================\n"</span>;<br><br>    <span class="cpp-keyword">while</span> (<span class="cpp-number">1</span>)<br>    {<br>        cout &lt;&lt; <span class="cpp-literal">"\ninput a data value, type 0 to terminate\n"</span>;<br><br>        cin &gt;&gt; inval;<br><br>        <span class="cpp-keyword">if</span> (inval ==<span class="cpp-number">0</span>) <span class="cpp-keyword">break</span>;<br><br>        <span class="cpp-comment">// calculate relative probabilities of input being in each category</span><br>        total = <span class="cpp-number">0</span>;<br><br>        <span class="cpp-keyword">for</span> (j=<span class="cpp-number">0</span>;j&lt;numcat;j++)<br>        {<br>            relprob[j]=<span class="cpp-number">100</span>*ptr[j]-&gt;getshare(inval);<br>            total+=relprob[j];<br>        }<br><br>        <span class="cpp-keyword">if</span> (total == <span class="cpp-number">0</span>)<br>        {<br>            cout &lt;&lt; <span class="cpp-literal">"data out of range\n"</span>;<br>            exit(<span class="cpp-number">1</span>);<br>        }<br><br>        randnumb=randomnum((<span class="cpp-keyword">int</span>)total);<br><br>        j=<span class="cpp-number">0</span>;<br>        runtotal=relprob[<span class="cpp-number">0</span>];<br><br>        <span class="cpp-keyword">while</span> ((runtotal&lt;randnum)&amp;&amp;(j&lt;numcat))<br>        {<br>            j++<br>            runtotal += relprob[j];<br>        }<br><br>        cout &lt;&lt; <span class="cpp-literal">"\nOutput fuzzy category is ==&gt; "</span> &lt;&lt; ptr[j]-&gt;getname()&lt;&lt;<span class="cpp-literal">"&lt;==\n"</span>;<br>        cout &lt;&lt; <span class="cpp-literal">"category\t"</span>&lt;&lt;<span class="cpp-literal">"membership\n"</span>;<br>        cout &lt;&lt; <span class="cpp-literal">"—————\n"</span>;<br><br>        <span class="cpp-keyword">for</span> (j=<span class="cpp-number">0</span>;j&lt;numcat;j++)<br>        {<br>            cout &lt;&lt; ptr[j]-&gt;getname() &lt;&lt; <span class="cpp-literal">"\t\t"</span> &lt;&lt; (relprob[j]/total) &lt;&lt; <span class="cpp-literal">"\n"</span>;<br>        }<br>    }<br>}<br>  <br></pre></div><!–ENDSCRIPT–><br><br>[EDIT: changed code tags to source tags… didn't like the italics.]<br>[EDIT: some things just didn't seem right… like a bunch of #includes &#111;ne next to another &#111;n the same line…]<br><br>[EDIT: nearly 4 years later (3 days short of it, in fact), noticed an error and fixed it.]<br><br>Edited by - coldacid &#111;n October 14, 2001 10:37:44 AM<br>Edited by - coldacid &#111;n October 14, 2001 10:43:09 AM<br><br><br><!–EDIT–><span class=editedby><!–/EDIT–>[Edited by - coldacid on October 11, 2005 3:28:23 PM]<!–EDIT–></span><!–/EDIT–>

Chris 'coldacid' Charabaruk – Programmer, game designer, writer | twitter

This topic is closed to new replies.

Advertisement