Bordat2C核心算法

论坛 期权论坛 脚本     
匿名技术用户   2021-1-2 11:48   24   0
public void findConcepts()
 {
  findBottomConcept();
  findTopConcept();
  Hashtable<String, FormalConcept> conceptHash = new Hashtable<String, FormalConcept>();
  conceptHash.put(topConcept.getExtent().toString(), topConcept);
  LinkedList<FormalConcept> candidates = new LinkedList<FormalConcept>();
  candidates.addLast(topConcept);
  while (candidates.isEmpty() == false)
  {
   FormalConcept concept = candidates.getFirst();
   Vector<FormalConcept> lowerCover = getLowerCover(concept.getExtent(), concept.getIntent());
   for (int i = 0; i < lowerCover.size(); i++)
   {
    FormalConcept lowerConcept = lowerCover.elementAt(i);
    FormalConcept child = conceptHash.get(lowerConcept.getExtent().toString());
    if (child == null)
    {
     child = new FormalConcept(lowerConcept.getExtent(), lowerConcept.getIntent());
     conceptHash.put(child.getExtent().toString(), child);
     candidates.addLast(child);
    }
    if (!child.getIntent().equals(concept.getIntent()))
    {
     child.addParent(concept);
     concept.addChild(child);
    }
   }
   concepts.add(concept);
   candidates.removeFirst();
  }
 }

 public Vector<FormalConcept> getLowerCover(BasicSet extent, BasicSet intent)
 {
  Vector<FormalConcept> lowerCover = new Vector<FormalConcept>();
  BasicSet allAtts = (BasicSet) intent.clone();
  FormalConcept firstObj;
  Iterator<String> it = extent.iterator();
  while (allAtts.size() < attCount && (firstObj = getFirstObject(allAtts, it)) != null)// getFirstObject
  {// allAtts.size()<attCount && 是自己加的
   BasicSet objIntent = firstObj.getIntent();
   BasicSet objExtent = firstObj.getExtent();
   while (it.hasNext()) // 遍历完当前的外延中的所有对象extent 减去 getFirstObject遍历的对象extent1即extent-extent1
   {// 刚开始遍历时,形成的概念的外延集比较大,所以内涵就小, 随后外延“小些” 内涵“大些”
    FormalConcept nextObj = (getNextObject(it));// getNextObject
    BasicSet tempIntent = nextObj.getIntent().intersection(objIntent);// 已经遍历的几个对象共同具有的内涵tempIntent
    if (!(allAtts.containsAll(tempIntent))) // tempIntent中有新属性j,j不属于父概念的内涵
    {
     // 则新概念的外延(初始为firstObj的外延)加入当前对象。
     // 新概念的内涵(初始为firstObj的内涵)赋值为:当前内涵和之前内涵的交集。
     objExtent = objExtent.union(nextObj.getExtent());
     objIntent = tempIntent;
    }
   }
   if (objIntent.intersection(allAtts).equals(intent)) // 新的内涵包含父内涵,而且由于allAtts包含父内涵,所以除去allAtts新增属性前的情况
    lowerCover.add(new FormalConcept(objExtent, objIntent));// objIntent都相比allAtts有新属性加入=》是新概念
   allAtts = allAtts.union(objIntent);// allAtts增加了上面概念新增的属性
   it = extent.iterator();// 将迭代器it恢复初始值
  }
  // Add the bottom concept to the lower cover
  if ((lowerCover.size() == 0) && (intent.size() != attCount)) // 马上最后一层,且内涵还没有满
   lowerCover.add(bottomConcept);
  return lowerCover;
 }

 private FormalConcept getFirstObject(BasicSet intent, Iterator<String> it)
 {
  while (it.hasNext())
  {
   String currObj = it.next();
   int numObj = (objects.get(currObj)).intValue();
   FormalConcept first = initialConcepts.elementAt(numObj);
   if (!intent.containsAll(first.getIntent()))
    return new FormalConcept((BasicSet) first.getExtent().clone(), (BasicSet) first.getIntent().clone());
  }
  return null;
 }

 private FormalConcept getNextObject(Iterator<String> it)
 {
  if (it.hasNext())
  {
   String nextObject = it.next();
   int numObj = (objects.get(nextObject)).intValue();
   FormalConcept concept = initialConcepts.elementAt(numObj);
   return new FormalConcept((BasicSet) concept.getExtent().clone(), (BasicSet) concept.getIntent().clone());
  }
  return null;
 }

 public Vector<FormalConcept> getConcepts()
 {
  return concepts;
 }

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP