$title Demonstrate how to submit just a solve statement to Engine (ENGINESOLVE,SEQ=149)
$onText
This model implements the well known transport problem and submits
the generation and solution of the model to GAMS Engine. For that
GAMS exports the workfile just before the solve and executes via
embedded code Python the solve statement on Engine using the Python
Control API with its method run_engine. The results come back in a
GDX point file and the solution is imported back into GAMS. The
model attributes, e.g transport.modelStat and
transport.solveStat, need to be transferred explicitly.
In order to see the independence of this asynchronous solve with GAMS
Engine from a particular model and data, the logic to submit and
collect models has been moved to a batInlude file engine_solve.gms.
Contributor: Michael Bussieck, November 2023
$offText
* The model requires environment variables set to work properly:
* ENGINE_URL, ENGINE_USER, ENGINE_PASSWORD ENGINE_NAMESPACE
$if not setEnv ENGINE_URL $abort.noError Environment variables for GAMS Engine are not set
Set
i 'canning plants' / seattle, san-diego /
j 'markets' / new-york, chicago, topeka /;
Parameter
a(i) 'capacity of plant i in cases'
/ seattle 350
san-diego 600 /
b(j) 'demand at market j in cases'
/ new-york 325
chicago 300
topeka 275 /;
Table d(i,j) 'distance in thousands of miles'
new-york chicago topeka
seattle 2.5 1.7 1.8
san-diego 2.5 1.8 1.4;
Scalar f 'freight in dollars per case per thousand miles' / 90 /;
Parameter c(i,j) 'transport cost in thousands of dollars per case';
c(i,j) = f*d(i,j)/1000;
Variable
x(i,j) 'shipment quantities in cases'
z 'total transportation costs in thousands of dollars';
Positive Variable x;
Equation
cost 'define objective function'
supply(i) 'observe supply limit at plant i'
demand(j) 'satisfy demand at market j';
cost.. z =e= sum((i,j), c(i,j)*x(i,j));
supply(i).. sum(j, x(i,j)) =l= a(i);
demand(j).. sum(i, x(i,j)) =g= b(j);
Model transport / all /;
$batInclude engine_solve transport minimizing z using lp
$onImplicitAssign
display transport.modelStat, transport.solveStat, transport.nodUsd, x.l, z.l;