на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Алгоритмы поиска кратчайших покрытий булевых матриц
p align="left"> Покрытие методом Патрика

Покрытия методом Закревского

5.3.3 Пример 3. Построим кратчайшее покрытие для произвольной матрицы размером 30Ч30 с плотностью единицы 0,3 методом Закревского

Матрица, сгенерированная программой

Покрытия, построенные программой:

6. Длина покрытия

Длина покрытия булевой матрицы - это число строк (столбцов), образующих покрытие этой матрицы.

С помощью созданной программы можно проследить зависимость длины покрытия матрицы (L) от плотности единицы (P) в ней.

Построим график зависимости для матриц размерности 7Ч7, для этого сделаем 10 попыток на каждую вероятность. По оси абсцисс отложим плотность единицы в матрице, а по другой оси среднее значение длины покрытия при заданной плотности.

Видно, что при достаточно малых размерностях матрицы, всего 7Ч7, средняя длина покрытия почти совпадает.

Построим график для метода Закревского для матриц 10Ч10, для этого сделаем 20 попыток на каждое значение вероятности:

ЗАКЛЮЧЕНИЕ

В результате выполнения курсовой работы мною была разработана и отлажена программа, позволяющая находить кратчайшие покрытия булевых матриц размером до 100Ч100 методом Патрика (см. раздел 3.1) и методом Закревского (столбцовое и строчное покрытие) (см. раздел 3.2), а так же рассмотрен способ оптимизации (сокращения) булевых матриц (см. раздел 3.3).

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

Данные алгоритмы реализованы в интегрированной среде C++Builder6.0., которая является, на мой взгляд, наиболее подходящей для решения такого типа задач, поскольку позволяет создать наиболее удобный для пользователя интерфейс.

ЛИСТИНГ ПРОГРАММЫ

Unit1.cpp

#include <vcl.h>

#include <stdlib.h>

#pragma hdrstop

#include "Unit5.h"

#include "Unit4.h"

#include "Unit3.h"

#include "Unit2.h"

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

extern int a,b,c;

int **arr, *arra, *arrb,Flag = 0;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm1::RadioButton2Click(TObject *Sender)

{

Label3->Visible=true;

MaskEdit1->Visible=true;

Edit1->Visible=true;

CheckBox1->Visible=false;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::RadioButton1Click(TObject *Sender)

{

Label3->Visible=false;

MaskEdit1->Visible=false;

Edit1->Visible=false;

CheckBox1->Visible=true;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

Close();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

a=StrToInt(MaskEdit2->EditText);

b=StrToInt(MaskEdit3->EditText);

if(a*b==0 || (RadioButton2->Checked==true && MaskEdit1->EditText=="0"))

{

Application->MessageBox("Введите данные до конца или проверьте данные", Внимание!");

Abort();

}

if(RadioButton2->Checked)

c=StrToInt(MaskEdit1->EditText);

else

c=0;

arr=new int*[b];

arra=new int[a];

arrb=new int[b];

for(int i=0;i<a;i++)

arra[i]=0;

for(int i=0;i<b;i++)

{

arrb[i]=0;

arr[i]=new int[a];

for(int j=0;j<a;j++)

{

if(c>0)

if(random(10)<=c)

{

arr[i][j]=1;

arrb[i]++;

arra[j]++;

}

else

arr[i][j]=0;

else

{

if(CheckBox1->Checked==false)

arr[i][j]=0;

else

{

arr[i][j]=1;

arrb[i]++;

arra[j]++;

} } } }

for(int i=0;i<b; i++)

{

for(int j=0;j<a;j++)

{

if((arrb[i]==0 || arra[j]==0) & RadioButton2->Checked==true)

{ Application->MessageBox("Попробуйте еще раз или введите другое значение вероятности", "Внимание!");

Abort();

} } }

Form1->Hide();

Form2->Show();

Form5->Visible=false;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormShow(TObject *Sender)

{

Form5->ShowModal();

}

//---------------------------------------------------------------------------

Unit2.cpp

#include <vcl.h>

#pragma hdrstop

#include "Unit5.h"

#include "Unit4.h"

#include "Unit3.h"

#include "Unit2.h"

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm2 *Form2;

int a, b, c, **pokr,**pokr2, q;

extern int **arr, *arra, *arrb,Flag;

//---------------------------------------------------------------------------

__fastcall TForm2::TForm2(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)

{

Form1->Close();

}

//---------------------------------------------------------------------------

void __fastcall TForm2::FormShow(TObject *Sender)

{

Image1->Width=10*a;

Image1->Height=10*b;

for(int i=0; i<b; i++)

{

Image1->Canvas->MoveTo(0, i*Image1->Height/b);

Image1->Canvas->LineTo(Image1->Width, i*Image1->Height/b);

}

for(int j=0; j<a; j++)

{

Image1->Canvas->MoveTo(j*Image1->Width/a, 0);

Image1->Canvas->LineTo(j*Image1->Width/a, Image1->Height);

}

if(c>0 || c==0 && arr[0][0]==1)

{

Image1->Canvas->Brush->Color=clActiveCaption;

for(int i=0;i<b;i++)

{

for(int j=0;j<a;j++)

{

if(arr[i][j]==1)

Image1->Canvas->FillRect(Rect(10*j+1,10*i+1,10*j+10,10*i+10));

} } }}

//---------------------------------------------------------------------------

void __fastcall TForm2::N1Click(TObject *Sender)

{

int *arra_copy, *arrb_copy, **arr_copy;

int min, *pokr_d, *counter1, *counter2, **pokr1, t=0, res=1;

arr_copy=new int*[b];

arra_copy=new int[a];

arrb_copy=new int[b];

for(int i=0;i<a;i++)

arra_copy[i]=arra[i];

for(int i=0;i<b;i++)

{

arrb_copy[i]=arrb[i];

arr_copy[i]=new int[a];

for(int j=0; j<a; j++)

arr_copy[i][j]=arr[i][j];

}

for(int i=0;i<b; i++)

{

for(int j=0;j<a;j++)

{

if(arrb_copy[i]==0 || arra_copy[j]==0)

{

Application->MessageBox("Слишком маленькое значение вероятности", "Ошибка");

Abort(); } } }

if(a*b>36)

{

for(int i=0; i<b; i++)

{

if(arrb_copy[i]>0)

{

for(int temp, j=i+1; j<b; j++)

{

if(arrb_copy[j]>0 && arrb_copy[i]>0)

{

int z;

temp=0;

for(int k=0; k<a; k++)

if(arr_copy[i][k]==1 & arr_copy[j][k]==1)

temp++;

if(arrb_copy[i]>=arrb_copy[j])

z=j;

else

z=i;

if(temp==arrb_copy[z])

{

for(int k=0; k<a; k++)

{

if(arr_copy[z][k]==1)

arra_copy[k]--;

arr_copy[z][k]=0;

}

arrb_copy[z]=0;

} } } } }

for(int i=0; i<a; i++)

{

if(arra_copy[i]>0)

{

for(int temp, j=i+1; j<a; j++)

{

if(arra_copy[j]>0)

{

int z;

temp=0;

for(int k=0; k<b; k++)

if(arr_copy[k][i]==1 & arr_copy[k][j]==1)

temp++;

if(arra_copy[i]>=arra_copy[j])

z=i;

else

z=j;

if(temp==arra_copy[z])

{

for(int k=0; k<b; k++)

{

if(arr_copy[k][z]==1)

arrb_copy[k]--;

arr_copy[k][z]=0;

}

arra_copy[z]=0;

} } } } }

}

counter1=new int[a];

counter2=new int[a];

for(int i=0; i<a; i++)

{

if(arra_copy[i]>0)

{

res*=arra_copy[i];

if(arra_copy>0)

counter2[i]=1;

else

counter2[i]=0;

}

}

pokr1=new int*[res];

for(int i=0; i<res; i++)

{

pokr1[i]=new int[b];

for(int j=0; j<b; j++)

pokr1[i][j]=0;

}

for(;;)

{

for(int i=0; i<a; i++)

{

counter1[i]=counter2[i];

if(arra_copy[i]>0)

{

for(int j=0; j<b; j++)

{

if(arr_copy[j][i]==1)

{

if(counter1[i]>1)

{

counter1[i]--;

continue;

}

pokr1[t][j]=1;

break;

} } } }

counter2[0]++;

for(int i=0; i<(a-1); i++)

{

if(counter2[i]>arra_copy[i] && counter2[a-1]<=arra_copy[a-1])

{

counter2[i]=0;

counter2[i+1]++;

}

}

if(counter2[a-1]>arra_copy[a-1])

break;

t++;

if(t==res)

break;

}

delete []arr_copy;

delete []arra_copy;

delete []arrb_copy;

Страницы: 1, 2, 3



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.