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

Это, наверное, простой вопрос, но он сводит меня с ума! У меня есть код Python, который выполняет клеточные автоматы на сетке землепользования. Я сделал словарь идентификатора ячейки: код землепользования, импортированный из текстового файла. У меня также есть импорт соседних соседей каждой ячейки из текстового файла. Для каждой ячейки во вложенном цикле я выбираю наибольшее значение, подсчитываю наибольшее значение соседних ячеек. Если это значение больше, чем у обрабатывающей ячейки и встречалось более 4 раз, я обновляю словарь для этого идентификатора ячейки. Коды землепользования ранжируются по приоритету. В приведенном ниже коде вы увидите <6 ... 6 - это вода и водно-болотные угодья, которые я не хочу менять. В первый раз, когда я запустил код, 7509 ячеек изменили землепользование в зависимости от использования земли соседними соседями. Я могу закомментировать чтение текстового файла словаря и запустить его снова, затем изменилось около 5000 ячеек. Запустите его снова, затем еще меньше и так далее. То, что я хотел бы сделать, это запустить это в цикле, пока только 0,0001 от общего числа ячеек не изменится, после этого разорвать цикл. </p>

Я несколько раз пытался использовать итераторы, такие как «для r в диапазоне (999) - что-то большое; если End_Sim> count: break». Но он ломается после первого, потому что счетчик возвращается к нулю. Я попытался поместить счетчик = 0 в цикл, и он складывается ... Я хочу, чтобы он начинался заново каждый раз, чтобы число ячеек становилось все меньше и меньше. Я пень ... надеюсь, это кому-то тривиально!

Вот мой код (это чистый лист ... Я удалил свои неудачные попытки создать цикл количества симуляций):

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]

#Calculate when to end of one sweep
Tot_Cells = len(FID)
End_Sim = int(0.0001*Tot_Cells)

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

#Performs cellular automata rules on land use grid codes

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
print count

Спасибо за любую помощь!

Ответы [ 3 ]

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

Попробуйте использовать операторы while break

initialization stuff
while(1):
    ... 
    if x < 0.0001:
        break 
    ... 

http://docs.python.org/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops

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

используйте петлю while:

cnt_total = 1234 # init appropriately
cnt_changed = cnt_total
p = 0.001

while (cnt_changed  > cnt_total*p):
  # your code here
  # remember to update the cnt_changed variable
0 голосов
/ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...