Составление учебных планов на основе генетических алгоритмов

Автор работы: Пользователь скрыл имя, 10 Ноября 2011 в 11:33, дипломная работа

Краткое описание

С оптимизацией человек сталкивается постоянно в своей жизни, порой даже не замечая этого. Он выбирает, на каких станциях метро нам лучше пересесть в другой поезд, чтобы добраться до места назначения быстрее и с меньшим числом пересадок. Казалось бы, простая задача, с которой каждый справляется с большим или меньшим успехом. Но даже это простой пример показывает, как неоднозначен выбор. Приходиться проводить оптимизацию по двум критериям – время и количество пересадок. А если таких критериев не 2, а несколько десятков, причём один критерий зависит от определённого количества других, то тут уже не так просто справиться с задачей, найти лучшее сочетание значений этих критериев. Не помогает даже большой опыт человека в области, в которой решается задача оптимизации.

Содержание работы

ВВЕДЕНИЕ 3
1. ГЕНЕТИЧЕСКИЕ АЛГОРИТМЫ 7
1.1. История появления эволюционных алгоритмов 7
1.2. Общие сведения о ГА 9
1.3. Модели генетических алгоритмов 13
1.4. Другие пути решения задач оптимизации 17
1.5. Применение генетических алгоритмов 21
1.6. Постановка задачи 24
2. ПРИМЕНЕНИЕ ГЕНЕТИЧЕСКИХ АЛГОРИТМОВ ДЛЯ ЗАДАЧ СОСТАВЛЕНИЯ УЧЕБНЫХ ПЛАНОВ 25
2.1. Учебные планы нового поколения. Общие сведения 25
2.2. Формирование рабочих учебных планов 27
2.3. Формирование учебных планов на основе генетических алгоритмов 31
2.4. Соответствие терминов биологии и предметной области 34
3. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ ГЕНЕТИЧЕСКОГО АЛГОРИТМА ДЛЯ ГЕНЕРАЦИИ УЧЕБНЫХ ПЛАНОВ 36
3.1. Выбор языка программирования. Pascal ABC 36
3.2. Функциональная схема работы программы 38
3.3. Описание fitness-функции 42
3.4. Генерация вариативных наборов 44
3.5. Описание констант и переменных программы 46
3.6. Описание функций программы 47
3.7. Результат работы программы 49
ЗАКЛЮЧЕНИЕ 51
Список используемой литературы 52

Содержимое работы - 1 файл

диплом на печать.docx

— 1.30 Мб (Скачать файл)

end. 
 

     Листинг Fitness - функции

procedure Fitness(var c:TChrom);

var

   i,n: integer;

  disc_numbers:TDiscNumbers;

  double_disc: integer;   

   all_hours: integer;       

begin

   c.fitness:=0;

            for i:=1 to c.length do  - Формирование массива с номерами дисциплин

           disc_numbers[i]:=c.disc[i].key;

           writeln('.');

           for i:=1 to c.length do

               write (disc_numbers[i],'  ');

           double_disc:=NumDoubleDisc(disc_numbers,c.length); - Проверка на повторяющиеся дисциплины

     if double_disc>0 then c.fitness:=c.fitness-BALL*double_disc/c.length;

       all_hours:=0;

            for i:=1 to c.length do - Проверка общего числа часов хромосомы, общему числу часов учебного плана по ФГОС

           all_hours:=all_hours+c.disc[i].h_all;

    if all_hours<>(HOURS_ALL - HOURS_PRAC-HOURS_EXAM) then

         c.fitness:=c.fitness-BALL;

     h_aud:=0; 

     h_src:=0;

     for i:=1 to c.length do begin  - Подсчет и проверка соотношения часов и самостоятельных работ

         h_aud:=h_aud+d[i].h_lection+d[i].h_laborat+d[i].h_practical;

         src_hourse:=srs_hourse[i];

     end;

     if (aud_hourse/src_hourse>AUD/SRC) then

         fitness:=fitness-BALL

     else fitness:=fitness+BALL

     for i:=0 to kolsem do begin

         kol_exam:=0; kol_zach:=0;

         kol_kr:=0; kol_kp:=0;

     for i:=1 to c.koldisc do begin - Подсчет числа экзаменов в семестре

          if disc[j].examination=I then

             kol_exam++;

           if disc[j].final_test=I then

             kol_zach++;

           if disc[j].yearly_project=I then

             kol_kp++;

           if disc[j].yearly_work=I then

             kol_kr++;

         end;

       if  (kol_exam>KOL_EXAM_SEM) then - Проверка на допустимое число экзаменов в семестре

         fitness:=fitness-BALL

     else fitness:=fitness+BALL

     if  (kol_kp>KOL_EARLY_PROJECT_SEM) then

           fitness:=fitness-BALL

     else fitness:=fitness+BALL

     end;

end; 

     Листинг вариативной функции

Procedure GenerateVariation(d:TDisc; var v:TVariation; var n_v:integer);

var

  i,j: integer;

   b1,b2,b3,b4: integer;

   p1,p2,p3,p4: integer;

  l1,l2,l3: integer;

   vv:array[1..12]of TDisc;

     N:integer;

     w: array[1..4]of real;

  r:real;

   s:integer;

begin

   CopyDisc(d,v[1]); v[1].number:=1; n_v:=1; 

                  {вариации по экзамену  зачёту}

     CopyDisc(d,v[2]); v[2].number:=2; inc(n_v);

   CopyDisc(d,v[3]); v[3].number:=3; inc(n_v);

   if (v[1].examination=true) and (d.final_test=true) then

     begin

        v[2].examination:=true;v[2].final_test:=false;

        v[3].examination:=false;v[3].final_test:=true;

        v[3].h_min_by_standart:=v[3].h_min_by_standart-1;

        v[3].h_all:=   v[3].h_all-36;

     end;

   if (v[1].examination=true) and (d.final_test=false) then

     begin

        v[2].examination:=true;v[2].final_test:=true;

        v[3].examination:=false;v[3].final_test:=true;

        v[3].h_min_by_standart:=v[3].h_min_by_standart-1;

        v[3].h_all:=   v[3].h_all-36;

     end;

   if (v[1].examination=false) and (d.final_test=true) then

     begin

        v[2].examination:=true;v[2].final_test:=true;

        v[3].examination:=true;v[3].final_test:=false;

   end;

{вариации  по к.работе,  к.проекту,  домашнему заданию  и реферату}

   CopyDisc(v[1],v[4]); v[4].number:=4;  inc(n_v);

   CopyDisc(v[1],v[5]); v[5].number:=5;  inc(n_v);

   CopyDisc(v[1],v[6]); v[6].number:=6;  inc(n_v);

   Variation_1_4(v[1],v[4],v[5],v[6]);

     CopyDisc(v[2],v[7]);  v[7].number:=7; inc(n_v);

   CopyDisc(v[2],v[8]);  v[8].number:=8; inc(n_v);

   CopyDisc(v[2],v[9]);  v[9].number:=9; inc(n_v);

   Variation_1_4(v[2],v[7],v[8],v[9]);

     CopyDisc(v[3],v[10]);  v[10].number:=10;  inc(n_v);

   CopyDisc(v[3],v[11]);  v[11].number:=11;  inc(n_v);

   CopyDisc(v[3],v[12]);  v[12].number:=12;  inc(n_v);

   Variation_1_4(v[3],v[10],v[11],v[12]); 

   {вариации по часам лекций, лаб. и прак.}

   if (v[1].h_laborat=0)and(v[1].h_practical=0)then  -если нет лаб и практик

     begin   {выкидуем комбинации экзамен-1  зачёт-1}

      j:=1;

      for i:=1 to 12 do

         if (v[i].examination=false)or(v[i].final_test=false) then

           begin

             CopyDisc(v[i],

             vv[j]); inc(j);

           end;

       for i:=1 to 8 do

          CopyDisc(vv[i], vv[i]);

      n_v:=8;

     case v[1].h_lection of

        14,17,18 : begin  b1:=num_weeks*2; b2:=0; end;

             28,34,36 : begin  b1:=num_weeks; b2:=num_weeks*3;  

        42,51,54 : begin  b1:=num_weeks; b2:=0;  

           end;

    end;

     end;

     N:=n_v; j:=0;

   for i:=1 to N do

     begin

        CopyDisc(v[i],v[N+i+j]);

         v[N+i+j].number:=N+i+j;

      inc(n_v);

        v[N+i+j].h_lection:=b1;

        if b2<>0 then

          begin

             inc(j);

             CopyDisc(v[i],v[N+i+j]);

           v[N+i+j].number:=N+i+j;

        inc(n_v);

             v[N+i+j].h_lection:=b2;

          end;

       end;

   end;  

   {если лек и лаб  }

   if (v[1].h_laborat<>0)and(v[1].h_practical=0)then

     begin

        case v[1].h_lection of

           (NUM_WEEK div 2): begin 

             b1:=num_weeks*2; p1:=num_weeks;

                            b2:=num_weeks*2; p2:=num_weeks*2;

                            b3:=0; p3:=0;

                            b4:=0; p4:=0;

                     end;

           NUM_WEEK : begin 

             b1:=num_weeks;   p1:=num_weeks;

                            b2:=num_weeks*3; p2:=num_weeks;

                            if v[1].h_laborat=num_weeks then

                              begin

                                 b3:=num_weeks*2; p3:=num_weeks*2;

                                 b4:=0;  p4:=0;

                              end

                            else begin

                                 b3:=num_weeks*2; p3:=num_weeks;

                                 b4:=num_weeks*3; p4:=num_weeks*2;

                              end;

                     end;

        NUM_WEEK+(NUM_WEEK div 2) : begin 

             b1:=num_weeks*2; p1:=num_weeks;

                            b2:=num_weeks*2; p2:=num_weeks*2;

                            if v[1].h_laborat=num_weeks then

                              begin 

               b3:=num_weeks*3;

               p3:=num_weeks*2;

             end

                            else begin

               b3:=num_weeks*3;

               p3:=num_weeks;end;

                               b4:=0; p4:=0;

                      end; end;

        N:=n_v; j:=0;

        for i:=1 to N do

         begin

             CopyDisc(v[i],v[N+i+j]);

           v[N+i+j].number:=N+i+j;

           inc(n_v);

             v[N+i+j].h_lection:=b1;

           v[N+i+j].h_laborat:=p1;

             inc(j);

             CopyDisc(v[i],v[N+i+j]);

           v[N+i+j].number:=N+i+j;

           inc(n_v);

             v[N+i+j].h_lection:=b2;

           v[N+i+j].h_laborat:=p2;

            if b3<>0 then

             begin

                inc(j);

                CopyDisc(v[i],v[N+i+j]);

           v[N+i+j].number:=N+i+j;

           inc(n_v);

                v[N+i+j].h_lection:=b3;

           v[N+i+j].h_laborat:=p3;

             end;

            if b4<>0 then

             begin

                inc(j);

                CopyDisc(v[i],v[N+i+j]);

           v[N+i+j].number:=N+i+j;

           inc(n_v);

                v[N+i+j].h_lection:=b4;

           v[N+i+j].h_laborat:=p4;

             end;

         end;

    end;    

   {если лек и прак}

   if (v[1].h_practical<>0)and(v[1].h_laborat=0)then

     begin

        case v[1].h_lection of

           14,17,18 : begin 

             b1:=num_weeks*2;

             p1:=num_weeks;

                            b2:=num_weeks*2;

             p2:=num_weeks*2;

                            b3:=0; p3:=0;

                            b4:=0; p4:=0;

                     end;

           28,34,36 : begin

              b1:=num_weeks; 

          p1:=num_weeks;

                            b2:=num_weeks*3;

             p2:=num_weeks;

                            if v[1].h_practical=num_weeks then

                              begin

                                 b3:=num_weeks*2;

               p3:=num_weeks*2;

                                 b4:=0;  p4:=0;

Информация о работе Составление учебных планов на основе генетических алгоритмов