Поиск значений связей внутри замкнутой системы
Данный код реализует поиск связей между узлами (Альфа, Бета, и т.д.) на основании различных параметров, задача состоит в том, чтоб найти значения этих связей.
Условия:
- Сумма значений входящих связей узла равна параметру 'inturn'.
- Сумма значений исходящих связей узла равна параметру 'outurn'.
- Изначально все значения связей неизвестны.
import random
from collections import Counter
comp_list = ['Альфа', 'Бета', 'Гамма', 'Дельта', 'Эпсилон', 'Дзета', 'Эта', 'Тета']
linkMin = [2, 2, 2, 2, 2, 2, 2, 2]
linkMax = [4, 4, 4, 4, 4, 4, 4, 4]
out_linkran = [random.randint(2, 4), random.randint(2, 4), random.randint(2, 4),
random.randint(2, 4), random.randint(2, 4), random.randint(2, 4),
random.randint(2, 4), random.randint(2, 4)
]
inc_linkran = [random.randint(2, 3), random.randint(2, 3), random.randint(2, 3),
random.randint(2, 3), random.randint(2, 3), random.randint(2, 3),
random.randint(2, 3), random.randint(2, 3)
]
i_v = [48989420]
f_v = [48989420]
i_t = [255258863]
o_t = [255258863]
i_v_list = [5000000, 1000000, 8000000,
15000000, 1900000, 49420,
7840000, 10200000
]
f_v_list = [2500, 7800000, 15000000,
4700, 9378000, 6940000,
9863420, 800
]
i_t_list = [2082292, 41717791, 57455285,
7886851, 39717241, 31947667,
35374341, 39077395
]
o_t_list = [7079792, 34917791, 50455285,
22882151, 32239241, 25057087,
33350921, 49276595
]
cod_list = [5445, 4205, 5405, 5405, 2464, 9204, 9204, 2464] # список кодов
# списки классов организаций
alpha_cls = [432100, 192000, 421100, 932990]
beta_cls = [521000, 466900, 842509, 711210]
gamma_cls = [521000, 421100, 842509, 711210]
delta_cls = [0, 412000, 711210, 932990]
epsilon_cls = [467100, 421100, 521000, 711210]
zeta_cls = [192000, 466900, 711210]
eta_cls = [842509, 421100, 521000, 932990]
theta_cls = [421100, 466900, 711210, 932990]
alpha = {'name': comp_list[0], 'code': cod_list[0], 'cls': alpha_cls,
'lnkMin': linkMin[0], 'lnkMax': linkMax[0], 'inval': i_v_list[0],
'finval': f_v_list[0], 'inturn': i_t_list[0], 'outurn': o_t_list[0],
}
beta = {'name': comp_list[1], 'code': cod_list[1], 'cls': beta_cls,
'lnkMin': linkMin[1], 'lnkMax': linkMax[1], 'inval': i_v_list[1],
'finval': f_v_list[1], 'inturn': i_t_list[1], 'outurn': o_t_list[1],
}
gamma = {'name': comp_list[2], 'code': cod_list[2], 'cls': gamma_cls,
'lnkMin': linkMin[2], 'lnkMax': linkMax[2], 'inval': i_v_list[2],
'finval': f_v_list[2], 'inturn': i_t_list[2], 'outurn': o_t_list[2],
}
delta = {'name': comp_list[3], 'code': cod_list[3], 'cls': delta_cls,
'lnkMin': linkMin[3], 'lnkMax': linkMax[3], 'inval': i_v_list[3],
'finval': f_v_list[3], 'inturn': i_t_list[3], 'outurn': o_t_list[3],
}
epsilon = {'name': comp_list[4], 'code': cod_list[4], 'cls': epsilon_cls,
'lnkMin': linkMin[4], 'lnkMax': linkMax[4], 'inval': i_v_list[4],
'finval': f_v_list[4], 'inturn': i_t_list[4], 'outurn': o_t_list[4],
}
zeta = {'name': comp_list[5], 'code': cod_list[5], 'cls': zeta_cls,
'lnkMin': linkMin[5], 'lnkMax': linkMax[5], 'inval': i_v_list[5],
'finval': f_v_list[5], 'inturn': i_t_list[5], 'outurn': o_t_list[5],
}
eta = {'name': comp_list[6], 'code': cod_list[6], 'cls': eta_cls,
'lnkMin': linkMin[6], 'lnkMax': linkMax[6], 'inval': i_v_list[6],
'finval': f_v_list[6], 'inturn': i_t_list[6], 'outurn': o_t_list[6],
}
theta = {'name': comp_list[7], 'code': cod_list[7], 'cls': theta_cls,
'lnkMin': linkMin[7], 'lnkMax': linkMax[7], 'inval': i_v_list[7],
'finval': f_v_list[7], 'inturn': i_t_list[7], 'outurn': o_t_list[7],
}
nodes = [alpha, beta, gamma, delta, epsilon, zeta, eta, theta]
random.shuffle(nodes)
links = {key['name']: [] for key in nodes}
incoming_links = {key['name']: [] for key in nodes}
val_incoming_links = []
node_number = 0
i = 0
out_links = []
inc_links = []
for start in nodes:
for end in nodes:
cond1 = start['code'] != end['code']
cond2 = list(set(start['cls']) & set(end['cls']))
cond3 = start['name'] not in links[end['name']]
cond4 = len(links[start['name']]) < out_linkran[node_number]
if cond1 and cond2 and cond3 and cond4:
# print('Исходящие связи:', start['name'], end['name'])
links[start['name']].append(end['name'])
# print('Входящие связи:', end['name'], start['name'])
incoming_links[end['name']].append(start['name'])
out_links.append(start['name'])
inc_links.append(end['name'])
t = Counter(out_links)
t2 = Counter(inc_links)
i += 1
node_number += 1
t = Counter(out_links)
t2 = Counter(inc_links)
out_alpha_count = t['Альфа']
out_beta_count = t['Бета']
out_gamma_count = t['Гамма']
out_delta_count = t['Дельта']
out_epsilon_count = t['Эпсилон']
out_zeta_count = t['Дзета']
out_eta_count = t['Эта']
out_theta_count = t['Тета']
inc_alpha_count = t2['Альфа']
inc_beta_count = t2['Бета']
inc_gamma_count = t2['Гамма']
inc_delta_count = t2['Дельта']
inc_epsilon_count = t2['Эпсилон']
inc_zeta_count = t2['Дзета']
inc_eta_count = t2['Эта']
inc_theta_count = t2['Тета']
out_links_list = [out_alpha_count, out_beta_count,
out_gamma_count, out_delta_count,
out_epsilon_count, out_zeta_count,
out_eta_count, out_theta_count
]
inc_links_list = [inc_alpha_count,inc_beta_count,
inc_gamma_count, inc_delta_count,
inc_epsilon_count, inc_zeta_count,
inc_eta_count, inc_theta_count
]
print('Количество связей:', i)
print(out_linkran)
print(inc_linkran)
print('Outgoing links:', t)
print('Incoming links:', t2)
print('out', out_links_list)
print('inc', inc_links_list)
print('Исходящие связи:', links)
print('Входящие связи:', incoming_links)