博弈优化找到极小节点覆盖(智能控制3.2)
文章图片
博弈论2-1.png
文章图片
博弈论2-2.png
文章图片
博弈论2-3.png
文章图片
博弈论2-4.png
文章图片
博弈论2-5.png 【博弈优化找到极小节点覆盖(智能控制3.2)】main.py
import random# 收益矩阵
r=0.02
interest={
'C':{'C':(1,1),'D':(1-r,1+r)},
'D':{'C':(1+r,1-r),'D':(0,0)}
}
# 结点数据结构
class Node(object):
def __init__(self):
if (random.random()<0.5):
self.state='C'
else:
self.state='D'
self.value=https://www.it610.com/article/0
self.all_value=0
self.neighbour_number=0
self.nb=list()
pass
passclass Network(object):def __init__(self,n):
self.numbers=n
self.nodes=list()
self.edges=list()
self.generateNode()# 生成n个结点
def generateNode(self):
for i in range(self.numbers):
tmp_node = Node()
self.nodes.append(tmp_node)
def addEgde(self,es):
for e in es:
self.edges.append(e)
# 保存结点的邻居
def saveNb(self):
for a, b in self.edges:
a.nb.append(self.nodes.index(b))
b.nb.append(self.nodes.index(a))
for i in range(self.numbers):
self.nodes[i].neighbour_number=len(self.nodes[i].nb)
# 计算每个结点的平均收益
def calValue(self):
for i in range(self.numbers):
self.nodes[i].all_value=0
for a, b in self.edges:
a.all_value+=interest[a.state][b.state][0]
b.all_value+=interest[a.state][b.state][1]
for i in range(self.numbers):
self.nodes[i].value=self.nodes[i].all_value/self.nodes[i].neighbour_number
# 最优邻居法更新状态
# def updateState(self):
#for i in range(self.numbers):
#max_value=self.nodes[i].value
#for j in range(self.nodes[i].neighbour_number):
#if(self.nodes[self.nodes[i].nb[j]].value>max_value):
#self.nodes[i].state=self.nodes[self.nodes[i].nb[j]].state
#max_value=https://www.it610.com/article/self.nodes[self.nodes[i].nb[j]].value
# 逐项扫描反转试探法更新状态
def updateState(self):
for i in range(self.numbers):
if(self.nodes[i].state=='C'):
reward1=self.getReward(i)
self.nodes[i].state='D'
reward2=self.getReward(i)
if(reward2<=reward1):
self.nodes[i].state = 'C'
elif(self.nodes[i].state=='D'):
reward1=self.getReward(i)
self.nodes[i].state='C'
reward2=self.getReward(i)
if(reward2<=reward1):
self.nodes[i].state = 'D'
# 计算单个结点的收益
def getReward(self,i):
all_value=https://www.it610.com/article/0
for s inself.nodes[i].nb:
all_value+=interest[self.nodes[i].state][self.nodes[s].state][0]
value = all_value / self.nodes[i].neighbour_number
return value
# 获得总收益
def getAllReward(self):
self.reward = 0
for a, b in self.edges:
self.reward+=sum(interest[a.state][b.state])
return self.rewarddef outputState(self):
print('----------------')
for i in range(self.numbers):
print('%d:%c %f ' % (i,self.nodes[i].state,self.nodes[i].value))
print(self.reward)
print('----------------')if __name__ == '__main__':
# 问题1
def designNet1():
net = Network(6)
edge_list = [
(0,1),(0,2),
(1,3),
(2,3),
(3,4),(3,5),
(4,5)
]
net.addEgde(({net.nodes[a], net.nodes[b]} for a, b in edge_list))
return net
# ######################################
# 问题2
def designNet2():
net=Network(10)
edge_list=[(0,1),(0,2),(0,3),
(1,5),(1,2),
(3,4),
(4,5),(4,7),
(5,6),
(6,8),
(7,8),(7,9)
]net.addEgde(
({net.nodes[a], net.nodes[b]} for a, b in edge_list))
return net
pass
mynet=designNet2()
# print(mynet.edges)
mynet.saveNb()
max_reward=0# i=0
# max_reward保持3次才输出
i1=0
while True:
reward=mynet.getAllReward()# print(reward)
# mynet.outputState()
if(max_reward==reward):
i1+=1
if(i1==3):
mynet.calValue()
mynet.outputState()
break
elif(reward>max_reward):
i1=0
max_reward=reward
mynet.updateState()
推荐阅读
- 数据库设计与优化
- 霍兰德职业代码对照表
- 繁华声遁入空门
- Improve|Improve Nested Conditionals(优化嵌套的条件语句) 面对大量的if-else语句
- 首屏时间,你说你优化了,那你倒是计算出给给我看啊!
- 数据库|SQL行转列方式优化查询性能实践
- 愿你我找到心中所爱
- #12-UITableView|#12-UITableView 优化方案
- 2018-10-27脱单攻略|2018-10-27脱单攻略 | 如何找到心仪的另一半
- 插件化无法获取或找到.so文件