已知问题
1.同一个父节点的策略组合的情况下,如果出现了判断博弈人的得益时出现了多个得益中对应位置的值均相等的情况,自动取其中一个得益作为父节点的最佳得益。
2.没有考虑如下情况:第一个参与人X有多个选择时,若选择了A作为策略时,则下一个博弈人为Y;若选择了B作为策略时,则下一个博弈人为Z。
没有博弈树的绘制。
实验代码
import re
import itertools
import numpy as np
Order = input('输入参与博弈的多个参与人进行决策的顺序(以逗号分隔):') # 输入参与人的决策次序
Order = re.split('[,,]', Order) # 按逗号分开
Players = [] # 参加博弈的参与人列表
for item in Order: # 遍历决策次序集
if item not in Players: # 将参与人的名称不重复地加入到参与人列表中
Players.append(item)
print('参与博弈的参与人:', Players) # 输出所有参与人
print('博弈的决策的顺序:', Order) # 输出参与人的决策顺序
DecisionSet = [] # 总策略集
DecisionCount = [] # 各参与人的决策个数列表
for i in Order: # 按照决策次序,输入各参与人的策略并形成策略集
SubDecisionSet = input('参与人 {0} 的策略(以逗号分隔):'.format(i)) # 参与人i的策略
SubDecisionSet = re.split('[,,]', SubDecisionSet) # 按逗号分开
DecisionSet.append(SubDecisionSet) # 将各参与人的策略集加入到总策略集中
DecisionCount.append(len(SubDecisionSet)) # 将各参与人的决策个数加入到决策个数列表中
TDSets = list(itertools.product(*DecisionSet, repeat=1)) # 将各策略集中的策略进行排列组合
TreeDecisionSet = [] # 策略组合集
for item in TDSets: # 将排列组合完成的策略数据格式转化为列表
TreeDecisionSet.append(list(item))
print('生成的博弈树中所有的策略组合:')
for i in range(len(TreeDecisionSet)): # 输出带编号的所有策略组合
print(i + 1, TreeDecisionSet[i])
def Copy(List):
NewList = []
for item in List:
NewList.append(item)
return NewList
def DeleteDecision(DataSet, IndexSet):
# 读取
InnerDataSet = Copy(DataSet)
DelDecSet = [] # 待删除策略的集合
DelDecIndexSet = [] # 待删除策略的位置
for i in range(len(InnerDataSet)):
if i + 1 in IndexSet: # 删除序号在总策略序号集中
del InnerDataSet[i][-1] # 将待删除策略的最后一个策略删除,作为删除项的标记
DelDecSet.append(InnerDataSet[i]) # 将待删除策略加入删除策略集合
Del