From ca60dffe5375e3acce901383b85d867b4d730a63 Mon Sep 17 00:00:00 2001 From: "dmy@lab" Date: Tue, 20 Jan 2015 22:46:26 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=A9=E5=87=8F=E5=85=83=E4=BB=B6=E8=BF=98?= =?UTF-8?q?=E6=B2=A1=E6=88=90=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: dmy@lab --- testHasttable/cimexporter.cpp | 22 ++++++++++++++ testHasttable/cimexporter.h | 1 + testHasttable/element/commontype.h | 2 ++ testHasttable/elementreduction.cpp | 46 ++++++++++++++++++++++++++---- testHasttable/elementreduction.h | 9 ++++-- 5 files changed, 72 insertions(+), 8 deletions(-) diff --git a/testHasttable/cimexporter.cpp b/testHasttable/cimexporter.cpp index fff9089..226aab2 100644 --- a/testHasttable/cimexporter.cpp +++ b/testHasttable/cimexporter.cpp @@ -11,6 +11,8 @@ void CIMExporter::add(const QPair& fromTo,Line* line) lineStru.fromID=fromTo.first; lineStru.toID=fromTo.second; lineStru.id=line->ac->getID(); + lineStru.isZeroBranch=false; + lineStru.dispose=false; this->line.push_back(lineStru); } @@ -21,6 +23,8 @@ void CIMExporter::add(const QPair& fromTo,Switch* sw) switchStru.fromID=fromTo.first; switchStru.toID=fromTo.second; switchStru.id=sw->id; + switchStru.isZeroBranch=true; + switchStru.dispose=false; this->sw.push_back(switchStru); } void CIMExporter::add(const QPair& fromTo,Transformer* tf) @@ -29,6 +33,8 @@ void CIMExporter::add(const QPair& fromTo,Transformer* tf) tfStru.tf=tf; tfStru.fromID=fromTo.first; tfStru.toID=fromTo.second; + tfStru.isZeroBranch=false; + tfStru.dispose=false; this->tf.push_back(tfStru); } @@ -41,6 +47,22 @@ void CIMExporter::exportTo(const QString& path) QFile fd(path); if(fd.open(QFile::WriteOnly)) { + //消减元件 + QList elements; + for(int i=0;iline.length();i++) + { + elements.push_back( &(this->line[i]) ); + } + for(int i=0;isw.length();i++) + { + elements.push_back( &(this->sw[i]) ); + } + for(int i=0;itf.length();i++) + { + elements.push_back( &(this->tf[i]) ); + } + ElementReduction elementReduction(elements); + elementReduction.doIt(); //先给所有节点都编号 this->idToNumber(this->line); this->idToNumber(this->sw); diff --git a/testHasttable/cimexporter.h b/testHasttable/cimexporter.h index 08f6ea8..1607a84 100644 --- a/testHasttable/cimexporter.h +++ b/testHasttable/cimexporter.h @@ -19,6 +19,7 @@ #include "loadinfo.h" #include #include "topologytest.h" +#include "elementreduction.h" //#include "elementhashtable.h" //class Substation; class CIMExporter diff --git a/testHasttable/element/commontype.h b/testHasttable/element/commontype.h index 6d80c82..c493b78 100644 --- a/testHasttable/element/commontype.h +++ b/testHasttable/element/commontype.h @@ -12,6 +12,8 @@ struct BranchStruc int fromNum; int toNum; QString id;//后面有用的 + bool isZeroBranch; + bool dispose;//是否丢弃 }; struct LineStru:public BranchStruc { diff --git a/testHasttable/elementreduction.cpp b/testHasttable/elementreduction.cpp index af45e1e..a9d4b72 100644 --- a/testHasttable/elementreduction.cpp +++ b/testHasttable/elementreduction.cpp @@ -1,6 +1,6 @@ #include "elementreduction.h" - -ElementReduction::ElementReduction(const QList &branchList):branchList(branchList) +#include +ElementReduction::ElementReduction(const QList &branchList):branchList(branchList) { } @@ -12,11 +12,45 @@ ElementReduction::~ElementReduction() void ElementReduction::doIt() { - //先重新编号 - int add=0; - foreach(Branch *v,this->branchList) + QHash > linkage; + //先记录元件之间的连接关系 + foreach(BranchStruc* v,this->branchList) { - v->id=add++; + std::cout<id.toStdString()<fromID].push_back(v); + linkage[v->toID].push_back(v); + } + this->visit(this->branchList.last(),linkage); +} + +void ElementReduction::visit(BranchStruc* branch,QHash >& linkage) +{ + std::cout<<"visit "<id.toStdString()<visited.contains(branch->id)) + return; + this->visited[branch->id]=0; + QString next; + next=branch->toID; + QVector nextVec; + nextVec=linkage[next]; + foreach(BranchStruc* v,nextVec) + { + if(v->dispose) + continue;//丢弃的元件 + if(v->isZeroBranch)//是0阻抗 + { + //进行合并 + std::cout<<"merge "<id.toStdString()<toID=v->toID; + v->dispose=true; + foreach(BranchStruc* change,linkage[branch->toID]) + { + if(change->id==branch->id) + continue; + change->fromID=branch->toID; + } + } + this->visit(branch,linkage);//深度优先 } } diff --git a/testHasttable/elementreduction.h b/testHasttable/elementreduction.h index 37bb098..42768fc 100644 --- a/testHasttable/elementreduction.h +++ b/testHasttable/elementreduction.h @@ -2,16 +2,21 @@ #define ELEMENTREDUCTION_H #include +#include +#include +#include #include "element/commontype.h" //把电阻等于0的元件都去掉 class ElementReduction { public: - explicit ElementReduction(const QList& branchList); + explicit ElementReduction(const QList& branchList); void doIt(); ~ElementReduction(); private: - const QList& branchList; + void visit(BranchStruc* branch, QHash > &linkage); + const QList& branchList; + QHash visited; }; #endif // ELEMENTREDUCTION_H