Estoy resolviendo un problema de minimización para cubrir puntos 3D con líneas paralelas de ejes con GLPK. inicialmente me puse lb as 0
y ub as 1
. Luego, después de obtener el resultado de GLPK, hago la primera fractional
valor variable 0
y luego cambiar el lb
y ub
valores como:
i) lb will be 1 for the variable values 1
ii) ub will be 0 for the variable values 0
aquí está mi código:
fid=fopen("output2.txt","w");
%input points are given below
numberOfPoints=size(points,1)
fprintf(fid,"numberofpoints=%d n",numberOfPoints);
xy=unique(points(:,[1,2]),"rows");
yz=unique(points(:,[2,3]),"rows");
xz=unique(points(:,[1,3]),"rows");
L=size(xy,1)+size(yz,1)+size(xz,1); %number of lines
Axy=zeros(size(points,1),size(xy,1));
Ayz=zeros(size(points,1),size(yz,1));
Axz=zeros(size(points,1),size(xz,1));
for i=1:size(points,1)
for j=1:size(xy,1)
if(points(i,[1,2])==xy(j,:))
Axy(i,j)=1;
endif
end
end
Axy;
for i=1:size(points,1)
for j=1:size(yz,1)
if(points(i,[2,3])==yz(j,:))
Ayz(i,j)=1;
endif
end
end
Ayz;
for i=1:size(points,1)
for j=1:size(xz,1)
if(points(i,[1,3])==xz(j,:))
Axz(i,j)=1;
endif
end
end
Axz;
Acat=cat(2,Axy,Ayz);
A=cat(2,Acat,Axz); %constraint matrix
c=ones(1,size(A,2))"; %objective function co-efficients matrix
b=ones(1,size(A,1))"; %constraints" right hand side value matrix
lb=zeros(1,size(A,2)); %variable lower bound matrix
ub=ones(1,size(A,2)); %variable upper bound matrix
for i=1:size(A,1)
ctype(i)="L";
end
ctype;
for i=1:size(A,2)
vartype(i)="C";
end
vartype;
s = 1;
[xmin, fmin, status] = glpk (c, A, b, lb, ub, ctype, vartype, s);%GLPK function
fprintf(fid,"fmin=%0.8f n",fmin);
fprintf(fid,"nn");
fprintf(fid,"status=%d n",status);
fprintf(fid,"nn");
NumberofNodes = 1;
frac_value=intersect(find(xmin >0) , find(xmin < 1)) ; %positions of fractional variables
%fprintf(fid,"frac_value=%d n",frac_value);
%fprintf(fid,"nn");
if (isempty(frac_value))
fprintf(fid,"no fractional value")
fprintf(fid,"nn");
break;
else
round_value=frac_value(1);
xmin_SP1=xmin;
ub1=ub;
fprintf(fid,"ub1=%d n",ub1);
fprintf(fid,"n");
lb1=lb;
fprintf(fid,"lb1=%dn",lb1);
fprintf(fid,"n");
xmin_SP1(round_value)=0; %making the first fractional value 0
NumberofNodes =NumberofNodes +1;
% fprintf(fid,"xmin_SP1=%0.8f n",xmin_SP1);
% fprintf(fid,"nn");
one_value_SP1=find ( xmin_SP1== 1 ); %variables with value 1
% fprintf(fid,"one_value_SP1=%d n",one_value_SP1);
% fprintf(fid,"nn");
zero_value_SP1=find ( xmin_SP1==0); %variables with value 0
% fprintf(fid,"zero_value_SP1=%d n",zero_value_SP1);
% fprintf(fid,"nn");
ub1(zero_value_SP1)=0 ; %changing ub for 0 values
fprintf(fid,"ub1=%d n",ub1);
fprintf(fid,"n");
% fprintf(fid,"numberofub=%d n",size(ub,2));
% fprintf(fid,"n");
lb1(one_value_SP1)=1 ; %changing lb for 1 values
fprintf(fid,"lb1=%dn",lb1);
fprintf(fid,"n");
% fprintf(fid,"numberoflb=%d n",size(lb,2));
% fprintf(fid,"n");
[xminSP1, SP1min, status] = glpk (c, A, b, lb1, ub1, ctype, vartype, s) ; %GLPK function
%size(xmin_SP1,1);
fprintf(fid,"xmin_SP1=%0.8f n",xminSP1);
fprintf(fid,"nn");
%fprintf(fid,"SP1min=%0.8f n",SP1min);
%fprintf(fid,"nn");
fprintf(fid,"status=%d n",status);
fprintf(fid,"nn");
LB1=SP1min
end
fclose(fid);
Aquí están mis puntos de entrada y valores de salida para estos puntos:
points=
1 1 1
2 1 1
4 1 1
1 2 1
2 2 1
3 2 1
4 2 1
2 3 1
3 3 1
4 3 1
3 4 1
4 4 1
1 1 2
3 1 2
4 1 2
1 2 2
2 2 2
3 2 2
4 2 2
1 3 2
2 3 2
4 3 2
1 4 2
2 4 2
3 4 2
4 4 2
1 1 3
2 1 3
3 1 3
4 1 3
1 2 3
2 2 3
3 2 3
4 2 3
2 3 3
3 3 3
4 3 3
1 4 3
2 4 3
3 4 3
1 1 4
2 1 4
3 1 4
4 1 4
1 2 4
2 2 4
3 2 4
4 2 4
1 3 4
2 3 4
3 3 4
1 4 4
3 4 4
numberofpoints=53
fmin=16.00000000
status=0
initial ub:
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
initial lb:
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
changed ub for variable values 0:
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=0
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=1
ub1=0
ub1=1
ub1=0
ub1=1
ub1=1
ub1=0
ub1=1
ub1=0
ub1=1
ub1=0
ub1=1
ub1=1
ub1=0
ub1=1
ub1=1
ub1=0
ub1=0
ub1=1
ub1=0
ub1=0
ub1=1
ub1=1
ub1=0
ub1=0
ub1=0
ub1=0
ub1=1
ub1=0
ub1=1
ub1=0
ub1=1
ub1=0
changed lb for variable values 1:
lb1=1
lb1=1
lb1=1
lb1=1
lb1=1
lb1=0
lb1=1
lb1=1
lb1=1
lb1=1
lb1=1
lb1=1
lb1=1
lb1=1
lb1=1
lb1=1
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
lb1=0
variable values showing NA as status=10(no primal feasible solution)
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
xmin_SP1=NA
*******Result for SP1 node 2********
status=10
Realmente no entiendo por qué se está mostrando. no primal feasible solution status=10
cuando estoy cambiando el 1st fractional variable value 0
. Cualquier ayuda al respecto será muy apreciada.
Respuestas
0 para la respuesta № 1Podría resolver mi problema. Está sucediendo porque algunas de las variables tienen valor. 0.000000000000000027773
o 0.99999999999999999
. Así que si hago un pre-procesamiento como hacer esos 0.000000000000027773
valores 0
o 0.99999999999999999
1
entonces GLPK da solución factible