加速GAMS的动态CGE模型求解速度

GAMS是一款十分受欢迎的用以求解CGE模型的数学软件。但是其求解的过程可能会耗费大量的时间,当你的CGE模型包含大量地区和部门时,又或者你建立了一个动态的CGE模型时,这一点将尤为突出。求解耗费时间的增加主要来自于两个方面:首先,来自于增加地区和部门后所导致的维度增加;其次,由于动态递归所导致的初始值与均衡解之间的距离增加

举例来说吧,我开发的最新版本全球CGE模型以GTAP8为数据基础,其中包含57个部门。如果使用加总的Armington假定的话,这意味着每一个部门仅需求一种Armington商品,在这种情形下,求解一年情景耗时仅需两分钟。但是,如果放松上述加总假定,即每一个部门需求57种不同的armington商品时,求解一年情景需要耗时45分钟,差不多是原先耗时的20倍。

现在最关键的问题就是,到底要如何做才能够减少求解耗时呢?

如同我上面所提到的,维度灾难在求解器(solver,如PATH)不更新和优化的情况下是无法轻易解决的。但是呢,增加维度是为了能够更精确的模拟经济系统,在较小的维度下,我们无法分析特定的政策情景。所以,我们必须找到新的方法。

幸运的是,我们可以来减少初始解与均衡解之间的距离。思路是:当我们所猜测的初始解离均衡解足够近,那么求解时间将会大大缩短。

以MPSGE求解器为例,它的初始解为零,这意味着,当你建立一个动态递归CGE模型时,初始解(均为零)离均衡解的距离将会越来越远,求解耗时将不断增加。

但是为什么每次都要猜测零初始解呢?(软件为求方便而进行的默认设定)通常来说,动态CGE模型的均衡解在连续的两年之间不会存在非常大的差异。因此,我们可以使用前一年的均衡解来代替软件的默认初始解,来换取更小的残差(即更小的初始解与均衡解之间的距离)。

假定你的模型名字是Dyn_CGE,实施上述方法的步骤如下:

  1. 使用
    Dyn_CGE.Savepoint = 1;

    来告诉GAMS保存每次求解得到的解集。

  2. 使用
    EXECUTE_LOADPOINT 'Dyn_CGE_p';

    代码来加载上一年所得到的均衡解,该代码要放在“SOLVE”命令前面。

一旦更新了上述代码后,你会发现,除了第一年之外,其余年份的残差均保持在较小的水平。如此看来,第一年较长时间的求解等待也是十分值得的。

以下的内容摘自McCarl GAMS User Guide一书:

This option tells GAMS to save a point format GDX file that contains the information on the current solution point. One can save the solution information from the last solve or from every solve. The points that are saved can be used to provide an advanced basis, integer program starting point or NLP starting point.

在我最近的一个使用CGE模型进行的蒙特卡罗模拟实验中,1000次的重复实验(即求解CGE模型1000次)总耗时仅仅半小时,相对原先需要耗时10小时来说,可以说是巨大的进步了。

是不是觉得很不可思议呀!那就赶快亲自试一下吧!