python3 - <<'PY' import math,random ln2=math.log(2) def f(x): return 0.0 if x<=0 else -x*math.log(x)/ln2 def H(x): return f(x)+f(1-x) W=[[22.068661863776473,28.329443833407577,-3.8357200794101964],[25.688052789312334,-3.6124725416466332,-1.7390672644721958],[-3.953866943305761,-1.0838687132007745,0.0]] def soft(z): m=max(z); e=[2**(x-m) for x in z]; s=sum(e); return [x/s for x in e] def br(l,m): wm=[sum(W[j][k]*m[k] for k in range(3)) for j in range(3)] l2=soft([-wm[j] for j in range(3)]) wtl=[sum(W[j][k]*l2[j] for j in range(3)) for k in range(3)] m2=soft([-wtl[k] for k in range(3)]) return l2,m2 def val(l,m): return H(l[1])+H(m[1])-sum(W[j][k]*l[j]*m[k] for j in range(3) for k in range(3)) lam=[0.7669664661910437,0.1793168035817355,0.05371673022722087];mu=[0,0.7700601662472418,0.22993983375275817] print('base',val(lam,mu)) best=(-1e9,None) random.seed(3) for st in range(200): l=soft([random.gauss(0,3) for _ in range(3)]);m=soft([random.gauss(0,3) for _ in range(3)]) for it in range(200): l2,m2=br(l,m) if max(abs(l2[i]-l[i])+abs(m2[i]-m[i]) for i in range(3))<1e-12: l,m=l2,m2;break l,m=l2,m2 v=val(l,m) if v>best[0]: best=(v,(l,m)) print('best',best) PY