Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何动态创建变量名?还是干脆用字典?_Python_Game Theory - Fatal编程技术网

Python 如何动态创建变量名?还是干脆用字典?

Python 如何动态创建变量名?还是干脆用字典?,python,game-theory,Python,Game Theory,我正在用python编写一个程序,将游戏从特征形式转换为标准形式。我已经读过一些类似问题的答案:大多数人说最好使用字典。但我认为如果你想给钥匙起个具体的名字,问题仍然存在 假设我想为有三名玩家的游戏建立一个程序,这很简单: v1 = int(raw_input("How much is worth the coalition v(1)?")) v2 = int(raw_input("How much is worth the coalition v(2)?")) v3 = int(raw_inp

我正在用python编写一个程序,将游戏从特征形式转换为标准形式。我已经读过一些类似问题的答案:大多数人说最好使用字典。但我认为如果你想给钥匙起个具体的名字,问题仍然存在

假设我想为有三名玩家的游戏建立一个程序,这很简单:

v1 = int(raw_input("How much is worth the coalition v(1)?"))
v2 = int(raw_input("How much is worth the coalition v(2)?"))
v3 = int(raw_input("How much is worth the coalition v(3)?"))
v12 = int(raw_input("How much is worth the coalition v(1,2)?"))
v13 = int(raw_input("How much is worth the coalition v(1,3)?"))
v23 = int(raw_input("How much is worth the coalition v(2,3)?"))
v123 = int(raw_input("How much is worth the coalition v(1,2,3)?"))
# and then I continue with the program
但是如果我想建立一个有n个玩家的游戏程序。。。
当然,我可以构建一个字典,但我仍然不知道如何按照我想要的方式调用每个键(v1、v2、v3、…、v123..n)。有什么想法吗

简单的方法是拥有一个容器类,创建一个空实例,并根据需要向其添加属性:

class MyContainer(object):
    pass

my_container = MyContainer()
my_container.first_var = 1
my_container.next_var = "Hello"
...
但当然有更好的方法,这取决于您的应用程序。 对于Python3,可以/应该省略对象基类

如果您想动态创建变量名(无论此处是否需要),您可以使用:

setattr(my_container, "a_string_with_the_name_of_the_attribute", "the value")

我不是Python方面的专家,但我认为您还应该通过其唯一的整数表示来表示每个联盟$S$,即$\sum{I\in S}\,2^{I-1}$。例如,联盟$S={3,4}$由$2^{3-1}+2^{4-1}=4+8=12$表示,而联盟$S={2,3,4}$由$2^{2-1}+2^{3-1}+2^{4-1}=2+4+8=14$表示。在Matlab中,四人TU游戏的所有联盟都可以通过

N=2^n-1;
S=1:N
而$n=4$,而$n$是大联盟${1,2,3,4}$。这意味着您只需要通过如下数组指定联合值

v = [0     0     5     0     0     0    40     0    10    40   100   100   160   190   250];
当然,联盟顺序与你的方法不同。要看到这一点,请注意,联盟$S={1,2}$位于$3$位置,其值为$5$($v({1,2})=5$),联盟$S={3}$位于$4$位置,其值为零($v({3})=0$)。我猜在Python下也存在一个类似Matlab下的bitget的命令,用于挑出哪些位(玩家)属于数字(联盟)$27$for$n=5$

为了演示,让我们计算上述游戏$v$的Shapley值。我们只需将联合值传递给函数ShapleyValue()即可获得

我的Matlab博弈论工具箱提供了更多详细信息,可在此处找到:


什么?我希望我能就此结束,但我还有10个字要写;你想要一本字典。是的,你应该使用字典,或者可能是一个类,但可能是一本字典。对不起,在结束之前我按了enter键。现在我已经完成了编辑,不清楚哪个变量分配给哪个玩家。通常每个玩家都有一个对象,封装所有相关数据。您至少应该重命名上面的变量,这样就可以看到哪个变量属于哪个玩家。是的,那可能有点打字,但需要适当帮助的是你,对吗?你应该把问题弄清楚。对不起,在结束之前我无意中按了回车键。请重新阅读,因为我认为该代码无法解决我的问题
>> sh_v=ShapleyValue(v)

sh_v =

      29.5833   44.5833   73.7500  102.0833