现在的位置: 首页 > 综合 > 正文

帖一个PageRank算法的程序

2013年12月03日 ⁄ 综合 ⁄ 共 1007字 ⁄ 字号 评论关闭
bool GraphList::CalPageRank() {
    this->pageRank = new float[this->numVertex + 1];
    float *prTmp = new float[this->numVertex + 1];
    if(!this->pageRank || !prTmp) {
        cerr << "GraphList::CalPageRank: memory alocate error!" << endl;
        return false;
    }
    for(int i = 0; i < this->numVertex; i ++) {
        this->pageRank[i] = 1.0f;
    }

    map<int,int> id2index;
    for(int i = 0; i < this->numVertex; i ++) {
        id2index[this->graList[i].vertexId] = i;
    }

    for(int iTimes = 0; iTimes < PAGERANKTIMES; iTimes ++) { //迭代30次(可改)
        for(int i = 0; i < this->numVertex; i ++) {
            prTmp[i] = 0.0f;
        }
        for(int i = 0; i < this->numVertex; i ++) {
            int eCount = 0;
            for(Edge e = FirstEdge(graList[i].vertexId); e.to >= 0; e = NextEdge(e)) {
                if(e.from != e.to) { //不考虑自己到自己的边
                    eCount ++;
                }
            }
            if(!eCount) {
                continue;
            }
            for(Edge e = FirstEdge(graList[i].vertexId); e.to >= 0; e = NextEdge(e)) {
                if(e.from != e.to) {
                    prTmp[id2index[e.to]] += pageRank[i] / (float)eCount;
                }
            }
        }
        for(int i = 0; i < this->numVertex; i ++) {
            this->pageRank[i] = (1 - PRDAMPINGFACTOR) + PRDAMPINGFACTOR * prTmp[i];
        }
        cout << "第" << iTimes << "次:" << endl;
        for(int i = 0; i < this->numVertex; i ++){
            cout << i << ": " << pageRank[i] << endl;
        }
    }
    delete []prTmp;
    prTmp = NULL;
    return true;
}

抱歉!评论已关闭.