Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Диссертация_2013_Даулбаева ММ.doc
Скачиваний:
67
Добавлен:
10.03.2016
Размер:
2.34 Mб
Скачать

Продолжение приложения а

  1. if((pu=(int*)calloc(m,sizeof(int)))==NULL) abort();

  2. if((pv=(int*)calloc(n,sizeof(int)))==NULL) abort();

  3. // ПРИСВОЕНИЕ ВСЕМ ПОТЕНЦИАЛАМ ЗНАЧЕНИЯ MIN

  4. for(i=0;i<m;i++)

  5. *(pu+i) = MIN;

  6. for(j=0;j<n;j++)

  7. *(pv+j) = MIN;

  8. // Выделение памяти под структуру и заполнение её значениями

  9. for(i=0;i<m;i++)

  10. {

  11. for(j=0;j<n;j++)

  12. {

  13. if((*(matr+i*n+j) > 0) || (*(matr+i*n+j)==-2))

  14. {

  15. if((top=(struct poten*)malloc(sizeof(struct poten)))==NULL)

  16. abort();

  17. fprintf(fil,"top = %d",top);

  18. if(!topnast){

  19. topnast = top;

  20. fprintf(fil,"topnast = top = %d",top);

  21. }

  22. else top1 -> next=top;

  23. top1=top;

  24. top -> next=NULL;

  25. top -> b = *(st+i*n+j); //Стоимости

  26. top -> v = j;

  27. top -> u = i;

  28. top -> zn = -1;

  29. }

  30. }

  31. }

  32. *pu = 0;

  33. i=0; j = -1;

  34. for(top = topnast;top!=NULL;top = top -> next)

  35. {

  36. if((top -> u) == i && (top -> v)!=j)

  37. {

  38. *(pv+(top -> v)) = (top -> b) - *(pu+i);

  39. j = (top->v);

  40. top -> zn = 0;

  41. }

  42. else{

  43. for(top1 = topnast;top1 != NULL;top1 = top1->next)

  44. {

  45. if((top1->v) == j && (top1->u)!=i)

  46. {

  47. *(pu+(top1->u))=(top1->b) - *(pv+j);

  48. i = (top1->u);

  49. top1 ->zn = 0;

  50. break;

Продолжение приложения а

  1. }}}}

  2. // ********** Продолжение функции подсчета потенциалов *****************

  3. for(;;){

  4. fl = 0;

  5. for(top = topnast;top!=NULL;top =top -> next)

  6. {

  7. if((top -> zn) == -1)

  8. {

  9. if(*(pu+(top ->u)) !=MIN)

  10. {

  11. *(pv+(top->v))=(top->b) - *(pu+(top ->u));

  12. fl = 1;

  13. top -> zn = 0;

  14. }

  15. if(*(pv+(top->v)) !=MIN)

  16. {

  17. *(pu+(top->u))=(top->b) - *(pv+(top->v));

  18. fl=1;

  19. top->zn = 0;

  20. }

  21. }

  22. }

  23. if(!fl) break;

  24. }

  25. printf("\n ПОТЕНЦИАЛЫ ПО v:");

  26. fprintf(fil,"\n **** ПОТЕНЦИАЛЫ ПО v:");

  27. for(i = 0;i<n;i++)

  28. {

  29. printf("%d",*(pv+i));

  30. fprintf(fil,"%5d",*(pv+i));

  31. }

  32. getch();

  33. printf("\n ПОТЕНЦИАЛЫ ПО u: ");

  34. fprintf(fil,"\n **** ПОТЕНЦИАЛЫ ПО u: ");

  35. for(i=0;i<m;i++)

  36. {

  37. printf("%d",*(pu+i));

  38. fprintf(fil,"%5d",*(pu+i));

  39. }

  40. fprintf(fil,"\n");

  41. for(top = topnast;top!=NULL;top = top->next)

  42. free(top);

  43. return;

  44. } // potenzial

  45. // ****** PROVERKA PLANA NA OPTIMALNOST' ************************

  46. void abcikl(int ik,int jk);

  47. int cikl(int ik,int jk);

  48. void pr(char pr[],void *st); // Предварительно

Продолжение приложения а

  1. int prpoisk(int i1,int j1); // Объявлены

  2. int levpoisk(int i1,int j1); //ЭТИ

  3. int verpoisk(int i1,int j1); //Функции

  4. int nizpoisk(int i1,int j1);

  5. int optim(void)

  6. {

  7. int i,j;

  8. for(i=0;i<m;i++)

  9. {

  10. for(j=0;j<n;j++)

  11. {

  12. // ИЩЕМ ОПТИМАЛЬНОЕ РЕШЕНИЕ В НАШЕЙ МАТРИЦЕ И ЕСЛИ ЕГО НЕ НАЙДЕМ

  13. // ТО ПО СЛЕДУЮЩЕМУ УСЛОВИЮ ПРИСВОИМ ГРАФОКЛЕТКЕ С КООРДИНАТАМИ

  14. // ik,jk ЗНАЧЕНИЕ -1

  15. if(( *(pu+i)+ *(pv+j))>(*(st+i*n+j))&&((*(matr+i*n+j)) == 0))

  16. {

  17. abcikl(i,j);

  18. fprintf(fil,"optim(): План не оптимален, функции main() возвращаем -1,\n а abcikl() параметры i,j ");

  19. return(-1);

  20. }

  21. }

  22. }

  23. fprintf(fil,"Plan optimalen");

  24. return(0);

  25. } // ******* optim() ***************

  26. // ************** UPGRADE PLAN **************************

  27. void abcikl(int ik,int jk)

  28. {

  29. int i,j;

  30. fprintf(fil,"Мы в abcikl()");

  31. if((matr2=(int*)calloc(n*m,sizeof(int))) == NULL) abort();

  32. for(i=0;i<m;i++)

  33. {

  34. for(j=0;j<n;j++)

  35. {

  36. *(matr2+i*n+j) = *(matr+i*n+j); // Создаем копию рабочей матрицы

  37. }

  38. }

  39. *(matr2+ik*n+jk) = -1;

  40. // значению матрицы с параметрами ik,jk присваеваем -1

  41. printf("\n");

  42. printf("Поиск Цепи: \n\n");

  43. fprintf(fil,"Поиск Цепи: \n\n");

  44. for(i=0;i<m;i++)

  45. {

  46. for(j=0;j<n;j++)

  47. {