场景描述:
一个由多个节点构成的流通系统,系统中存在能量的流动;如果这个系统是每个节点都是无损的,那么最终各个节点上的能量会稳定下来;稳定的状态由转移矩阵决定,与能量从哪个节点进行系统没有关系;(充分联通的系统)
然而很多系统是有损的;系统内的能量在通过某个节点时会变少;一个流通网络的流失特性也值得关注;
假设每个节点的能量每次都会按比例流失。
下面就是计算一定的能量在系统中的流出分布,这与能量的来源是有关的。也许有更好的办法,欢迎探讨。
# -*- coding: utf-8 -*-
import numpy as np
from random import random
#流通矩阵
trans_matrix = np.array(
[[0.5 , 0.1 , 0.25 , 0.05],
[0.15 , 0.5 , 0.2 , 0.05],
[0.1 , 0.2 , 0.5 , 0.4 ],
[0.25 , 0.2 , 0.05 , 0.5 ]])
#输入向量
input_array = np.array([[0, 100.0 , 0 , 0]]).T
#截止阈值
break_thresh = 0.0001
#总输入量
sum_input = sum(input_array)
#记录每个节点的消费比例,进入某节点的能量(数字),会被消耗掉一定的比例,下面为比例值
consume_array = np.array([[0.1 , 0.2 , 0.05 , 0.4]]).T
#记录各个节点的消费累积, 最终关心的东西
sum_consumed_array = np.array([[0.0 , 0 , 0 , 0]]).T
res = input_array
while True :
#先进行节点消费
#先计算每个节点消费多少
consumed_array = res*consume_array
#print 'res before convert'
#print res
#print 'consumed_array'
#print consumed_array
sum_consumed_array += consumed_array
#print 'sum_consumed_array'
#print sum_consumed_array
#减去被消费的
res -= consumed_array
#再进行流通转换
res = np.dot(trans_matrix , res)
#print 'res after convert'
#print res
sum_remain = sum(res)
#print sum_remain
#print sum(sum_consumed_array)
#如果剩下的微不足道了
if sum_remain < sum_input*break_thresh :
break
#得到的最终结果 , 可以看出输入的金币最终都从哪流出了系统
print sum_consumed_array