循环运行的 GAMS 输出到不同的 Excel 文件

问题描述 投票:0回答:2

我正在使用 epsilon 约束方法的实现之一来查找 Pareto 前沿中的一些解决方案。但是,我想将结果和一些后处理参数存储到单独的 Excel 文件中。大多数这些解决方案都是在循环中获得的,因此,我想使用循环集合的值来命名每个 Excel 文件。

$Set Instance CraggyTerrain
loop(kp,
  kk(kp)=yes;
  repeat
    solve mod_payoff using mip maximizing obj;
    payoff(kp,kk) = z.l(kk);
    z.fx(kk) = z.l(kk);
*// freeze the value of the last objective optimized
    kk(f++1) = kk(f);
*******************************Mipstart_ Give an intial solution
    x.l(i,j,k)=x.l(i,j,k);
    b.l(i,k)=b.l(i,k);
    y.l(i,j)=y.l(i,j);

execute_unload "Results_payoff%Instance%_%FirstOF(kp)%_%SecondOF(kk)%.gdx" z.l x.L y.L b.L;
execute 'GDXXRW.EXE Results_payoff%Instance%_%FirstOF(kp)%_%SecondOF(kk)%.gdx   var=x.l                rng=x!b2'
execute 'GDXXRW.EXE Results_payoff%Instance%_%FirstOF(kp)%_%SecondOF(kk)%   var=y.L                rng=y!b2'
execute 'GDXXRW.EXE Results_payoff%Instance%_%FirstOF(kp)%_%SecondOF(kk)%   var=b.L                rng=b!b2'

until kk(kp); kk(kp) = no;
* release the fixed values of the objective functions for the new iteration
  z.up(f) = inf; z.lo(f) =-inf;
);

对于 %Instance% 部分,我可以简单地声明一个局部变量,如

$Set Instance CraggyTerrain
但我似乎找不到一种方法来使用这些变量(本地、全局、环境)来构建文件名的其余部分,生成一个每个解决方案都有不同的 Excel 文件。

有没有办法在循环/重复语句中使用模型中的参数、集合或变量来更新局部变量?

提前谢谢您, 拉奎尔·阿吉亚尔。

excel loops output gams-math
2个回答
1
投票

可以这样做:

假设您的主游戏文件名为

mymodel.gms
,所以

首先,使用以下内容创建一个辅助文件

myaux.gms

set i instances /1*2/;
file frun / run.gms /;
put frun '* Run file to run ' card(i):0 'instances of mymodel';
loop(i,
  put / '$call gams mymodel.gms --inst=' i.tl:0
  ' lo=2 o=mymodel' i.tl:0 '.lst lf=mymodel' i.tl:0 '.log'
  / "$if errorlevel 1 $abort 'problems with instance i" i.tl:0 "'";
);

aux.gms
中,
set i
充当excel文件名的计数器。它还创建了第三个 gms 文件,名为
run.gms
。运行
aux.gms
后,您将在新创建的
runs.gms
中看到对于
mymodel.gms
中的每个元素重复对
i
的相同调用。

其他东西:

lo
o
lf
用于保存
mymodel.gms
的.lst和.log文件的副本。

然后你只需要运行

run.gms

在 mymodel.gms 中,您将拥有您的模型...类似这样的内容:

Positive Variables
x,y;
Variable
obj;
Equation
eq1;

Set t /1*2/;

Parameter
g(t)
/
1 100,
2 3
/;

eq1.. obj =e= x+y;
x.up = 2;
y.up = g('%inst%');
model test /all/;

solve test using LP max obj;
mysum = x.l + y.l + %inst%;
execute_unload "exfile_%inst%.gdx"

execute 'gdxxrw.exe exfile_%inst%.gdx o=exfile_%inst%.xlsx par=mysum rng=firstsheet!b2';
execute 'gdxxrw.exe exfile_%inst%.gdx o=exfile_%inst%.xlsx var=x.l rng=secondsheet!c2';

0
投票

我想问一下neos求解器的功能是否可用。是否可以在 GAMS 中使用 Neos 解算器时使用该功能,还是仅适用于 GAMS 离线或原始解算器

© www.soinside.com 2019 - 2024. All rights reserved.