Форум программистов, компьютерный форум CyberForum.ru

Марковский процесс (разобраться в коде) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
bacekk
2 / 2 / 0
Регистрация: 30.11.2010
Сообщений: 89
18.12.2011, 18:08     Марковский процесс (разобраться в коде) #1
Задание было: реализовать Марковский процесс на языке С.
Теория:
Имеется некоторая система, она может находиться в нескольких состояниях: Si, i = 1,…,N (N – число таких состояний).
Для каждой пары состояний (Si,Sj) задается вероятность перехода из Si в Sj: Pij. В случае Марковского Процесса Pij не зависит от предыдущих состояний системы (предыстории). Pii – вероятность остаться в том же состоянии

Код
  # include <stdio.h>
  # include <math.h>
  # include <conio.h>
  # include <stdlib.h>

  # define N 10     // kol-vo sostoyanij sistemi
  # define M 100    // kol-vo shagov po vremeni

    float rnd();

  main()            
   {  FILE *fopen(),*f,*g;
      int i, j, t;
      float z, p[N][N], s[N], pp, sp, x, y;

     f=fopen("C:\\TC\\MP\\ver.dat","r");
     g=fopen("C:\\TC\\MP\\rez.dat","w"); 

//     f=fopen("ver.dat","r"); 
//     g=fopen("rez.dat","w"); 		 

    for (i=0; i<N; i++)     // read array "p" from file "f"
	{
     for (j=0; j<N-1; j++)
	{
	  fscanf(f," %f ",&pp);
	  /* printf("%f",pp); //sleep(2);*/
	  p[i][j]=pp;
	}
	  fscanf(f," %f \n",&pp);
	  p[i][N-1]=pp;
	}

/*     for (i=0; i<N; i++)     // pechat' p[i][j] dlya proverki
	{
     for (j=0; j<N; j++)
	{
	  printf(" %.2e",p[i][j]);
	}
	  printf("\n");
	}
      //sleep(2);
 */

	  // esli ne rabotaet chtenie iz faila

   /*  for (i=0; i<N; i++)     
     for (j=0; j<N-1; j++)
	{
	  p[i][j]=0.1;     // vvodim vse ravnie ver-ti
			   // mozhno vvesti neravnie
	}  */

  // proverka pravilnosti zadania "p[i][j]"

/*     for (i=0; i<N; i++)     
      {
       sp=0;
       for (j=0; j<N; j++)
	{
	 sp=sp+p[i][j];
	}
       if (sp != 1.)
	 printf("Nepravilno zadan massiv p[i][j], stroka %d \n",i);
	}  */

  for (i=0; i<N; i++)
       s[i]=i;            // nabor sostoyaniy sistemi

  i=0;  //  nachalnoe sost. sist.

  x=10;
  y=20;

  for (t=0; t<M; t++)  
    {
      z=rnd(x,y);
      sp=0;

      for (j=0; j<M; j++) 
	 {
	   sp=sp+p[i][j];

	   if (z<sp)
	     {
	       i=s[j];
	    //   printf(" t=%d i=%d j=%d  z=%.2e  z1=%.2e p=%.2e \n",t,i,j,z,z1,p); 
	    //   sleep(2);
	       break;
	     }
	 }

      fprintf(g," t=%d   i=%d \n",t,i);
      
    }
  }   // end of main


    float rnd(x,y)
    float x,y;
      {
	 float z1;

	 y=25175*x+13847;
	 y=fmod(y,65539);           
	 z1=y*1.5255773063e-5;
	 printf(" z1=%.2e \n",z1); 
	 x=y;
	 return(z1);
       }
файл ver.dat
Код
   0.5   0.0   0.1   0.1   0.1   0.05  0.05   0.0   0.01  0.09
   0.4   0.02  0.02  0.02  0.02  0.02  0.1    0.1   0.1   0.2
   0.1   0.1   0.1   0.1   0.1   0.1   0.1    0.1   0.1   0.1
   0.1   0.1   0.0   0.0   0.1   0.3   0.3    0.0   0.0   0.1
   0.1   0.1   0.0   0.0   0.1   0.3   0.3    0.0   0.0   0.1
   0.1   0.1   0.0   0.0   0.1   0.3   0.3    0.0   0.0   0.1
   0.1   0.1   0.0   0.0   0.1   0.3   0.3    0.0   0.0   0.1
   0.1   0.1   0.0   0.0   0.1   0.3   0.3    0.0   0.0   0.1
   0.1   0.1   0.0   0.0   0.1   0.3   0.3    0.0   0.0   0.1
   0.1   0.1   0.0   0.0   0.1   0.3   0.3    0.0   0.0   0.1
файл rez.dat
Код
t=0   i=0 
 t=1   i=0 
 t=2   i=0 
 t=3   i=0 
 t=4   i=0 
 t=5   i=0 
 t=6   i=0 
 t=7   i=0 
 t=8   i=0 
 t=9   i=0 
 t=10   i=0 
 t=11   i=0 
 t=12   i=0 
 t=13   i=0 
 t=14   i=0 
 t=15   i=0 
 t=16   i=0 
 t=17   i=0 
 t=18   i=0 
 t=19   i=0 
 t=20   i=0 
 t=21   i=0 
 t=22   i=0 
 t=23   i=0 
 t=24   i=0 
 t=25   i=0 
 t=26   i=0 
 t=27   i=0 
 t=28   i=0 
 t=29   i=0 
 t=30   i=0 
 t=31   i=0 
 t=32   i=0 
 t=33   i=0 
 t=34   i=0 
 t=35   i=0 
 t=36   i=0 
 t=37   i=0 
 t=38   i=0 
 t=39   i=0 
 t=40   i=0 
 t=41   i=0 
 t=42   i=0 
 t=43   i=0 
 t=44   i=0 
 t=45   i=0 
 t=46   i=0 
 t=47   i=0 
 t=48   i=0 
 t=49   i=0 
 t=50   i=0 
 t=51   i=0 
 t=52   i=0 
 t=53   i=0 
 t=54   i=0 
 t=55   i=0 
 t=56   i=0 
 t=57   i=0 
 t=58   i=0 
 t=59   i=0 
 t=60   i=0 
 t=61   i=0 
 t=62   i=0 
 t=63   i=0 
 t=64   i=0 
 t=65   i=0 
 t=66   i=0 
 t=67   i=0 
 t=68   i=0 
 t=69   i=0 
 t=70   i=0 
 t=71   i=0 
 t=72   i=0 
 t=73   i=0 
 t=74   i=0 
 t=75   i=0 
 t=76   i=0 
 t=77   i=0 
 t=78   i=0 
 t=79   i=0 
 t=80   i=0 
 t=81   i=0 
 t=82   i=0 
 t=83   i=0 
 t=84   i=0 
 t=85   i=0 
 t=86   i=0 
 t=87   i=0 
 t=88   i=0 
 t=89   i=0 
 t=90   i=0 
 t=91   i=0 
 t=92   i=0 
 t=93   i=0 
 t=94   i=0 
 t=95   i=0 
 t=96   i=0 
 t=97   i=0 
 t=98   i=0 
 t=99   i=0
Что нужно исправить, чтобы программа полноценно работала? Помогите разобраться, что не так...

Добавлено через 13 часов 58 минут
помогите..)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2011, 18:08     Марковский процесс (разобраться в коде)
Посмотрите здесь:

пмг разобраться в коде C++
C++ нужно разобраться в коде
ПОМОГИТЕ РАЗОБРАТЬСЯ В КОДЕ C++
C++ Нужно разобраться в коде
Нужно разобраться в коде C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
19.12.2011, 02:28     Марковский процесс (разобраться в коде) #2
Цитата Сообщение от bacekk Посмотреть сообщение
FILE *fopen(),*f,*g;
* * * int i, j, t;
* * * float z, p[N][N], s[N], pp, sp, x, y;
Я погряз в этих бессмысленных и беспощадных буквах. Проще с нуля написать.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
 
#define EPSILON 0.000001
 
void readMatrix(const char *filename, float **matrix, size_t size) {
  FILE *in = fopen("tutor0043.in.txt", "r");
  float aValue = 0.f;
  size_t counter = 0;
  for(; counter / size < size && fscanf(in, "%f", &aValue) != EOF; ++counter)
    matrix[counter / size][counter % size] = aValue;
  fclose(in);
}
 
void printMatrix(float **matrix, size_t size) {
  int i, j;
  for (i = 0; i < size; ++i) {
    for (j = 0; j < size; ++j)
      printf("%.3f ", matrix[i][j]);
    printf("\n");
  }
}
 
int checkMatrixRow(float *row, size_t size) {
  int i;
  float sum = 0.f;
  for (i = 0; i < size; ++i)
    sum += row[i];
  return fabs(sum - 1) < EPSILON;
}
 
int checkMatrix(float **matrix, size_t size) {
  int i;
  for (i = 0; i < size; ++i)
    if (!checkMatrixRow(matrix[i], size))
      return 0;
  return 1;
}
 
// this generator is bad and will give not-so-smooth results
float random() {
  return (float)rand() / RAND_MAX;
}
 
int getNextState(float **matrix, size_t size, int currentState) {
  int result = 0;
  float range = random();
  while (range - matrix[currentState][result] > 0 && result < size - 1)
    range -= matrix[currentState][result++];
  return result;
}
 
int main(int argc, char *argv[]) {
  srand(time(0));
  size_t size = 10;
  size_t i;
 
  float **matrix = (float**)malloc(sizeof(float*) * size);
  for (i = 0; i < size; ++i)
    matrix[i] = (float*)malloc(sizeof(float) * size);
  
  readMatrix("tutor0043.in.txt", matrix, size);  
 
  int isMatrixOk = checkMatrix(matrix, size);
  printf("Matrix is %s.\n", (isMatrixOk ? "ok" : "not ok"));
  if (!isMatrixOk) return 1;
  
  printMatrix(matrix, size);
 
  int currentState = 0;
  for (i = 0; i < 100; ++i) {
    int nextState = getNextState(matrix, size, currentState);
    printf("Current state: %2d, next state: %2d.\n", currentState, nextState);
    currentState = nextState;
  }
 
  free(matrix);
  return 0;
}
Файловый вывод и свою функцию рандомизации -- добавить по вкусу.
bacekk
2 / 2 / 0
Регистрация: 30.11.2010
Сообщений: 89
19.12.2011, 02:42  [ТС]     Марковский процесс (разобраться в коде) #3
lemegeton, вот как раз по поводу 'рандомизации по вкусу', я не могу получить более менее "рандомный" рандом)
Все очень предсказуемо происходит... А когда нужно рандомить 1 и 0 вообще не получается, вылетает все время 0. Как быть, не подскажите?
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
19.12.2011, 02:58     Марковский процесс (разобраться в коде) #4
Например, воспользоваться /dev/urandom или, под виндой, Wincrypt.h и CryptGenRandom.
Есть еще сторонние библиотеки.

Не вижу большого смысла в честности рандома, если это задача студенческая.
bacekk
2 / 2 / 0
Регистрация: 30.11.2010
Сообщений: 89
19.12.2011, 03:13  [ТС]     Марковский процесс (разобраться в коде) #5
Я просто 'слегка' лошара в программировании, 1курс МАИ, учить программированию - не учат, а курсовая -мама не горюй, поэтому я не могу придумать как здесь организовать файловый ввод и вывод и random, знаю тока, что есть функция rand() в stdlib.h, а каким боком ее вставить в прогу вообще не понимаю.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
19.12.2011, 19:54     Марковский процесс (разобраться в коде) #6
В моем коде она уже присутствует.
Yandex
Объявления
19.12.2011, 19:54     Марковский процесс (разобраться в коде)
Ответ Создать тему
Опции темы

Текущее время: 04:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru