Gams是一款通用建模软件,能够高效的解决数学规划和优化问题。Matlab是一个集数值计算、符号分析、图像显示和文字处理于一体的大型集成化软件。在实际使用过程中会涉及到两个软件通讯的操作,下面介绍如何实现Gams与Matlab的数据交互。
这两个软件之间通过gdx文件进行数据交互(xxx.gdx),具体实现过程为Matlab软件将数据写入gdx文件,gams通过读取gdx文件得到数据,反之亦然。下面从gams生成指定gdx文件、gams向gdx文件中写入数据、gams读取gdx文件中的数据、Matlab向gdx文件中写入数据、Matlab读取gdx文件中的数据、Matlab调用gams进行运算 五部分进行介绍。
1 . gams生成指定gdx文件
在gams脚本文件首行及末尾编写如下代码
$set matout "'matsol.gdx'"
*
*
*
execute_unload %matout%;
运行该文件后便会在脚本文件所在文件夹中生成"matsol.gdx"文件。
2 . gams向gdx文件中写入数据
首先确定数据变量名,之后在脚本文件首行添加变量名即可
$set matout "'matsol.gdx', Qu, Qc, yij, ycu, yhu, Tiin, Chu"
*Qu, Qc, yij, ycu, yhu, Tiin, Chu为所需输出变量名
注意!这里可以规定gams的计算结果,也可以规定gams中的输入值。理论上可以输出gams当中全部参数数据。
运行文件后"matsol.gdx"中便会存在全部变量,双击gdx文件可以在gams中查看。
下面介绍Matlab对gams调用进行计算以及与gdx文件数据交互的方法。
首先需要在Matlab中添加gams的启动路径(例如path = D:\GAMS\37),或者在Matlab工具栏操作:主页-环境-设置路径-添加并包含子文件夹-选择gams启动文件夹。
>> addpath 'C:\GAMS'; savepath;
3 . Matlab向gdx文件中写入数据
在Matlab中首先通过结构体对需要写入gdx文件中的数据进行定义,采用如下代码
s.name = 'Chu';
s.type = 'Parameter';
s.form = 'full';
s.val = 80;
v.name = 'Tiin1';
v.type = 'Parameter';
v.form = 'full';
v.val = [89.47 117.28 211.58 143.67 119.80 48.18 48.25 47.93];
如代码所示,'name'为数据名称,‘type’为数据类型,'val'为数据值。有关参数的更多属性值请参考此教程:GDXMRW (gams.com)
参数规定后通过如下代码输入到gdx文件中
wgdx('matsol',s,v);
通过上述函数可以一次性向gdx文件中输入多个参数,注意!该函数会覆盖gdx文件之前的内容。
4 . Matlab读取gdx文件中的数据
首先规定承载数据的结构体:
y.name = 'Chu';
z.name = 'Tiin1';
结构体中的属性值'name'要与gdx文件中参数的'name'保持一致。
通过如下代码读取数据:
x1 = rgdx('matsol',y);
x2 = rgdx('matsol',z);
disp(x1.val);
disp(x2.val);
注意!3和4介绍的方法默认gdx文件与Matlab脚本文件在同一文件夹中,在使用时建议gdx文件在Matlab运行文件夹中。
5 . Matlab调用gams进行运算
通过如下代码调用gams进行计算,注意!gams脚本文件需要放在Matlab运行文件夹中(Matlab脚本所在文件夹)。
[x1, x2, x3, x4, x5, x6, x7] = gams('super');
'super'为gams脚本文件文件名,x1至x7为gams运行结果返回值,与( 2 . gams向gdx文件中写入数据) 中在gams脚本文件开头规定的输出变量一致,从左到右的变量依次赋给x1至x7。通过这种方法可以方便的得到计算结果。通过下述代码得到参数值:
disp(x1.val);
disp(x1.name);
注意!如果返回数据中涉及到gams计算结果的数据全部为0,则代表gams计算失败,文件存在bug或者无法计算得到结果(Problem is infeasible!)