Kombinationen im Array nach der Dempster-Shafer-Theorie



  • Guten abend zusammen. Meine Frage könnte einigen von euch ein lächeln abringen, da ich mir selber das Thema nicht allzu schwer vorstelle, dennoch aber (da Anfänger) keine Lösung finde.
    Es geht um ein Programm welches mir Wahrscheinlichkeiten ausgibt. Besser gesagt nach der Dempster-Shafer-Theorie (DST).
    Hatte hierzu auch einen Code gefunden doch ich benutze einen speziellen Fall.

    Worum geht es:

    Ich habe unterschiedlich viele Blöcke die so aufgebaut sind.
    m1=[0,75],[0],[0,25]
    m2=[0,6],[0],[0,4]
    m3=[0,8],[0],[0,2]
    .
    .
    .
    Dadurch ergeben sich Möglichkeiten der Kombination im Schema von
    m1 m2 m3
    0 0 0
    0 0 1
    0 1 0
    . . .
    . . .
    . . .
    1 1 1

    Also nach dem Schema der Potenz 2^3=8 möglich Kombinationen. Da ich 11 Werte eingebe, hätte ich also 2^11 (2048) möglich Kombinationen.

    Für die Kombination einzelner Elemente gilt diese Regel
    Bsp.:
    m1m2Θ=(m1[0,75]*m2[0,6])+(m1[0,75]*m2[0,4])+m1[0,25]*m2[0,6]) =0,9
    mlm2Ω= m1[0,25]*m2[0,4]= 0,1

    "Stimmt die Bedingung? Ja-> 0,9+0,1=1" // Nur zur Veranschaulichung

    m1m2m3Θ=(m1m2[0,9]*m3[0,8])+(m1m2[0,9]*m3[0,2])+m1m2Ω[0,1]*m3[0,8]=0,98

    m1m2m3Ω=m1m2Ω[0,1]*m3Ω[0,2]=0,02
    Stimmt die Bedingung? Ja-> 0,98+0,02=1

    Was habe ich bis jetzt:

    #include <iostream>
    #include <math.h>
    
    using namespace std;
    
    int main() 
    {
       int omega;
       int afkt;
    
       cout << "Bitte geben Sie die groesse des Wahrnehmungsrahmen (Omega) an: "<< endl;
       cin >>  omega;
    
       cout << "Geben Sie die Anzahl der Gewichtsfunktionen ein: " << endl;
       cin >> afkt;
    
       double val1 = pow(2,afkt);                                                     // 2^omega
       cout << "Insgesamt werden: "<< val1 << " Kombinationen berechnet!" <<endl;       // Anzahl der Möglichen Kombinationen unter DST
    
       float feld1[afkt][3];                                                       // Feld in der Größe von afkt mit jeweils drei Teilen
    
       for (int i=0; i < afkt; i++)                                                    // Feld Füllen
       {
          for (int j=0; j < 3; j++) 
          {
             cout << "Eingabe: ";
             cin >> feld1[i][j];
          }
       }  
    cout << "Folgende Werte wurden Eingegeben :\n";          
                                                             //   x1,y1,omega1; m1  
       for (int l=0; l < afkt; l++)                          //   x2,y2,omega2, m2
       {
          for (int k=0; k < 3; k++) 
          {
             cout <<"[" <<feld1[l][k]<<"]" << ";";
          }
          cout << "m"<<l+1 <<"\n";
       } 
       //Berechnung
    
       system("PAUSE");
       return 0;
    }
    

    Soweit habe ich es mir bis jetzt aufgebaut. Das Problem jetzt. Wie bekomme ich die Berechnung von oben hin? Von der Logik würde ich wieder auf Schleifen setzten, komm aber nicht mal zum Ansatz.
    Das Ergebnis der Rechnungen würde wieder gleich Ausgegeben werden:
    -----
    m1=[0,75][0][0,25]
    m2=[][][]
    m3=[][][]
    .
    .
    .
    m1m2m3...mx=[][][]

    Also insgesamt 2048 "mögliche" Ausgaben.
    Stehe hier bissl an der Wand mit C++. 😕
    Falls ich vielleicht etwas zu oberflächlich sein sollte, entschuldige ich mich. Gerne gebe ich weitere Auskünfte. 🙂

    Flo


Log in to reply