У меня есть небольшая программа, в которой я играю с созданием эволюционного алгоритма, связанного с распространением болезней. Я столкнулся с проблемой, которая немного свела меня с ума, пытаясь понять проблему.
У меня есть два массива numpy, «заражений», которые представляют собой массивы, каждый элемент которых представляет собой двоичное представление о том, подвергался ли этот человек воздействию, и «текущие_инфекции», которые являются только текущими инфекциями и должны быть увеличивается на дни.
Например:
инфекции = [0,0,0,1,1]
current_infections = [0,0,0, 15,0]
Это будет представлять пять человек, третий человек болеет заболеванием в течение 15 дней, а четвертый человек болеет достаточно долго, чтобы выздороветь и больше не болеет.
infections = []
current_infections = []
responsible_infections = []
spread_rate = 0.1
contagious_period = 20
initial_node_infections = 2
current_network = #this is an array of adjacency matrices for nodes in a network
#initial infections.
def initialize_infections():
global infections, current_infections, responsible_infections
responsible_infections = np.zeros(current_network.shape[0])
infections = np.zeros(current_network.shape[0])
for each in rd.sample(range(len(current_network)), k=initial_node_infections):
infections[each] = 1
current_infections = infections[:]
# runs a day in simulation.
# returns 1 if there are still ongoing infections at the end of day, 0 if not
def progress_day():
global current_infections
print(np.sum(current_infections), np.sum(infections)) #should not be equivalent, yet they are
for i in range(len(current_infections)):
if current_infections[i] >= 1 and current_infections[i]<contagious_period:
current_infections[i]+=1
elif current_infections[i]>=contagious_period:
#patient recovered
current_infections[i] = 0
for i in range(contacts_per_day):
for j in range(len(current_infections)):
if current_infections[j] >= 1:
spread_infection(current_network[j], j)
if not np.sum(current_infections):
return 0
else:
return 1
#given infected node it calculates spread of disease to adjacent nodes.
def spread_infection(person, rp):
global infections, current_infections, responsible_infections
for x in range(len(person)):
if person[x] == 1 and infections[x] == 0 and rd.random()<=spread_rate:
current_infections[x] = 1
infections[x] = 1
responsible_infections[rp]+=1 #infections a given person is responsible for.
def main():
global current_infections, infections
initialize_infections()
day = 0
while day<100:
if not progress_day():
break
day+=1
main()
По какой-то причине изменения, внесенные в элемент в current_infections, также вносятся в этот элемент в заражениях, поэтому оба они увеличиваются. Я что-то делаю неправильно с numpy, так что это один и тот же массив?