Решила не создавать новую тему, а снова написать здесь.
Помогите пожалуйста найти ошибку в алгоритме минимизации конечного автомата (мы “склеиваем” вершины по группам похожести)! Может, она совсем очевидная, а я не вижу.
Проблемы две:
1) Почему-то игнорируется первый continue
2) Алгоритм зацикливается, хотя по логике если мы в какой-то момент не разделим класс, то t не получит значения 1.
mas=[((1,'a',1),(1,'b',2)),((2,'a',1),(2,'b',4)),((3,'a',1),(3,'b',5)),((4,'a',3),(4,'b',4)),((5,'a',2),(5,'b',5)),((6,'a',2),(6,'b',4))]
t=1
clas=[[2,3,4,6],[1,5]]
i=0
while t==1:
t=0
qw=[]
for i in range(len(clas)):
if isinstance(clas[i],int):
continue
qw=clas[i]#konkretnyi klass
statver=[['',''],['',''],['',''],['',''],['',''],['',''],['','']]
for j in range(len(qw)):
er=qw[j]#j-poryadok ver6iny v klasse, er-zna4enie.
mq=mas[er-1]#ver6ina v massive
#print(mq)
for k in range(len(mq)):
sa=mq[k]#konkretnoe rebro
#print(sa)
for s in range(len(clas)):
clasn=clas[s]
#print(clasn)
if sa[2] in clasn:
if sa[1]=='a':
u1=sa[0]
statver[u1][0]=sa[1]+str(s)
#statver[0][u1]=sa[1]+str(s)#spisok kakoe rebro v kakoi klass vedet
else:
statver[u1][1]=sa[1]+str(s)
#statver[1][u1]=sa[1]+str(s)#spisok kakoe rebro v kakoi klass vedet
break
#print(statver)
newclas=[0,0,0,0,0,0,0,0,0,0,0,0,0,0]
checkn=[]
print(statver)
for i1 in range(len(clas[i])):
ver=clas[i][i1]#сама вершина
for i2 in range(len(clas[i])):
ver1=clas[i][i2]
if isinstance(checkn,list) and i2 in checkn:
print('za6el')
continue
if statver[ver]!=statver[ver1]:
newclas[ver]=ver1;
checkn.append(ver1)
else:
print('ni4ego ne pomenyali')
t=1
checkn.append(ver)
if t==1:
print('i suda')
divclas=clas
for i3 in range(7):
if newclas[i3]==0:
del(newclas[i3])
del divclas[i]
divclas=divclas+[newclas]
clas=divclas
print(t)