#returns 1, if x and y are not compatible with \leq ################################################### uncomppair = function(n,x,y) { comp=0 for (i in 1:n) { if (comp==0) { if (x[i]y[i]) comp= 1 } if (comp==-1) { if (x[i]>y[i]) return (1) } if (comp== 1) { if (x[i]0) { for (j in 1:nobj) if (i!=j && errors[j]!=0 && weight[j]>0) attsom[k]= attsom[k] + uncomppair(natt, m[i,], m[j,])*weight[i]*weight[j] } } attsom = attsom / nobj / (nobj-1) return (attsom) } clreduce = function (nobj, natt, m, maxiter=100, pout=.5) { mout=m xerr=rep(0, maxiter) bits=rep(0, maxiter+1) weight=rep(1, nobj) errors=rep(-1,nobj) com=rep(0,nobj) som=rep(1, nobj) obj_chg=rep(0, maxiter) att_chg=rep(0, maxiter) ssom=100000 som_old=10000000 att_old=-1 obj_old=-1 minobj=1 minatt=0 isout=0 for (iter in 1:maxiter) if (minobj>0 && som_old>=ssom) { cat ("iter: ", iter, "\n") ### Sum of the number of incomparable objects for (i in 1:nobj) if (errors[i]!=0 && weight[i]>0) { for (j in 1:nobj) if (i!=j && errors[j]!=0 && weight[j]>0) com[j]= uncomppair(natt, m[i,], m[j,])*weight[i]*weight[j] som[i]=sum(com) } som_old=ssom ssom=sum(som) xerr[iter]=ssom if (ssom/nobj/(nobj-1)<=pout && isout==0) { mout=m isout=1 } cat("sumerr: ", ssom , "\n") ### Search for the best attribute ... minval=1000000000 att_old=minatt obj_old=minobj minatt=-1 minobj=-1 maxsom=max(som) if (maxsom>0) { for (i in 1:nobj) if (som[i]==maxsom) { cf = mostconflict(nobj, natt, i, m, weight) # Exclude relation elements which are already changed if (iter>1) { for (k in 1:(iter-1)) { if (i==obj_chg[k]) cf[att_chg[k]]=10000000 } } mincf=min(cf) if (mincf0) ## found! { m[minobj, minatt] = 1 - m[minobj, minatt] cat ("Obj= ", minobj, "; Attr= ", minatt, "; newerr= ", minval, "; newrel=", m[minobj, minatt], "\n") bits[iter+1] = bits[iter]+weight[i] obj_chg[iter]=minobj att_chg[iter]=minatt } errors=som niter=iter } xerr = xerr / nobj / (nobj-1) plot(bits[1:niter], xerr[1:niter], xlab="Changed Bits", ylab="% of uncomparable pairs", ylim=c(0,1)) abline(a=0,b=0, lty=2) abline(a=pout,b=0, lty=3) if (isout==0) mout=m # Returns first context with p