зацикливание, пока количество ячеек не изменилось очень мало - PullRequest
0 голосов
/ 20 февраля 2012

Это репост, потому что я получаю странные результаты. Я пытаюсь запустить цикл моделирования для ячеек, которые изменяются в коде сотового автомата, который изменяет коды землепользования на основе их соседних соседей. Я импортирую текстовые файлы, которые создают идентификатор ячейки ключ = значение кода землепользования. Я также импортирую текстовый файл с соседними соседями каждой ячейки. В первый раз, когда я запустил код, 7509 ячеек изменили землепользование в зависимости от использования земли соседними соседями. Я могу закомментировать чтение текстового файла словаря и запустить его снова, затем изменилось около 5000 ячеек. Запустите его снова, затем еще меньше и так далее. То, что я хотел бы сделать, это запустить это в цикле, пока только 0,0001 от общего числа ячеек не изменится, после этого разорвать цикл.

Я пробовал цикл времени, но он не дает мне результатов, которые я ищу. После первого запуска счет верен на уровне 7509. После этого счет снова равен 28 476. Я не понимаю, почему это происходит, потому что счет должен вернуться к нулю. Может кто-нибудь сказать мне, что я делаю не так? Вот код:

import sys, string, csv

#Creating a dictionary of FID: LU_Codes from external txt file
text_file = open("H:\SWAT\NC\FID_Whole_Copy.txt", "rb")
#Lines = text_file.readlines()
FID_GC_dict =  dict()
reader = csv.reader(text_file, delimiter='\t')
for line in reader:
    FID_GC_dict[line[0]] = int(line[1])
text_file.close()

#Importing neighbor list file for each FID value
Neighbors_file = open("H:\SWAT\NC\Pro_NL_Copy.txt","rb")
Entries = Neighbors_file.readlines()
Neighbors_file.close()

Neighbors_List = map(string.split, Entries)

#print Neighbors_List

#creates a list of the current FID
FID = [x[0] for x in Neighbors_List]

gridList = []
for nlist in Neighbors_List:
    row = []
    for item in nlist:
        row.append(FID_GC_dict[item])
    gridList.append(row)
#print gridList

#Calculate when to end of one sweep
tot_cells = len(FID)
end_sim = tot_cells
p = 0.0001
#Performs cellular automata rules on land use grid codes
while (end_sim > tot_cells*p):
    i = iter(FID)
    count = 0
    for glist in gridList:
        Cur_FID = i.next()
        Cur_GC = glist[0]
        glist.sort()
        lr_Value = glist[-1]
        if lr_Value < 6:
            tie_LR = glist.count(lr_Value)
            if tie_LR >= 4 and lr_Value > Cur_GC:
                FID_GC_dict[Cur_FID] = lr_Value
                #print "The updated gridcode for FID ", Cur_FID, "is ", FID_GC_dict[Cur_FID]
                count += 1
    end_sim = count
    print end_sim

Спасибо за любую помощь .... еще раз! (

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

Я исправил код так, чтобы моделирование прекращалось после того, как количество измененных ячеек составило менее 0,0001 от общего числа ячеек.Я поставил цикл while в неправильном месте.Если кому-то интересно, вот пересмотренный код для использования сотовых автоматов на земле.

import sys, string, csv

#Creating a dictionary of FID: LU_Codes from external txt file
text_file = open("H:\SWAT\NC\FID_Whole_Copy.txt", "rb")
#Lines = text_file.readlines()
FID_GC_dict =  dict()
reader = csv.reader(text_file, delimiter='\t')
for line in reader:
    FID_GC_dict[line[0]] = int(line[1])
text_file.close()

#Importing neighbor list file for each FID value
Neighbors_file = open("H:\SWAT\NC\Pro_NL_Copy.txt","rb")
Entries = Neighbors_file.readlines()
Neighbors_file.close()
Neighbors_List = map(string.split, Entries)
#print Neighbors_List

#creates a list of the current FID
FID = [x[0] for x in Neighbors_List]
#print FID

#Calculate when to end the simulations (neglible change in land use)
tot_cells = len(FID)
end_sim = tot_cells
p = 0.0001

#Performs cellular automata rules on land use grid codes
while (end_sim > tot_cells*p):
    gridList = []
    for nlist in Neighbors_List:
        row = []
        for item in nlist:
            row.append(FID_GC_dict[item])
        gridList.append(row)
    #print gridList

    i = iter(FID)
    count = 0
    for glist in gridList:
        Cur_FID = i.next()
        Cur_GC = glist[0]
        glist.sort()
        lr_Value = glist[-1]
        if lr_Value < 6:
            tie_LR = glist.count(lr_Value)
            if tie_LR >= 4 and lr_Value > Cur_GC:
                FID_GC_dict[Cur_FID] = lr_Value
                print "The updated gridcode for FID ", Cur_FID, "is ", FID_GC_dict[Cur_FID]
                count += 1
    end_sim = count            
    print count
0 голосов
/ 20 февраля 2012

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

Когда яу простых клеточных автоматов были неожиданные результаты, потому что я просто забыл применить фазу к резервной сетке, но я применял ее непосредственно к сетке, над которой работал.

Я имею в виду, что вы должны иметь2 сетки, давайте назовем их grid1 и grid2 и сделаем что-то вроде

init grid1 with data
while number of generations < total generations needed
  calculate grid2 as the next generation of grid1
  grid1 = grid2 (you replace the real grid with the buffer)

. Прямое изменение значений grid1 приведет к различным результатам, потому что вы в основном будете менять соседей ячейки, которая все еще должнаобновиться до окончания текущей фазы ..

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