help-glpk
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Dual negative values in optimal table


From: Andrew Makhorin
Subject: Re: Dual negative values in optimal table
Date: Sun, 16 Oct 2022 07:56:34 +0300

On Sat, 2022-10-15 at 23:24 -0400, Hector Arciniegas wrote:
> Greetings, I don't understand why negative dual values appear in an
> optimal simplex table. Thanks.

Because your constraints are double-bounded, in which case dual values
(= lagrangian multipliers) can have any sign.


> 
> 
> MODELO
> MIN 36.00 25.00 16.00 9.00 4.00 1.00 0.00
> 
> 89 <= 3.00 0.00 0.00 5.00 6.00 6.00 <= 89
> 124 <= 8.00 1.00 5.00 8.00 5.00 7.00 <= 124
> 
> 0.00 <=var( 1) <= 9.00
> 0.00 <=var( 2) <= 10.00
> 0.00 <=var( 3) <= 11.00
> 0.00 <=var( 4) <= 12.00
> 0.00 <=var( 5) <= 13.00
> 0.00 <=var( 6) <= 14.00
> 
> 
> 
> status=GLP_OPT
> 
> *** -2 ***
> S 1 S 2 X 1 X 2 X 3 X 4 X 5 X 6
> Z -3.32 3.20 20.36 21.80 0.00 0.00 7.92 -1.48 80.60
> X 4 0.20 -0.00 -0.60 0.00 0.00 1.00 -1.20 -1.20 1.00
> X 3 -0.32 0.20 -0.64 -0.20 1.00 0.00 0.92 0.52 3.60
> low 89 124 0 0 0 0 0 0
> up 89 124 9 10 11 12 13 14
> stat 5 5 2 2 1 1 2 3
> 
> This table was obtained with the following routine.
> 
> void printTabla(glp_prob *lp1,int lug)
> {
> int m=glp_get_num_rows(lp1);
> int n=glp_get_num_cols(lp1);
> 
> int ind[n+1];
> double val[n+1];
> // glp_prob *lp1;
> // lp1 = glp_create_prob();
> //glp_copy_prob(lp1,lp, GLP_OFF);
> printf("*** %d ***\n",lug);
> printf(" ");
> for (int i=1;i<=m;i++)printf(" S%2d",i);
> for (int j=1;j<=n;j++)printf(" X%2d",j);
> printf("\nZ ");
> for(int i=1;i<=m;i++)printf("%6.2f",glp_get_row_dual(lp1,i));
> for(int j=1;j<=n;j++)printf("%6.2f",glp_get_col_dual(lp1,j));
> printf("%7.2f\n",glp_get_obj_val(lp1));
> 
> for(int i=1;i<=m;i++)
> {
> int ib=glp_get_bhead(lp1,i);
> if(ib>m)printf("X%2d ",ib-m);else printf("S%2d ",ib);
> int len=glp_eval_tab_row(lp1,ib,ind,val);
> double temp[n+m+1];for(int j=1;j<=n;j++)temp[j]=0;
> for(int j=1;j<=len;j++)temp[ind[j]]=val[j];temp[ib]=1;
> for(int j=1;j<=n+m;j++)printf("%6.2f",temp[j]);
> if(ib>m)printf("%7.2f\n",glp_get_col_prim(lp1,ib-m));
> else printf("%7.2f\n",glp_get_row_prim(lp1,ib));
> }
> for(int i=1;i<=m;i++)
> {
> if(glp_get_row_stat(lp1,i)!=GLP_BS)continue;
> printf("S%2d ",i);
> int len=glp_eval_tab_row(lp1,i,ind,val);
> double temp[n+n+1];
> for(int j=1;j<=n+n;j++)temp[j]=0.0;
> for(int j=1;j<=len;j++)temp[ind[j]]=val[j];
> for(int j=1;j<=n+n;j++)printf("%6.2f",temp[j]);
> printf("%7.2f\n",glp_get_row_prim(lp1,i));
> }
> printf("low ");
> for(int i=1;i<=m;i++)printf("%6.0f",glp_get_row_lb(lp1,i));
> for(int j=1;j<=n;j++)printf("%6.0f",glp_get_col_lb(lp1,j));
> printf("\nup ");
> for(int i=1;i<=m;i++)printf("%6.0f",glp_get_row_ub(lp1,i));
> for(int j=1;j<=n;j++)printf("%6.0f",glp_get_col_ub(lp1,j));
> printf("\nstat");
> for(int i=1;i<=m;i++)printf("%6d",glp_get_row_stat(lp1,i));
> for(int j=1;j<=n;j++)printf("%6d",glp_get_col_stat(lp1,j));
> printf("\n");
> }



reply via email to

[Prev in Thread] Current Thread [Next in Thread]