Advertisement
haeki

Untitled

May 27th, 2018
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.82 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "utils.h"
  4. #include "graph.h"
  5.  
  6. int zufallSurfer(struct Graph *g,int steps, int p) {
  7.     //Falls Graph keien Knoten enthält kehre zurück
  8.     if (g->anzahlKnoten <= 0) {
  9.         return 0;
  10.     }
  11.     //Zufälliger Startknoten
  12.     struct Knoten* knoten = g->array[randu(g->anzahlKnoten)];
  13.     for(int step = 0; step < steps; step++) {
  14.         //Wenn Knoten keine Kanten hat wähle zufälligen Knoten aus dem Graph
  15.         if(knoten->kanten <= 0) {
  16.             knoten = g->array[randu(g->anzahlKnoten)];
  17.             knoten->visited += 1;
  18.         } else if(randu(100) >= (unsigned) p) {
  19.             knoten = knoten->ausgehend[randu(knoten->kanten)];
  20.             knoten->visited += 1;
  21.         } else {
  22.             knoten = g->array[randu(g->anzahlKnoten)];
  23.             knoten->visited += 1;
  24.         }
  25.     }
  26.    
  27.     //Gebe Ergebnisse aus
  28.     for(int i = 0; i < (g->anzahlKnoten); i++) {
  29.         printf("%s \t\t %.10lf\n", g->array[i]->bezeichner, (g->array[i]->visited/((double) steps)));
  30.     }
  31.     return 0;
  32. }
  33.  
  34. int markowKette(struct Graph *g,int steps, double p) {
  35.     //Falls Graph keien Knoten enthält kehre zurück
  36.     if (g->anzahlKnoten <= 0) {
  37.         return 0;
  38.     }
  39.    
  40.     double *vAlt = (double*) malloc(g->anzahlKnoten * sizeof(double));
  41.    
  42.     //erstelle Matrix
  43.     //double mMatrix[g->anzahlKnoten][g->anzahlKnoten];
  44.    
  45.     double *matrix = (double*) malloc((g->anzahlKnoten * g->anzahlKnoten) * sizeof(double));
  46.    
  47.     for(int i = 0; i < g->anzahlKnoten; i++) {
  48.         vAlt[i] = (double) (1 / (double) (g->anzahlKnoten));
  49.         double outI = (double) g->array[i]->kanten;
  50.         for(int j = 0; j < g->anzahlKnoten; j++) {
  51.             if(outI <= 0) {
  52.                 //mMatrix[i][j] = 1 / ((double) g->anzahlKnoten);
  53.                 matrix[(i*g->anzahlKnoten)+j] = 1 / ((double) g->anzahlKnoten);
  54.             } else {
  55.                 //mMatrix[i][j] = p / ((double) g->anzahlKnoten);
  56.                 //mMatrix[i][j] += (((1-p) * outTo(g->array[i], g->array[j])) / outI);
  57.                 matrix[(i*g->anzahlKnoten)+j] = p / ((double) g->anzahlKnoten);
  58.                 matrix[(i*g->anzahlKnoten)+j] += (((1-p) * outTo(g->array[i], g->array[j])) / outI);
  59.             }
  60.         }
  61.     }
  62.    
  63.     //erstelle Array für zwischen Ergebnisse
  64.     double *vNeu = (double*) malloc(g->anzahlKnoten * sizeof(double));
  65.    
  66.     for(int step = 0; step < steps; step++) {
  67.         for(int j = 0; j < g->anzahlKnoten; j++) {
  68.             for(int i = 0; i < g->anzahlKnoten; i++) {
  69.                 vNeu[j] += (vAlt[i] * matrix[(i*g->anzahlKnoten)+j]); //mMatrix[i][j]);
  70.                 printf("%f | ", vNeu[i]);
  71.             }
  72.         }
  73.         for(int i = 0; i < g->anzahlKnoten; i++) {
  74.             //Speicher Ergebniss im Knoten
  75.             vAlt[i] = vNeu[i];
  76.             //setze Zwischenergebnisse zurück auf 0
  77.             vNeu[i] = 0.0;
  78.         }
  79.     }
  80.     printf("\n");
  81.     //gebe Ergebniss aus
  82.     for(int i = 0; i < (g->anzahlKnoten); i++) {
  83.         printf("%s \t\t %.10lf\n", g->array[i]->bezeichner, vAlt[i]);
  84.     }
  85.     //Gebe Speicher des Zwischenergebniss Arrays frei
  86.     free(vNeu);
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement