python3 - <<'PY' import math,random ln2=math.log(2);c=2/ln2 def HB(pA,pC,m,A,B): if m<3 or pA<9 or pC<3 or abs(pA+pC+m-20)>1e-6: return -1e9 if A<3/m or B<3/m or A>6/m or B>4/m or A+B<1+2/m or A+B>1+3/m or A>1 or B>1: return -1e9 def He(p,q): if p<=q: return 0 r=(p-q)/2 return -(q/p*math.log(q/p)+2*r/p*math.log(r/p))/ln2 HA=He(pA,9);HC=He(pC,3) bb=2-c*(2*abs(3/m-A*B)+(A-.5)**2+(B-.5)**2) return (pA*HA+pC*HC+m*bb)/20 def golden(fun,a,b,tol=1e-9): g=(math.sqrt(5)-1)/2;cc=b-g*(b-a);dd=a+g*(b-a);fc=fun(cc);fd=fun(dd) while b-a>tol: if fc>fd: b,dd,fd=dd,cc,fc;cc=b-g*(b-a);fc=fun(cc) else: a,cc,fc=cc,dd,fd;dd=a+g*(b-a);fd=fun(dd) return (a+b)/2 best=(-1,None) random.seed(5) for st in range(30): m=random.uniform(3,8);pA=random.uniform(9,20-m-3);pC=20-m-pA if pC<3: continue A=random.uniform(3/m,min(1,6/m));B=random.uniform(3/m,min(1,4/m)) v=[pA,pC,m,A,B] for it in range(20): for j in range(5): lo=max(0.0001,v[j]-1);hi=min(1,v[j]+1) if j>=3 else v[j]+1 def g(x,j=j): vv=v.copy();vv[j]=x;return HB(vv[0],vv[1],vv[2],vv[3],vv[4]) v[j]=golden(g,lo,hi) val=HB(*v) if val>best[0]: best=(val,v) print(best) print(2.1822287-best[0]) PY