$ontext Filename: lmp2.gms Author: Nick Sahinidis, August 2002 Purpose: Generate and solve random linear multiplicative models of "Type 2." Problem instances are generated as proposed by: N. V. Thoai, "A global optimization approach for solving convex multiplicative programming problems," Journal of Global Optimization, 1(341-357), 1991. $offtext options optcr=0, optca=1.e-6, limrow=0, limcol=0, solprint=off, reslim = 10000; sets m constraints /1*200/ n variables /1*200/ p products /1*2/ c cases /1*5/ i instances /1*5/ ; *for each case to be solved, we have a different (m,n) pair table cases(c,*) 1 2 1 10 20 2 20 30 3 60 100 4 100 100 5 200 200 ; parameters cc(p,n) cost coefficients f(p) constants A(m,n) constraint coefficients b(m) left-hand-side rep(c,*) summary report ; parameters mactual, nactual, ResMin, Resmax, NodMin, Nodmax; equations objective, constraints(m), products(p); variables y(p), x(n), obj ; x.lo(n) = 0; objective .. obj =E= prod(p, y(p)); products(p) .. y(p) =E= sum(n $ (ord(n) le nactual), cc(p,n)*x(n)); constraints(m) $ (ord(m) le mactual) .. b(m) =L= sum(n $ (ord(n) le nactual), A(m,n)*x(n)) ; model lmp2 /all/; lmp2.workspace = 32; rep(c,'AvgResUsd') = 0; rep(c,'AvgNodUsd')= 0; loop (c, mactual = cases(c,'1'); nactual = cases(c,'2'); ResMin = inf; Resmax = 0; NodMin = inf; Nodmax = 0; loop(i, f(p) = uniform(0,1); cc(p,n) = uniform(0,1) $ (ord(n) le nactual); A(m,n) = (2*uniform(0,1)-1) $ (ord(m) le mactual and ord(n) le nactual); b(m) = (sum(n, A(m,n)) + 2*uniform(0,1)) $ (ord(m) le mactual); * make sure all problems have the same zero starting point x.l(n)=0; y.l(p)=0; solve lmp2 minimizing obj using nlp; rep(c,'AvgResUsd') = rep(c,'AvgResUsd') + lmp2.resusd; rep(c,'AvgNodUsd') = rep(c,'AvgNodUsd') + lmp2.nodusd; ResMin = min(ResMin, lmp2.resusd); NodMin = min(NodMin, lmp2.nodusd); ResMax = max(ResMax, lmp2.resusd); NodMax = max(NodMax, lmp2.nodusd); ); rep(c,'MinResUsd') = ResMin; rep(c,'MaxResUsd') = ResMax; rep(c,'MinNodUsd')= nodMin; rep(c,'MaxNodUsd')= nodMax; ); rep(c,'AvgResUsd') = rep(c,'AvgResUsd')/card(i); rep(c,'AvgNodUsd')= rep(c,'AvgNodUsd')/card(i); display rep;