python 2d数组条件

时间:2014-10-29 16:15:43

标签: python python-3.4

我正在使用python 3.4进行8皇后(遗传算法)程序 我使用矩阵来保持女王的位置。但我在sort()函数中有一个错误,我没有不知所措和这个错误。 请帮我 ... 我的代码:

from random import randrange

__author__ = 'Moein'


class NQueen:
    NUM_COLS = 8
    POPULATIONS = 100

    current = [[]]

    def __init__(self):
        self.current = [[0 for col in range(self.NUM_COLS + 1)] for row in range(self.POPULATIONS)]

        # generate first Generation
        for i in range(0, self.POPULATIONS):
            for j in range(0, self.NUM_COLS):
                self.current[i][j] = randrange(self.NUM_COLS)

        count = 0
        condition = True

        while condition:
            self.crossover()
            self.mutation()
            self.fitness()
            self.sort()
            count += 1
            print(self.current)
            # print(self.current[0])
            if self.current[0][self.NUM_COLS] == 0:
                condition = False

        print(self.current[0])
        pass

    def fitness(self):
        count = 0

        for i in range(0, self.POPULATIONS):
            for j in range(0, self.NUM_COLS):
                for x in range(j + 1, self.NUM_COLS):
                    if self.current[i][j] == self.current[i][x]:
                        count += 1
                    if abs(j - x) == abs(self.current[i][j] - self.current[i][x]):
                        count += 1
            self.current[i][self.NUM_COLS] = count
            count = 0
        pass

    def sort(self):
        for i in range(0, self.POPULATIONS - 1):
            for j in range(i + 1, self.POPULATIONS):
                if self.current[i][self.NUM_COLS] > self.current[j][self.NUM_COLS]:
                    for x in range(0, self.NUM_COLS + 1):
                        temp = self.current[i][x]
                        self.current[i][x] = self.current
                        self.current[j][x] = temp
        pass

    def crossover(self):
        _new = [[0 for x in range(self.NUM_COLS + 1)] for x in range(self.POPULATIONS)]

        for i in range(0, int(self.POPULATIONS / 2)):
            for j in range(0, int(self.NUM_COLS / 2)):
                _new[i + 49][j] = self.current[i][j]
                _new[i + 49 + 1][j] = self.current[i + 1][j]

            for j in range(int(self.NUM_COLS / 2), self.NUM_COLS):
                _new[i + 49][j] = self.current[i][j]
                _new[i + 49 + 1][j] = self.current[i + 1][j]
        self.current = _new
        pass

    def mutation(self):
        for i in range(0, self.POPULATIONS):
            self.current[i][randrange(self.NUM_COLS)] = randrange(self.NUM_COLS)
        pass


nQueen = NQueen()
print(nQueen.current[0])

和我的错误:

Traceback (most recent call last):
  File "C:/Users/Moein/PycharmProjects/NQueen/project.py", line 81, in <module>
    nQueen = NQueen()
  File "C:/Users/Moein/PycharmProjects/NQueen/project.py", line 27, in __init__
    self.sort()
  File "C:/Users/Moein/PycharmProjects/NQueen/project.py", line 54, in sort
    if self.current[i][self.NUM_COLS] > self.current[j][self.NUM_COLS]:
TypeError: unorderable types: list() > int()

1 个答案:

答案 0 :(得分:3)

self.current[i][x] = self.current

我猜它的这一行引起了这个问题,因为

self.current

是一个列表,因此您正在设置

self.current[i][x]

是一个列表而不是一个int。所以在这一点上:

if self.current[i][self.NUM_COLS] > self.current[j][self.NUM_COLS]:

当您尝试比较可能发生的那些值时,您进行比较 带有列表的int,导致错误。

TypeError: unorderable types: list() > int()

干杯

修改

我刚试了一下。 替换

self.current

使用int例如 2 可防止发生异常。