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 1TRƯỜ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 2I 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 3II Kết quả thực hiện
1.Nhập đầu vào 3 biến
Trang 42.Nhập đầu vào 5 biến
Trang 6III 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 7while (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 8for (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 9char 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 10int 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 11for (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 12ktrasophantuconlai = 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 13void 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 14cout << 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 16if (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 17for (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 18delete[] 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 19else cout << In_ra_dang_xau(Essential[i].xau) << " + "; }
return 0;
}