有向图实现(类似PageRank)

class Node:
    def __init__(self,name):
        self.name = name
        self.input = []
        self.output = []
        self.weight = 0
        self.flag = True

    def addinput(self,inputitem):
        self.input.append(inputitem)

    def removeinput(self,removeitem):
        for item in self.input:
            if item == removeitem:
                self.input.remove(item)

    def addoutput(self,outputitem):
        self.output.append(outputitem)

    def removeoutput(self,removeitem):
        for item in self.output:
            if item == removeitem:
                self.output.remove(item)

def PageRank(NodeList):
    for Node in NodeList:
        if len(Node.input) == 0:
            Node.weight = 1
    for index in range(len(NodeList)):
        for Node in NodeList:
            if len(Node.input) == 0 and Node.flag:
                if len(Node.output) > 0:
                    addweight = Node.weight / len(Node.output)
                    for addNode in Node.output:
                        for findNode in NodeList:
                            if addNode == findNode.name:
                                findNode.weight += addweight
                                findNode.removeinput(Node.name)
                                Node.removeoutput(findNode)
                Node.flag = False
    printNodeList(NodeList)

def printNodeList(NodeList):
    for Node in NodeList:
        print('{}==={}'.format(Node.name,Node.weight))

if __name__ == '__main__':

    one = Node('one')
    one.addinput('seven')
    one.addinput('three')
    # one.addoutput('')

    two = Node('two')
    two.addinput('six')
    two.addinput('nine')
    two.addoutput('three')

    three = Node('three')
    three.addinput('two')
    three.addinput('four')
    three.addoutput('one')

    four = Node('four')
    four.addinput('five')
    four.addoutput('three')

    five = Node('five')
    five.addinput('nine')
    five.addinput('ten')
    five.addoutput('four')

    six = Node('six')
    six.addinput('seven')
    six.addoutput('two')

    seven = Node('seven')
    seven.addinput('eight')
    seven.addoutput('six')
    seven.addoutput('one')

    eight = Node('eight')
    # eight.addinput('')
    eight.addoutput('seven')

    nine = Node('nine')
    # nine.addinput('')
    nine.addoutput('two')
    nine.addoutput('five')

    ten = Node('ten')
    # ten.addinput('')
    ten.addoutput('five')

    NodeList = []
    NodeList.append(one)
    NodeList.append(two)
    NodeList.append(three)
    NodeList.append(four)
    NodeList.append(five)
    NodeList.append(six)
    NodeList.append(seven)
    NodeList.append(eight)
    NodeList.append(ten)
    NodeList.append(nine)

    PageRank(NodeList)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值