GAMS将har数据转换为gdx数据和Access数据过程中的异步问题

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();



使用这种方法,可以保证两种数据都被准确转换出来。








©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页