Последовательный алгоритм компоновки с равными числу вершин в каждом куске

Автор: Пользователь скрыл имя, 03 Марта 2013 в 03:36, курсовая работа

Описание работы

При конструкторском проектировании ЭВС решаются задачи, связанные с поиском наилучшего варианта конструкции, удовлетворяющего требованиям технического задания и максимально учитывающего возможности технологической базы производства. Тесная взаимосвязанность задач и большая размерность каждой из них обычно не позволяет предложить метод поиска конструктивного оптимального решения в едином цикле в связи с трудностями создания общей математической модели, комплексно учитывающей особенности конструкторско-технологической базы производства. Поэтому разработка и реализация алгоритмов и методов решения отдельных задач этапа конструкторского проектирования: компоновки, размещения и трассировки,- до сих пор остаются актуальными проблемами, решение которых неотъемлемо связано с развитием систем автоматизации проектирования.

Содержание

Введение…………………………………………………………… 3
1. Теоретическая часть
1.1 Алгоритмы компоновки……….…………………………..….. 4
1.2 Последовательный алгоритм компоновки ………………….. 5
1.3 Алгоритм компоновки……………………..………………….. 6
2. Практическая часть
2.1 Анализ задания………………………………………………… 8
2.2 Инструкция пользователя…..…….………………………….. 10
3. Заключение…………………………………………….….……… 14
4. Список используемой литературы……………………….….… 15
5. Приложение
5.1 Листинг программы………………………………………….... 16
5.2 Ручной счет…………………………………………………….. 31

Работа содержит 1 файл

1.docx

— 390.91 Кб (Скачать)

    getch(); return 1; }

  /*---------------------------*/

  tp.c=0;

  tp.m=(int*)calloc(mr.c, sizeof(int));

  if(tp.m == NULL)

  { printf("\nError: tp.m == NULL !");

    getch(); return 1; }

  /*---------------------------*/

  for(i=0; i < g.c; i++)

  {

    for(j=0; j < mr.c; j++)

    {

      if(mr.m[j][(g.m[i]-1)] > 0)

      {

pr=0;

for(k=0; k < g.c; k++)

{

  if((j+1) == g.m[k])

  {

    pr=1;

    break;

  }

}

 

if(pr == 0)

{

  for(k=0; k < tp.c; k++)

  {

    if(tp.m[k] == (j+1))

    {

      pr=1;

      break;

    }

  }

 

  if(pr == 0)

  {

    for(r=0; r < q.c; r++)

    {

      if(q.m[r] == (j+1))

      {

pr=1;

break;

      }

    }

    if(pr == 0)

    {

      tp.m[tp.c]=(j+1);

      tp.c++;

    }

  }

}

      }

    }

  }

  /*---------------------------*/

  if(tp.c == 0)

  {

    (*sm).m=NULL;

    (*sm).c=0;

    if(tp.m == NULL)

    { printf("\nError: tp.m == NULL !");

      getch(); return 1; }

    free(tp.m);

    return 0;

  }

  else

  {

    (*sm).c=tp.c;

    (*sm).m=(int*)calloc((*sm).c, sizeof(int));

    if((*sm).m == NULL)

    { printf("\nError: (*sm).m == NULL !");

      getch(); return 1; }

  }

  for(i=0; i < (*sm).c; i++)

  {

    (*sm).m[i]=tp.m[i];

  }

  /*---------------------------*/

  free(tp.m);

  /*---------------------------*/

  return 0;

}

 

/*********************************/

/* Функция добавления элемента  в */

/*         конец массива         */

/*********************************/

int add_ver(ms *g, int xi)

{

  int *oldm;

  int i,k;

  /*----------------------------*/

  /*printf("\nadd_ver!");*/

  /*----------------------------*/

  if((*g).m != NULL)

  {

    oldm=(int*)calloc((*g).c, sizeof(int));

    if(oldm == NULL)

    { printf("Error: oldm == NULL !");

      getch(); return 1; }

    for(i=0; i < (*g).c; i++)

    {

      oldm[i] = (*g).m[i];

    }

    /*-------------------------*/

    if((*g).m == NULL)

    { printf("\nError: (*g).m == NULL !");

      getch(); return 1; }

    free((*g).m);

    k=(*g).c+1;

  }

 

  else

  {

    k=1;

  }

 

  (*g).m=(int*)calloc(k, sizeof(int));

 

  if(k > 1)

  {

    for(i=0; i < (k-1); i++)

    {

      (*g).m[i]=oldm[i];

    }

  }

 

  (*g).m[k-1]=xi;

  (*g).c=k;

  /*----------------------------*/

  return 0;

}

 

/********************************/

/*    Функция вывода массива    */

/********************************/

int ms_pr(ms mass)

{

  int i;

  /*----------------------------*/

  if(mass.m == NULL)

  {

    printf("\nError: mass.m == NULL !");

    getch();

    return 1;

  }

  /*----------------------------*/

  if(mass.c == 0)

  {

    printf("\nError: mass.c == 0 !");

    getch();

    return 1;

  }

  /*----------------------------*/

  for(i=0; i < mass.c; i++)

  {

    printf("%d ", mass.m[i]);

  }

  /*----------------------------*/

  return 0;

}

 

 

 

 

 

 

 

 

 

 

 

    1. Ручной счет

1) Вычисляем матрицу смежности  A=||aij||nxn.


 

x1

x2

x3

x4

x5

x6

x7

x8

x9

x10

x11

x12

x13

x14

x15

x16

ρ

x1

0

1

0

0

0

1

0

0

0

0

0

0

0

0

0

0

2

x2

1

0

0

0

0

1

1

0

0

0

0

0

0

0

0

0

3

x3

0

0

0

0

0

0

1

0

0

0

0

0

0

0

0

0

1

x4

0

0

0

0

1

0

0

1

1

0

0

0

0

0

0

0

3

 

x5

0

0

0

1

0

0

0

1

1

0

0

0

0

0

0

0

3

 

x6

1

1

0

0

0

0

1

0

0

1

1

0

0

0

0

0

5

x7

0

1

1

0

0

1

0

0

0

0

1

0

0

0

0

0

4

=

x8

0

0

0

1

1

0

0

0

2

0

1

1

1

0

0

0

7

 

x9

0

0

0

1

1

0

0

2

0

0

0

0

1

0

0

0

5

 

X10

0

0

0

0

0

1

0

0

0

0

1

1

0

1

1

0

5

 

X11

0

0

0

0

0

1

1

1

0

1

0

1

1

1

0

0

7

 

X12

0

0

0

0

0

0

0

1

0

1

1

0

1

0

1

0

5

 

X13

0

0

0

0

0

0

0

1

1

0

1

1

0

0

0

1

5

 

X14

0

0

0

0

0

0

0

0

0

1

1

0

0

0

1

1

4

 

X15

0

0

0

0

0

0

0

0

0

1

0

1

0

1

0

1

4

 

X16

0

0

0

0

0

0

0

0

0

0

0

0

1

1

1

0

3




 

2) Выделяем первую запрещенную вершину.

G1 ={X7}

3) Для вершины xi ϵ Г(xv) определяем относительные веса 

δ (xv) = ρ(xi)-   

где ρ(xi) – локальная степень вершины xi , ρ(xi) = ; – число ребер, соединяющих вершину xi с вершинами xj , вошедшими в G1;

m – число вершин G1 на текущем шаге работы алгоритма. Переход к п.4.

Г (X7) = {X7, X3, X6, X11}

4) Выбираем вершину Xs , для которой   ). Если таких вершин несколько, то выбираем вершину с большой локальной степенью ρ(xi). Переход к п.5.

   δ (X2) = 2                        b27 = 1

    δ (X3) = 0 min                 b37 = 1

    δ (X6) = 4                         b67 = 1

    δ (X11) = 6                       b117 = 1

5) Полученную вершину  Xs помещаем в кусок G1: G1={ xv xs }. Переход к п.6.

Xs = X3

6) Подсчитываем число  n1 вершин в куске G1. Если n1 < n, где n  - заданное число вершин в каждом куске, то переход к п.8.

G1 = {X7, X3}, т.к.  nt < n

8) Добавляем в список вершины, смежные вершинам, вошедшим в кусок G1.

Г (X7, X3) = {X2, X6, X11}

Переход к пункту № 3

3) Для вершины xi ϵ Г(xv) определяем относительные веса 

δ (xv) = ρ(xi)-   

где ρ(xi) – локальная степень вершины xi , ρ(xi) = ; – число ребер, соединяющих вершину xi с вершинами xj , вошедшими в G1;

m – число вершин G1 на текущем шаге работы алгоритма. Переход к п.4

Г (X7, X3) = {X2, X6, X11}

4) Выбираем вершину Xs, для которой   ). Если таких вершин несколько, то выбираем вершину с большой локальной степенью ρ(xi). Переход к п.5.

    δ (X2) = 2 min           b273 = 1

    δ (X6) = 4                  b673 = 1

    δ (X11) = 6                b1173 = 1

5) Полученную вершину  Xs помещаем в кусок G1: G1={ xv xs }. Переход к п.6.

Xs = X2

6) Подсчитываем число  n1 вершин в куске G1. Если n1 < n, где n  - заданное число вершин в каждом куске, то переход к п.8.

G1 = {X7, X3, X2}, т.к.  nt < n

8) Добавляем в список  вершины, смежные вершинам, вошедшим в кусок G1.

Г (X7, X3, X2) = {X1, X6, X11}

Переход к пункту № 3

3) Для вершины xi ϵ Г(xv) определяем относительные веса 

δ (xv) = ρ(xi)-   

где ρ(xi) – локальная степень вершины xi , ρ(xi) = ; – число ребер, соединяющих вершину xi с вершинами xj , вошедшими в G1;

m – число вершин G1 на текущем шаге работы алгоритма. Переход к п.4

Г (X7, X3, X2) = {X1, X6, X11}

4) Выбираем вершину Xs , для которой   ). Если таких вершин несколько, то выбираем вершину с большой локальной степенью ρ(xi). Переход к п.5.

    δ (X1) = 1 min           b1732 = 1

    δ (X6) = 3                  b6732 = 2

    δ (X11) = 6                b11732 = 1

5) Полученную вершину  Xs помещаем в кусок G1: G1={ xv xs }. Переход к п.6.

Xs = X1

6) Подсчитываем число  n1 вершин в куске G1. Если n1 < n, где n  - заданное число вершин в каждом куске, то переход к п.8.

G1 = {X7, X3, X2 X1}

7) Если n1 = n, кусок G1 сформирован, тогда переход к п.9.

n1 = n

9) Удаляем из матрицы  A строки и столбцы, соответствующие  номерам вершин, вошедших в кусок  G1. Для формирования следующего  куска G2, начиная со следующей  запрещенной вершины, процедура  повторяется с п.2. Если сформирован  последний кусок, переход к  п.10.

Удаляем из матрицы A {X7 X3, X2, X1}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x4

x5

x6

X8

X9

X10

x11

x12

x13

x14

x15

X16

ρ

x4

0

1

0

1

1

0

0

0

0

0

0

0

3

x5

1

0

0

1

1

0

0

0

0

0

0

0

3

x6

0

0

0

0

0

1

1

0

0

0

0

0

2

X8

1

1

0

0

2

0

1

1

1

0

0

0

7

X9

1

1

0

2

0

0

0

0

1

0

0

0

5

X10

0

0

1

0

0

0

1

1

0

1

1

0

5

x11

0

0

1

1

0

1

0

1

1

1

0

0

6

x12

0

0

0

1

0

1

1

0

1

0

1

0

5

x13

0

0

0

1

1

0

1

1

0

0

0

1

5

x14

0

0

0

0

0

1

1

0

0

0

1

1

4

x15

0

0

0

0

0

1

0

1

0

1

0

1

4

x16

0

0

0

0

0

0

1

0

1

1

1

0

3




 

 

 

 

 

=

 

 

 

 

 

 

2) Выделяем вторую запрещенную  вершину.

G2 = (X14)

3) Для вершины xi ϵ Г(xv) определяем относительные веса 

δ (xv) = ρ(xi)-   

где ρ(xi) – локальная степень вершины xi , ρ(xi) = ; – число ребер, соединяющих вершину xi с вершинами xj , вошедшими в G2;

m – число вершин G2 на текущем шаге работы алгоритма. Переход к п.4.

Г (X14) = {X10, X11, X16}

4) Выбираем вершину Xs , для которой   ). Если таких вершин несколько, то выбираем вершину с большой локальной степенью ρ(xi). Переход к п.5.

           δ (X10) = 4             b1014 = 1                         

δ (X11) = 5             b1114 = 1

      δ (X16) = 2 min     b1614 = 1

5) Полученную вершину  Xs помещаем в кусок G2: G2={ xv xs }. Переход к п.6.

Xs = X16

6) Подсчитываем число  n2 вершин в куске G2. Если n2 < n, где n  - заданное число вершин в каждом куске, то переход к п.8.

G2 = {X14, X16}, т.к.  nt < n

8) Добавляем в список  Г(xv) вершины, смежные вершинам, вошедшим в кусок G2. Переход к п.3.

 Г (X14, X16) = { X10, X11, X13}

Переход к пункту № 3

3) Для вершины xi ϵ Г(xv) определяем относительные веса 

δ (xv) = ρ(xi)-   

где ρ(xi) – локальная степень вершины xi , ρ(xi) = ; – число ребер, соединяющих вершину xi с вершинами xj , вошедшими в G2;

m – число вершин G2 на текущем шаге работы алгоритма. Переход к п.4

Г (X14, X16) = { X10, X11, X13}

4) Выбираем вершину Xs , для которой   ). Если таких вершин несколько, то выбираем вершину с большой локальной степенью ρ(xi). Переход к п.5.

         δ (X10) = 4 min     b101416 = 1

         δ (X11) = 5             b111416 = 1

         δ (X13) = 4             b131416 = 1

5) Полученную вершину  Xs помещаем в кусок G2: G2={ xv xs }. Переход к п.6.

Xs = X16

6) Подсчитываем число  n2 вершин в куске G2. Если n2 < n, где n  - заданное число вершин в каждом куске, то переход к п.8.

G2 { X14, X16, X10}, т.к.  nt < n

8) Добавляем в список  Г(xv) вершины, смежные вершинам, вошедшим в кусок G2. Переход к п.3.

Г (X14, X16, X10) = { X6, X11, X12}

Переход к пункту № 3

3) Для вершины xi ϵ Г(xv) определяем относительные веса 

δ (xv) = ρ(xi)-   

где ρ(xi) – локальная степень вершины xi , ρ(xi) = ; – число ребер, соединяющих вершину xi с вершинами xj , вошедшими в G2;

m – число вершин G2 на текущем шаге работы алгоритма. Переход к п.4

Г (X14, X16, X10) = { X6, X11, X12}

4) Выбираем вершину Xs , для которой   ). Если таких вершин несколько, то выбираем вершину с большой локальной степенью ρ(xi). Переход к п.5.

         δ (X6) = 1 min        b6141610 = 1

    δ (X11) = 4              b11141610 = 1

    δ (X12) = 4              b12141610 = 1

5) Полученную вершину  Xs помещаем в кусок G2: G2={ xv xs }. Переход к п.6.

 Xs = X6

6) Подсчитываем число  n2 вершин в куске G2. Если n2 < n, где n  - заданное число вершин в каждом куске, то переход к п.8.

G2 = { X14, X16, X10,X6}

7) Если n2 = n, кусок G1 сформирован, тогда переход к п.9.

 n2 = n

     Переход к  пункту №9

9) Удаляем из матрицы  A строки и столбцы, соответствующие  номерам вершин, вошедших в кусок  G2. Для формирования следующего  куска G3, начиная со следующей  запрещенной вершины, процедура  повторяется с п.2. Если сформирован  последний кусок, переход к  п.10.

Удаляем из матрицы A { X14, X16, X10,X6}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x4

x5

x8

X9

X11

X12

x13

x15

ρ

x4

0

1

1

1

0

0

0

0

3

x5

1

0

1

1

0

0

0

0

3

X8

1

1

2

1

1

1

0

0

7

X9

1

1

2

0

0

0

1

0

5

X11

0

0

1

0

0

1

1

0

3

X12

0

0

1

0

1

0

1

1

4

x13

0

0

1

1

1

1

0

0

4

x15

0

0

0

0

0

1

0

0

1

Информация о работе Последовательный алгоритм компоновки с равными числу вершин в каждом куске