//计算覆盖所有最小项的最小质蕴涵集,从非必要质蕴涵中选取覆盖面最大的加入解集 vector<implicant> getMinCover(vector<implicant> prime){ vector<implicant> res;//用于存储最终结果 while(MinTerms.size()){ //从质蕴涵集中选出必要质蕴涵 vector<implicant> ess_res = getEssential(prime); for(size_t i=0;i < ess_res.size();i++){ res.push_back(ess_res[i]); } //统计剩余的质蕴涵中包含剩余的最小项的数量 vector<size_t> prime_counter(prime.size(), 0); for(size_t i = 0;i < prime.size();i++) for(size_t j = 0;j < MinTerms.size();j++){ implicant minTerm(Orders, MinTerms[j], true); if(minTerm.isEquivalentTo(prime[i])) prime_counter[i]++; } //将包含剩余最小项最多的质蕴涵加入解集 size_t pos = 10000, max = 0; for(size_t i = 0;i < prime.size();i++) max = (max > prime_counter[i]) ? max :(pos = i, prime_counter[i]); //刷新解集,剔除已加入解集的最小项 for(size_t i=0;i < MinTerms.size();i++){ implicant minTerm(Orders, MinTerms[i], true); if(minTerm.isEquivalentTo(prime[pos])) MinTerms.erase(MinTerms.begin()+i--); } res.push_back(prime[pos]); prime.erase(prime.begin()+pos); } //剔除解集中的重复项 vector<implicant> result; vector<vector<implicant>> result_vec; result_vec.push_back(res); removeDup(result_vec,result); return result; }
void Guard::FindMinTerm (Guard *guard,Variable *targetVar, list<minTerm> &minTab) { list<minTerm>::iterator it; /* debug */ // cerr << "minTab : [" << endl ; // for (it = minTab.begin() ; it != minTab.end() ; it ++) { // cerr << "{ pred:" << it->pred ; // if (it->pred) cerr << "->" << *it->pred ; // cerr << ", pereET : " << it->pereET << ", minT: "<< it->minT << "}" << endl; // } // cerr << "]" << endl ; if (guard == NULL) return; if (!isMentioned(guard,targetVar)) { /* this minterm has no pred on targetVar */ minTerm minT = minTerm (NULL,NULL,guard); it = upper_bound(minTab.begin(),minTab.end(),minT); minTab.insert(it,minT); return; } // cerr << "\nin FindMinTerm" << *guard <<endl; if (guard->op == '+') { FindMinTerm (guard->fg,targetVar,minTab); FindMinTerm (guard->fd,targetVar,minTab); } else if (guard->op == '.') { if (guard->fg->var == targetVar) { minTerm minT = minTerm (guard->fg,guard,guard->fd); it = upper_bound(minTab.begin(),minTab.end(),minT); minTab.insert(it,minT); } else if (guard->fd->var == targetVar) { minTerm minT = minTerm (guard->fd,guard,guard->fg); it = upper_bound(minTab.begin(),minTab.end(),minT); minTab.insert(it,minT); } else { /* this minterm has no pred on targetVar */ minTerm minT = minTerm (NULL,NULL,guard); it = upper_bound(minTab.begin(),minTab.end(),minT); minTab.insert(it,minT); } } else { if (guard->var == targetVar) { minTerm minT = minTerm (guard,NULL,NULL); it = upper_bound(minTab.begin(),minTab.end(),minT); minTab.insert(it,minT); } else if (guard->op == 'h') { FindMinTerm (guard->fg,targetVar,minTab); } else { /* this minterm has no pred on targetVar */ minTerm minT = minTerm (NULL,NULL,guard); it = upper_bound(minTab.begin(),minTab.end(),minT); minTab.insert(it,minT); } } /* debug */ // cerr << "minTab : [" << endl ; // for (it = minTab.begin() ; it != minTab.end() ; it ++) { // cerr << "{ pred:" << it->pred ; // if (it->pred) cerr << "->" << *it->pred ; // cerr << ", pereET : " << it->pereET << ", minT: "<< it->minT << "}" << endl; // } // cerr << "]" << endl ; }