GAMS是非常优秀的经济学建模软件,可以用来求解一般均衡和其他优化问题。GTAP作为一种大型多区域CGE模型,也可以使用GAMS来求解,但使用之前,必须将GTAP提供的har数据转换为GAMS所能使用的gdx数据,如果要在C#或Java等高级语言中调用该数据,则还必须将gdx数据转换成Access数据库数据,数据流为:
har--------GAMS--------> gdx---------GAMS----------->Access。
其GAMS脚本代码为:
*转换为gdx数据
execute_unload "..\data\variable\slack.gdx"
profitslack.l
cgdslack.l
endwslack.l
tradslack.l
incomeslack.l
saveslack.l
govslack.l
walraslack.l
*转换为Access数据
$call gdx2access ..\data\variable\slack.gdx
这段代码在运行时存在问题,gdx数据可以生成,但Access数据无法生成。其原因在于,转化Access的程序启动了另外一个exe进程,因此两部转换之间存在异步关系,第一步中尚未生成gdx数据,第二部就已经开始执行,而第二步必须依赖于第一步生成gdx数据。
这一问题仅靠GAMS难以解决。可以考虑使用C#与GAMS的混编。具体解决方法为:
第一,将gdx转换和Access转换的GAMS的GAMS脚本分别置于两个独立的gms文件当中,假设文件名分别为1.gms和2.gms
第二,使用C#调用1.gms,一直等到该进程结束,再调用2.gms
程序为:
//GAMS——生成变量的gdx数据 void RunGamsProduceGDX() { p = new Process(); p.StartInfo.FileName = @"F:\Program Files\GAMS23.3\gams.exe"; p.StartInfo.WorkingDirectory = @"F:\C#-GAMS\CSGAMS\CSGAMS\bin\x86\Debug\GTAPbyGAMS3-3(2)\build\"; p.StartInfo.Arguments = "\"" + @"F:\C#-GAMS\CSGAMS\CSGAMS\bin\x86\Debug\GTAPbyGAMS3-3(2)\build\VariableData.gms" + "\" LO=0 --runid=" + "0"; p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; p.StartInfo.ErrorDialog = true; p.Start(); p.WaitForExit(); } //GAMS——生成变量的MDB数据 void RunGamsGDX2MDB() { p = new Process(); p.StartInfo.FileName = @"F:\Program Files\GAMS23.3\gams.exe"; p.StartInfo.WorkingDirectory = @"F:\C#-GAMS\CSGAMS\CSGAMS\bin\x86\Debug\GTAPbyGAMS3-3(2)\build\"; p.StartInfo.Arguments = "\"" + @"F:\C#-GAMS\CSGAMS\CSGAMS\bin\x86\Debug\GTAPbyGAMS3-3(2)\build\GDX2MDB.gms" + "\" LO=0 --runid=" + "0"; p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; p.StartInfo.ErrorDialog = true; p.Start(); p.WaitForExit(); }//调用 this.RunGamsProduceGDX(); this.RunGamsGDX2MDB();
使用这种方法,可以保证两种数据都被准确转换出来。