アットウィキロゴ

最適のn

class non{

int s,m,n;
double[] th=new double[101];
double[] x=new double[101];
double[] p=new double[101];  
double[][][] ux=new double[101][3][3];  
double[][][] wx=new double[101][3][3];  
double[][][] rev=new double[101][3][3];  
double[][][] v=new double[101][3][3];  
int[][][] gotonx1=new int[101][3][3];  
int[][][] gotonx2=new int[101][3][3];  
int[] op=new int[101];  
int[] ox=new int[101];  
double h,h1;
double u1,w1,r1,cost,px,qx,v1;
int n1,n2,nx1,nx2,mx1,mx2;
double maxv;
int t,j,e;

void makedata(int num){

linear lin=new linear();
lin.th=th;
lin.cost=cost;
lin.makedata(num);
x=lin.x;
p=lin.p;

h=1;

t=0;

while(t<1000){

for(s=1;s<101;s++){
for(n1=-1;n1<2;n1++){
for(n2=-1;n2<2;n2++){
px=p[s]+cost*n1*h;
qx=x[s]+n2*h;
u1=u(th[s],qx)-px;
ux[s][n1+1][n2+1]=u1;
}
}
}

for(s=1;s<100;s++){
for(n1=-1;n1<2;n1++){
for(n2=-1;n2<2;n2++){
px=p[s]+cost*n1*h;
qx=x[s]+n2*h;
u1=u(th[s+1],qx)-px;
wx[s][n1+1][n2+1]=u1;
}
}
}

for(s=1;s<101;s++){
for(n1=-1;n1<2;n1++){
for(n2=-1;n2<2;n2++){
px=p[s]+cost*n1*h;
qx=x[s]+n2*h;
r1=px-cost*qx;
if(qx<0)r1=-999999;
h1=0;
if(qx==0)h1=h1+1;
if(px>0)h1=h1+1;
if(h1==2)r1=-999999;
u1=ux[s][n1+1][n2+1];
if(u1<0)r1=-999999;
rev[s][n1+1][n2+1]=r1;
}
}
}


for(n1=-1;n1<2;n1++){
for(n2=-1;n2<2;n2++){
v[1][n1+1][n2+1]=rev[1][n1+1][n2+1];
}
}

for(s=2;s<101;s++){
for(n1=-1;n1<2;n1++){
for(n2=-1;n2<2;n2++){
r1=rev[s][n1+1][n2+1];
maxv=-99999;
mx1=0;
mx2=0;
u1=ux[s][n1+1][n2+1];
for(nx1=-1;nx1<2;nx1++){
for(nx2=-1;nx2<2;nx2++){
w1=wx[s-1][nx1+1][nx2+1];
v1=r1+v[s-1][nx1+1][nx2+1];
if(w1>u1)v1=-999;
if(v1>maxv)mx1=nx1;
if(v1>maxv)mx2=nx2;
if(v1>maxv)maxv=v1;
}
}
gotonx1[s][n1+1][n2+1]=mx1;
gotonx2[s][n1+1][n2+1]=mx2;
v[s][n1+1][n2+1]=maxv;
}
}
}

maxv=-99999;
nx1=0;
nx2=0;
for(n1=-1;n1<2;n1++){
for(n2=-1;n2<2;n2++){
v1=v[100][n1+1][n2+1];
if(v1>maxv)nx1=n1;
if(v1>maxv)nx2=n2;
if(v1>maxv)maxv=v1;
}
}
op[100]=nx1;
ox[100]=nx2;

for(j=1;j<100;j++){
s=101-j;
n1=op[s];
n2=ox[s];
nx1=gotonx1[s][n1+1][n2+1];
nx2=gotonx2[s][n1+1][n2+1];
op[s-1]=nx1;
ox[s-1]=nx2;
}

e=0;
for(s=1;s<101;s++){
e=e+op[s]*op[s]+ox[s]*ox[s];
}

for(s=1;s<101;s++){
p[s]=p[s]+cost*op[s]*h;
x[s]=x[s]+ox[s]*h;
}

if(e<1)h=h/2;
if(h<0.00001)t=1000;
t=t+1;
}



}

double u(double th1,double x){
double u1;
u1=th1*x-0.5*x*x;
if(x<0)u1=-999;
return u1;
}

}
最終更新:2011年07月23日 13:28