1. Trang chủ
  2. » Giáo Dục - Đào Tạo

BÁO cáo môn điện tử số đề tài thuật toán quine MCcluskey

19 17 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 19
Dung lượng 368,05 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI ---VIỆN ĐIỆN TỬ - VIỄN THÔNG---BÁO CÁO MÔN ĐIỆN TỬ SỐ Đề tài: Thuật toán Quine-MCcluskey GVHD: Hoàng Mạnh Thắng SINH VIÊN THỰC HIỆN:... Tóm tắt giải thuậ

Trang 1

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI -VIỆN ĐIỆN TỬ - VIỄN

THÔNG -BÁO CÁO MÔN ĐIỆN TỬ SỐ

Đề tài: Thuật toán Quine-MCcluskey

GVHD: Hoàng Mạnh Thắng

SINH VIÊN THỰC HIỆN:

Trang 2

I Tóm tắt giải thuật dưới dạng sơ đồ

S

Đ

Nhập số biến: n

Nhập số minterm: m

Bắt đầu

Chuyển các phần tử về dạng nhị

phân và sắp xếp theo thứ tự tăng

dần

Tạo class QM chứa các thuộc tính:minterm,xau,sobit1

Tạo class PI chứa các thuộc tính:index,xau,biến check

Tạo danh sách chứa các đối tượng trong class QM,DSPI để lưu PI

So sánh lần lượt từng cặp nhị

phân với nhau

Khác nhau

đúng 1 bit

END

Lập thành nhóm mới, giữ lại

các biến giống nhau, biến còn

Tạo danh sách tên esential để chứa các essential,tạo mảng 2 chiều arrPI để lưu vị trí các minterm trong DSPI.Duyệt mảng những hàng nào mà phần tử có giá trị bằng 1 duy nhất trong cột tương ứng sẽ là essential,thêm PI vừa tìm đc vào danh sách esential,tại những ô có giá trị bằng 1 của các PI gán tất cả giá trị

của cột chứa ô đó bằng 0

Tạo 1 biến là so PI để đếm

prime implicant,có giá trị

bằng kích thước DSPI

Lập bảng lựa chọn hàm

Tìm các essential và PI cần

thiết để ra hàm tối ưu

Trang 3

II Kết quả thực hiện

1.Nhập đầu vào 3 biến

Trang 4

2.Nhập đầu vào 5 biến

Trang 6

III Nhận xét:

+ Thuật toán chưa thực hiện được với trạng thái don’t care + Thuật toán chưa tối ưu và dài.

+ Thuật toán mới chỉ thực hiện trên các minterm.

+ Thuật toán có thể thực hiện với nhiều biến.

#include <iostream>

#include <math.h>

#include <string>

#include <vector>

#include <algorithm>

using namespace std;

// Ham de chuyen tu thap phan sang he nhi phan

string decToBin(int n, int sobien) {

string nhiphan = "";

while (n != 0) {

int i = n % 2;

if (i == 0) nhiphan = "0" + nhiphan;

else nhiphan = "1" + nhiphan;

n = n / 2;

}

int so_bit_thieu = sobien - nhiphan.length();

Trang 7

while (so_bit_thieu != 0) {

nhiphan = "0" + nhiphan; so_bit_thieu ;

}

return nhiphan;

}

class QM {

public:

int minterm;

string xau;

int Sobit1();

QM() {}; // Day la ham tao

~QM() {}; // Day la ham huy };

int QM::Sobit1() {

int dem = 0;

for (int i = 0; i < xau.length(); i++) {

if (xau[i] == '1') dem++;

}

return dem;

}

bool Sosanh(QM a, QM b) {

return (a.Sobit1() < b.Sobit1()); }

string Ghep_2_xau(string a, string b) {

Trang 8

for (int i = 0; i < a.length(); i++) {

if (a[i] != b[i]) a[i] = '-';

}

return a;

}

// Ham de kiem tra xem 2 chuoi khac nhau may bit int Kiemtra(string a, string b) {

int ktra = 0;

for (int i = 0; i < a.length(); i++) {

if (a[i] != b[i]) ktra++;

}

return ktra;

}

// Ham tinh tong tat ca phan tu trong ma tran int sum_matrix(int** arr, int m, int n) {

int sum = 0;

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

for (int j = 0; j < n; j++) sum += arr[i][j];

return sum;

}

string In_ra_dang_xau(string s) {

string xau = "";

int dodai = s.length();

for (int i = 0; i < dodai; i++) {

if (s[i] == '1') {

Trang 9

char c = 'a' + i; string x(1, c); xau += x;

} else if (s[i] == '0') { char c = 'a' + i; string x(1, c); xau = xau + x + "'"; }

else continue;

}

return xau;

}

int Tim_he_so_max(int* arr, int m) {

int index = 0;

int max = arr[0];

for (int i = 0; i < m; i++) {

if (arr[i] > max) { max = arr[i]; index = i;

} }

return index;

}

class PI {

public:

vector <int> index;

string xau;

Trang 10

int check; // bien nay de kiem tra xem minterm da duoc cho vao nhom chua

PI() {

check = 0;

}

};

void Tao_nhom(int sominterm, vector<PI>& DSPI, vector<QM> List, int& so_PI) {

// Nhom cac minterm, tim ra PI

bool ktrasophantuconlai = true;

vector<PI> DScacnhom;

vector<PI> DScopy; // tao 1 danh sach moi lay tat ca thong tin tu danh sach QM ban dau nhung o dang PI

for (int i = 0; i < sominterm; i++) {

PI pi;

pi.index.push_back(List[i].minterm); // Them chi so minterm vao danh sach moi

pi.xau = List[i].xau;

DScopy.push_back(pi);

}

// Tim ra cac doi tuong ma chi khac nhau 1 phan tu, Ghep 2 xau va them vao danh sach cac nhom

while (ktrasophantuconlai) {

for (int i = 0; i < DScopy.size() - 1; i++) { for (int j = i + 1; j < DScopy.size(); j++) {

if (Kiemtra(DScopy[i].xau, DScopy[j].xau) == 1) {

PI b;

b.xau = Ghep_2_xau(DScopy[i].xau, DScopy[j].xau);

DScopy[i].check++;

DScopy[j].check++;

Trang 11

for (int k = 0; k < DScopy[i].index.size(); k++) { b.index.push_back(DScopy[i].index[k]);

} for (int l = 0; l < DScopy[j].index.size(); l++) { b.index.push_back(DScopy[j].index[l]);

} DScacnhom.push_back(b);

} }

}

// Nhung doi tuong chua duoc danh dau se la PI for (int i = 0; i < DScopy.size(); i++) {

if (DScopy[i].check == 0) {

PI pi = DScopy[i];

DSPI.push_back(pi);

} }

DScopy.clear(); // Xoa het du lieu trong danh sach copy va gan gia tri moi = danh sach cac nhom

for (int i = 0; i < DScacnhom.size(); i++) {

PI bienmoi = DScacnhom[i]; // sao chep du lieu tu DScacnhom[i] sang bienmoi

DScopy.push_back(bienmoi);

}

// Kiem tra xem do dai danh sach cac nhom co rong hay khong

if (DScacnhom.size() == 0) {

Trang 12

ktrasophantuconlai = false;

} DScacnhom.clear(); // Xoa het du lieu trong danh sach cac nhom de tao lai tu dau }

// Xoa cac phan tu bi trung trong danh sach PI

for (int i = 0; i < DSPI.size() - 1; i++) {

for (int j = i + 1; j < DSPI.size(); j++) {

if (DSPI[i].xau == DSPI[j].xau) {

DSPI.erase(DSPI.begin() + j);

j ;

} } }

// in ra danh sach PI

so_PI = DSPI.size();

cout << "Danh sach PI:" << endl << endl;

cout << "PI\t\tXau\t\tNhom" << endl;

for (int i = 0; i < DSPI.size(); i++) {

cout << i + 1 << "\t\t" << DSPI[i].xau << "\t\t( ";

for (int j = 0; j < DSPI[i].index.size(); j++) cout << DSPI[i].index[j] << " ";

cout << ")" << endl;

}

cout << endl;

}

Trang 13

void Tim_PI(vector <QM> List, vector<PI> DSPI, int sominterm, int so_PI, vector <PI>& Essential) {

cout << "\nTim cac essential + tim cac PI can thiet de ra ham toi uu" << endl << endl;

int** arrPI = new int* [so_PI];

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

arrPI[i] = new int[sominterm];

cout << "PI\t";

for (int i = 0; i < List.size(); i++) { // In ra cac minterm da nhap o hang dau tien

cout << List[i].minterm << '\t';

}

cout << endl;

for (int j = 0; j < DSPI.size(); j++) { // Dem hang truoc

cout << j + 1 << ")\t";

for (int i = 0; i < List.size(); i++) { // In ra vi tri tuong ung cua cac PI arrPI[j][i] = 0;

int count = 0;

for (int d = 0; d < DSPI[j].index.size(); d++) {

if (DSPI[j].index[d] == List[i].minterm)

count++;

}

if (count == 0) {

arrPI[j][i] = 0;

cout << "\t";

} else {

arrPI[j][i] = 1;

Trang 14

cout << arrPI[j][i] << "\t";

} } cout << endl;

}

cout << endl << endl;

// Tim cac essential

int* hang_chua_PI = new int[so_PI]; // Tao 1 mang luu lai cac hang chua PI for (int i = 0; i < so_PI; i++)

hang_chua_PI[i] = 0; // khoi tao gia tri cho moi phan

tu mang = 0

for (int i = 0; i < so_PI; i++) {

int count = 0;

for (int j = 0; j < sominterm; j++) {

if (arrPI[i][j] == 1) {

for (int k = 0; k < so_PI; k++) {

if (arrPI[k][j] == 1) { count++;

} }

if (count == 1) {

PI pi = DSPI[i];

Essential.push_back(pi);

hang_chua_PI[i] = 1;

break;

Trang 15

} }

count = 0;

}

}

cout << endl;

cout << "Cac essential: " << endl;

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

if(hang_chua_PI[i] == 1)

cout << "PI" << i+1 << "\t";

cout << endl;

// Triet tieu cac phan tu 1 tu cac essential

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

if (hang_chua_PI[i] == 1)

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

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

for (int k = 0; k < so_PI; k++) arrPI[k][j] = 0;

cout << "\n\nBang gia tri sau khi triet tieu phan tu 1 tu cac esstential" << endl << endl; cout << "PI\t";

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

cout << List[i].minterm << '\t';

cout << endl;

for (int i = 0; i < so_PI; i++) {

cout << i + 1 << ")\t";

for (int j = 0; j < sominterm; j++) {

Trang 16

if (arrPI[i][j] == 0)

cout << "\t";

else

cout << arrPI[i][j] << "\t";

} cout << endl;

}

int* tong_cac_hang = new int[so_PI]; // tao 1 mang luu lai gia tri tong cac hang

while (sum_matrix(arrPI, so_PI, sominterm) != 0) {

for (int i = 0; i < so_PI; i++) tong_cac_hang[i] = 0; // khoi tao gia tri cho moi phang

tu mang = 0

for (int i = 0; i < so_PI; i++) { // Tinh tong cac hang for (int j = 0; j < sominterm; j++)

tong_cac_hang[i] += arrPI[i][j];

}

int hesomax = Tim_he_so_max(tong_cac_hang, so_PI);

if (tong_cac_hang[hesomax] != 0) {

PI pi = DSPI[hesomax];

Essential.push_back(pi);

cout << "=> Chon PI" << hesomax+1 << endl;

}

// xoa nhung phan tu = 1 cua cot tu nhung phan tu co gia tri = 1 o hang da chon

Trang 17

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

if (arrPI[hesomax][i] == 1)

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

if (arrPI[j][i] == 1) arrPI[j][i] = 0;

cout << "\n\nBang gia tri sau khi triet tieu phan tu 1 tu cac PI con lai co kich thuoc lon nhat" << endl << endl;

cout << "PI\t";

for (int i = 0; i < sominterm; i++) cout << List[i].minterm << '\t';

cout << endl;

for (int i = 0; i < so_PI; i++) { cout << i + 1 << ")\t";

for (int j = 0; j < sominterm; j++) {

if (arrPI[i][j] == 0)

cout << "\t";

else

cout << arrPI[i][j] << "\t";

} cout << endl;

} }

// xoa gia tri cac con tro

delete[] hang_chua_PI;

delete[] tong_cac_hang;

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

Trang 18

delete[] arrPI[i];

delete[] arrPI;

}

int main() {

vector <QM> List;

vector<PI> DSPI;

int sobien;

cout << "Nhap so bien: ";

cin >> sobien;

cout << endl;

int sominterm;

cout << "Nhap so minterm: ";

cin >> sominterm;

cout << endl << "Nhap cac minterm: " << endl; for (int i = 0; i < sominterm; i++) {

QM a;

cin >> a.minterm;

a.xau = decToBin(a.minterm, sobien); List.push_back(a);

} int so_PI = 0;

Tao_nhom(sominterm, DSPI, List, so_PI);

vector <PI> Essential;

Tim_PI(List, DSPI, sominterm, so_PI, Essential);

cout << "fmin = ";

for (int i = 0; i < Essential.size(); i++) {

if (i == Essential.size() - 1) cout << In_ra_dang_xau(Essential[i].xau);

Trang 19

else cout << In_ra_dang_xau(Essential[i].xau) << " + "; }

return 0;

}

Ngày đăng: 24/04/2022, 21:52

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w