from itertools import permutations # 定义获利函数 def v(S): if len(S) == 1: return 10 elif len(S) == 2: if 1 in S and 2 in S: return 70 elif 1 in S and 3 in S: return 50 elif 2 in S and 3 in S: return 40 elif len(S) == 3: return 100 # 计算Shapley值 def shapley_value(n, v): phi = [0] * n for i in range(n): for j in range(n): if i != j: # 生成所有子集 coalition = set(range(n)) - {i, j} for k in range(1, len(coalition)+1): for subset in permutations(coalition, k): # 计算新增加成员对联盟的贡献 v1 = v(subset + (i,)) v2 = v(subset + (j,)) phi[i] += (v1 - v2) / (n * (n-1)) return phi # 输入与调用,输出Shapley值 n = 3 phi = shapley_value(n, v) print(phi)
时间: 2023-06-23 20:08:15 浏览: 93
这段代码实现了Shapley值的计算,是一种衡量合作博弈中每个玩家对博弈的贡献的方法。其中,v(S)表示联盟S的获利函数,shapley_value(n,v)计算n个玩家的Shapley值,返回一个长度为n的列表phi,phi[i]表示第i个玩家的Shapley值。
具体实现中,使用了itertools模块的permutations函数来生成所有子集,然后计算新增加成员对联盟的贡献,并累加到每个玩家的Shapley值中。
这段代码可以用于计算任意合作博弈的Shapley值,只需要将获利函数v(S)替换为相应的函数即可。
相关问题
二、基本要求 1、设计函数找出六位数中所有的一数三平方数。2、设计函数求出100以内的二维基本勾股数组。 3、设计函数求四位的卡普列加数。 4、设计函数验证某正整数满足四个平方数和。 5、设计函数将0,1,2,3,4,5,6,7,8,9这十个数字组成一个一位数,一个两位数,一个三位数,一个四位数,使他们恰恰都是完全平方数,并按照三角形排列。 6、设计菜单函数,调用相关功能模块。
以下是对应的函数实现:
1、找出六位数中所有的一数三平方数
```python
def find_square_number():
for i in range(100000, 1000000):
count = 0
for j in range(1, int(i ** 0.5) + 1):
if i % j == 0:
if j == i // j:
count += 1
else:
count += 2
if count == 4:
print(i)
```
2、求出100以内的二维基本勾股数组
```python
def find_gougu_number():
for i in range(1, 101):
for j in range(i, 101):
for k in range(j, 101):
if i ** 2 + j ** 2 == k ** 2:
print(i, j, k)
```
3、求四位的卡普列加数
```python
def kaprekar_number():
for i in range(1000, 10000):
num = str(i)
num_square = str(i ** 2)
for j in range(1, len(num)):
left = int(num_square[:j])
right = int(num_square[j:])
if left + right == i and right != 0:
print(i)
```
4、验证某正整数满足四个平方数和
```python
def verify_square_number(num):
for i in range(int(num ** 0.5) + 1):
for j in range(int(num ** 0.5) + 1):
for k in range(int(num ** 0.5) + 1):
for l in range(int(num ** 0.5) + 1):
if i ** 2 + j ** 2 + k ** 2 + l ** 2 == num:
return True
return False
```
5、将0,1,2,3,4,5,6,7,8,9这十个数字组成一个一位数,一个两位数,一个三位数,一个四位数,使他们恰恰都是完全平方数,并按照三角形排列
```python
import itertools
def perfect_square():
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for p in itertools.permutations(nums):
a = p[0]
b = p[1] * 10 + p[2]
c = p[3] * 100 + p[4] * 10 + p[5]
d = p[6] * 1000 + p[7] * 100 + p[8] * 10 + p[9]
if int(a ** 0.5) ** 2 == a and int(b ** 0.5) ** 2 == b and int(c ** 0.5) ** 2 == c and int(d ** 0.5) ** 2 == d:
print(a)
print(b, c)
print(d)
```
6、设计菜单函数,调用相关功能模块
```python
def menu():
while True:
print("1. 找出六位数中所有的一数三平方数")
print("2. 求出100以内的二维基本勾股数组")
print("3. 求四位的卡普列加数")
print("4. 验证某正整数满足四个平方数和")
print("5. 将0,1,2,3,4,5,6,7,8,9这十个数字组成一个一位数,一个两位数,一个三位数,一个四位数,使他们恰恰都是完全平方数,并按照三角形排列")
print("0. 退出")
choice = input("请输入选项:")
if choice == '1':
find_square_number()
elif choice == '2':
find_gougu_number()
elif choice == '3':
kaprekar_number()
elif choice == '4':
num = int(input("请输入正整数:"))
if verify_square_number(num):
print("该正整数满足四个平方数和")
else:
print("该正整数不满足四个平方数和")
elif choice == '5':
perfect_square()
elif choice == '0':
break
else:
print("输入错误,请重新输入!")
```
以上代码可以组成一个完整的程序,供用户选择不同的功能。
阅读全文