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"); > }