在 GAMS 中将参数值插入 $evalGlobal

Insert parameter value into $evalGlobal in GAMS

考虑以下 $SetGlobal:

$setglobal Path MyPath

我使用下面的代码来查找 'MyPath' 中的字符数:

set Length /%Path%/;
Parameter report(Length,*);

report(Length,'length')   = Length.len ;

此后,我想将此值(在本例中为 6)插入 $evalGlobal,因此我有以下 $evalGlobal:

$evalGlobal ModelLength 6

应该是这样的:

$evalGlobal ModelLength %Report("MyPath","length")%

但这不起作用。如何将参数“report”的长度插入 $evalGlobal ModelLength?

问题是,report(Length,'length') = Length.len ; 是在执行时完成的,而您尝试在编译时访问它的结果已经在 $evalGlobal ModelLength ... 中(参见 https://www.gams.com/latest/docs/UG_GamsCall.html#UG_GamsCall_TwoPass)。

你想要的可以使用嵌入式代码实现:

$setglobal Path MyPath

scalar l;

$onEmbeddedCode Python:
s = r'%Path%'
gams.set('l', [len(s)])
$offEmbeddedCode l

$evalGlobal ModelLength l
$log %ModelLength%

这可能不是直截了当的,但它确实有效...