Как динамически создавать имена переменных? Или мне просто использовать словарь?
Я пишу программу на 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