Bordat2C核心算法

    xiaoxiao2021-03-25  115

    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; }
    转载请注明原文地址: https://ju.6miu.com/read-10552.html

    最新回复(0)