Конструктор класса - TypeError: объект 'int' не может быть подписан - PullRequest
0 голосов
/ 03 декабря 2018

Этот фрагмент кода является частью гораздо большего генетического алгоритма.Когда я запускаю его, я получаю TypeError: 'int' object is not subscriptable для строки agent.buy = agent.buy[i] + random.randint(0, in_prices_length).

. Я понимаю, что вы не можете взять индекс для простого целочисленного значения, но я запутался, потому что self.buy внутри Агентакласс инициализируется как список.Я не очень много работаю с объектно-ориентированным питоном, поэтому я уверен, что приукрашиваю что-то простое, я просто не могу его найти.

class Agent:

    def __init__(self, length):

        self.buy = [random.randint(0,length), random.randint(0,length)]
        self.fitness = -1

in_prices = None
in_prices_length = None
population = 20
generations = 100

def ga():

    agents = init_agents(population, in_prices_length)

    for generation in range(generations):

        print ('Generation: ' + str(generation))

        agents = fitness(agents)
        agents = selection(agents)
        agents = crossover(agents)
        agents = mutate(agents)

def init_agents(population, length):

    return [Agent(length) for _ in range(population)]

def mutate(agents):

    for agent in agents:

        for i in range(2):

            if random.uniform(0.0, 1.0) <= 0.1:

                agent.buy = agent.buy[i] + random.randint(0, in_prices_length)

    return agents

if __name__ == '__main__':


    raw = pd.read_csv('IBM.csv')
    in_prices = raw['close'].tolist()
    in_prices = list(reversed(in_prices))[0:300]
    in_prices_length = len(in_prices)
    ga()

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

В методе mutate() agent.buy определяется как сумма двух целых чисел.

Кроме того, это будет зависеть от исходных данных в вашем CSV-файле, которым присвоено значение «raw».».

0 голосов
/ 03 декабря 2018

Но это не список всегда , согласно вашему коду.Вы перебираете диапазон (0..1) и сбрасываете значение agent.buy в первой итерации в целое число.Во второй итерации вы снова пытаетесь получить доступ к buy в виде списка, но в предыдущей итерации для него задано целое число.

Я подозреваю, что вы хотите сделать:

agent.buy[i] = agent.buy[i] + random.randint(0, in_prices_length)

Но я не уверен, не зная алгоритм :).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...