function permsketch global m n m = 2; n = 3; X = rand(m^n,1); X = X/sum(X); zz = X*0 + 1e-12; oo = X*0+1; [Aeq,Beq] = permdif(m,n); Aeq = [Aeq;oo']; Beq = [Beq;1]; global maxH maxH = 0; while 1 X = rand(m^n,1); X = X/sum(X); y = fmincon(@myobj1,X,[],[],Aeq,Beq,zz,oo); fprintf(' maxH = %1.9f \n',maxH); end return function y = myobj1(X) global m n global maxH maxP [hhx,Hx,H] = gethhn(X,m,n); if H > maxH maxP = X; maxH = H; fprintf(' maxH = %1.9f \n',maxH); end y = -H; return function permsketch0 global m n m = 2; n = 3; global PERMS PERMS = generate_perms(n); global maxrxy maxryx maxrxy=0; maxryx=0; while 1 X = rand(m^n,1); X = X/sum(X); if 0 Y = randpermswap(X); [hhx,Hx,H] = gethhn(X,m,n); [hhy,Hy,H] = gethhn(Y,m,n); %rxy = max(max(hhx./(hhy+eps))); %ryx = max(max(hhy./(hhx+eps))); rxy = max(Hx)/max(Hy); ryx = max(Hy)/max(Hx); maxrxy = max(maxrxy,rxy); maxryx = max(maxryx,ryx); else zz = X*0 + 1e-12; oo = X*0+1; y = fmincon(@myobj,X,[],[],oo',1,zz,oo); end %fprintf('maxrxy = %1.9f maxryx = %1.9f \n',maxrxy,maxryx); fprintf(' maxryx = %1.9f \n',maxryx); end return function y = myobj(X) global m n global maxrxy maxryx Y = randpermswap(X); [hhx,Hx,H] = gethhn(X,m,n); [hhy,Hy,H] = gethhn(Y,m,n); ryx = max(Hy)/max(Hx); if ryx > maxryx maxryx = ryx; fprintf(' maxryx = %1.9f \n',maxryx); end y = -ryx; return function Y = randpermswap(X) global m n global PERMS nP = size(PERMS,1); MN = repmat([m],[1 n]); mn = m^(n); Y = zeros(m^n,1); for yind = 1:mn y = ind2coord(yind,MN); for pind = 1:nP sig = PERMS(pind,:); isig = invperm(sig); x = y(isig); xind = coord2ind(x,MN); Y(yind) = Y(yind) + X(xind)/nP; end end return