Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
bacekk
2 / 2 / 0
Регистрация: 30.11.2010
Сообщений: 89
#1

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

18.12.2011, 18:08. Просмотров 1148. Ответов 5
Метки нет (Все метки)

Задание было: реализовать Марковский процесс на языке С.
Теория:
Имеется некоторая система, она может находиться в нескольких состояниях: 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 минут
помогите..)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2011, 18:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Марковский процесс (разобраться в коде) (C++):

как называеться процесс происходящий в этом коде? - C++
Доброго времени суток. Дан код. 1) почему в работу включаеться Copy C'tor класса A 2) как называется сам процесс?(Slicing?) но точно...

Разобраться в коде - C++
Алгоритм сортирует элементы матрицы согласно схеме (см. изображение), в порядке убывания и методом пузырька. Происходит движение: 1) вниз...

Помогите разобраться в коде - C++
Помогите мне разобраться в коде. Заранее спасибо. int seek_substring_KMP (char s, char p) { int i, j, N, M; N = strlen(s); M =...

нужно разобраться в коде - C++
Определить минимальный положительный элемент главной диагонали матрицы А(5,5) и заменить все элементы строки и столбца,в котором он...

пмг разобраться в коде - C++
#include &quot;stdio.h&quot; int main() { const int N=9; int mas={1,2,3,4,5,6,7,8,9}, l=0, r=N-1, i_temp, i, temp; ...

Разобраться с ошибками в коде - C++
подскажите, ошибки в коде есть подчеркиваются &quot;красным&quot; они, препод говорит, что это связано с неуниверсальностью кода код: #include...

5
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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;
}
Файловый вывод и свою функцию рандомизации -- добавить по вкусу.
1
bacekk
2 / 2 / 0
Регистрация: 30.11.2010
Сообщений: 89
19.12.2011, 02:42  [ТС] #3
lemegeton, вот как раз по поводу 'рандомизации по вкусу', я не могу получить более менее "рандомный" рандом)
Все очень предсказуемо происходит... А когда нужно рандомить 1 и 0 вообще не получается, вылетает все время 0. Как быть, не подскажите?
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
19.12.2011, 02:58 #4
Например, воспользоваться /dev/urandom или, под виндой, Wincrypt.h и CryptGenRandom.
Есть еще сторонние библиотеки.

Не вижу большого смысла в честности рандома, если это задача студенческая.
1
bacekk
2 / 2 / 0
Регистрация: 30.11.2010
Сообщений: 89
19.12.2011, 03:13  [ТС] #5
Я просто 'слегка' лошара в программировании, 1курс МАИ, учить программированию - не учат, а курсовая -мама не горюй, поэтому я не могу придумать как здесь организовать файловый ввод и вывод и random, знаю тока, что есть функция rand() в stdlib.h, а каким боком ее вставить в прогу вообще не понимаю.
0
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
19.12.2011, 19:54 #6
В моем коде она уже присутствует.
0
19.12.2011, 19:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2011, 19:54
Привет! Вот еще темы с ответами:

Нужно разобраться в коде - C++
Написать программу, которая в произвольном текстовом файле определяет количество предложений и слов, строчных и заглавных символов, знаков...

Не могу разобраться в коде - C++
Здравствуйте, нашел код на форуме, он выводит файл в hex виде #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;iomanip&gt; #include...

Разобраться в коде программы - C++
помогите пожалуйста разобраться на примере этого текста подробно gil bil pes #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include...

Разобраться с ошибками в коде - C++
что я делаю неправильно вот код программы #include &lt;iostream.h&gt; #include &lt;string.h&gt; #include &lt;conio.h&gt; int main () { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru