//计算覆盖所有最小项的最小质蕴涵集,从非必要质蕴涵中选取覆盖面最大的加入解集
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;
}
Esempio n. 2
0
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 ;



}