Как динамически создавать имена переменных? Или мне просто использовать словарь?

Я пишу программу на 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). Есть идеи?

2 ответа

Самый простой способ - создать класс контейнера, создать пустой экземпляр и добавить к нему атрибуты по мере необходимости:

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 существует также команда, подобная bitget, под Matlab, чтобы выделить, какие биты (игроки) принадлежат числу (коалиции) $27$ для $n=5$.

Для демонстрации, давайте вычислим значение Shapley для вышеуказанной игры $v$. Нам нужно только передать коалиционные значения в функцию ShapleyValue(), чтобы получить

>> sh_v=ShapleyValue(v)

sh_v =

      29.5833   44.5833   73.7500  102.0833

Более подробную информацию дает мой набор инструментов для теории игр Matlab, который можно найти здесь:

http://www.mathworks.com/matlabcentral/fileexchange/35933-mattugames

Другие вопросы по тегам