GAMS中的迭代优化



假设Mayaland示例(Hazell & Norton, 1986; Chapter 2; section 2.2(中的单个农场问题,我们可以在GAMS中使用以下代码进行优化。

数据(单个场(

  • Mayaland.csv
resrs,Corn,    Bean,  Sorghum,  Peanut
Land,1,1,1,1
Labor,1.42,1.87,1.92,2.64
Mules,1.45,1.27,1.16,1.45
Market,,,,0.98
  • 资源_捐赠.csv
resrs,resEndow
Labor,16.5
Land,5
Mules,10
Market,0.5
  • activity_gross_marin.csv
crop,grosMarg
Corn,1372
Bean,1219
Sorghum,1523
Peanut,4874

代码(单个场(

SETS resrs, crops;
PARAMETERS
farmData
resEndow
grosMarg
;
************************** I prefer NOT to input data like this **************************
*SETS
*    resrs ressourses /labor, land, mules, market /
*    crops mayaland activities /
*Corn
*Bean
*Sorghum
*Peanut
*/
*;
*PARAMETERS
*
*resEndow (resrs) ressourses endowments
*                        /
*                        Labor 16.5
*                        Land 5
*                        Mules 10.0
*                        Market 0.5
*                        /
*grosMarg (crops) gross margins
*                        /
*                        Corn 1372
*                        Bean 1219
*                        Sorghum 1523
*                        Peanut 4874
*                        /
*;
*table farmData A ressource requirements
*         Corn    Bean  Sorghum  Peanut
*Land     1       1      1       1
*Labor    1.42    1.87   1.92    2.64
*Mules    1.45    1.27   1.16    1.45
*Market                          0.983
*;
*
*******************************************************************************************
******************** I prefer to load the data from csv files like this********************
$call csv2gdx Mayaland.csv id=farmData useHeader=y fieldSep=Comma index=1 values=2..lastCol trace=3 
$ifE errorLevel<>0 $abort Problems reading Mayaland.csv!
$gdxIn Mayaland.gdx
$load resrs             = dim1
$load crops            = dim2
$load farmData
$gdxIn
;
$call csv2gdx ressourses_endowments.csv id=resEndow useHeader=y fieldSep=Comma index=1 values=2 trace=3 
$ifE errorLevel<>0 $abort Problems reading ressourses_endowments.csv!
$gdxIn ressourses_endowments.gdx
$load resEndow
$gdxIn
;
$call csv2gdx activity_gross_margin.csv id=grosMarg useHeader=y fieldSep=Comma index=1 values=2 trace=3 
$ifE errorLevel<>0 $abort Problems reading activity_gross_margin.csv!
$gdxIn activity_gross_margin.gdx
$load grosMarg
$gdxIn
;
*******************************************************************************************

DISPLAY resEndow, grosMarg, farmData;
VARIABLES
Prft Total gross margin
x(crops) activity levels
;
EQUATIONS
Profit definition of Z
RESCON ressouse constraint
NONNEG non-negativity condition;
Profit.. Prft =E= sum(crops, grosMarg (crops)*x(crops));
RESCON(resrs).. sum(crops, farmData(resrs, crops)*x(crops)) =L= resEndow(resrs);
NONNEG(crops).. x(crops) =G= 0;
model mayaland / Profit, RESCON, NONNEG /
;
SOLVE mayaland maximizing Prft using LP;
DISPLAY x.l, Prft.l;

现在,我想添加几个嵌套级别,并解决这些级别的每个唯一组合的问题。假设我们有几个来自不同地区的农民,他们有不同类型的耕作方式,如以下数据所示

数据(多个农场、多个地区、多种耕作方式(

  • Mayaland.csv
farmer,region,practice,resrs,Corn,    Bean,  Sorghum,  Peanut
farmer1,a,p1,Land,1,1,1,1
farmer1,a,p1,Labor,1.42,1.87,1.92,2.64
farmer1,a,p1,Mules,1.45,1.27,1.16,1.45
farmer1,a,p1,Market,,,,0.98
farmer2,b,p2,Land,1,1,1,1
farmer2,b,p3,Labor,1.42,1.87,1.92,2.64
farmer2,b,p4,Mules,1.45,1.27,1.16,1.45
farmer2,b,p5,Market,,,,0.98
  • 资源_捐赠.csv
farmer,region,practice,resrs,resEndow
farmer1,a,p1,Land,16.5
farmer1,a,p1,Labor,5
farmer1,a,p1,Mules,10
farmer1,a,p1,Market,0.5
farmer2,b,p2,Land,16.5
farmer2,b,p3,Labor,5
farmer2,b,p4,Mules,10
farmer2,b,p5,Market,0.5
  • activity_gross_marin.csv
farmer,region,practice,crop,grosMarg
farmer1,a,p1,Corn,1372
farmer1,a,p1,Bean,1219
farmer1,a,p1,Sorghum,1523
farmer1,a,p1,Peanut,4874
farmer2,b,p2,Corn,1372
farmer2,b,p3,Bean,1219
farmer2,b,p4,Sorghum,1523
farmer2,b,p5,Peanut,4874

预期结果(多个农场、多个地区、多种耕作方式(

我们如何使上述代码能够解决多个级别的每个唯一组合的问题?换句话说,Mayaland.csv(以下(中的每一行都代表一个独立的观测值,因此应该独立建模。

farmer,region,practice   ===================================>  result 1
farmer,region,practice   ===================================>  result 2
farmer,region,practice   ===================================>  result 3
farmer,region,practice   ===================================>  result 4
farmer,region,practice   ===================================>  result 5
farmer,region,practice   ===================================>  result 6
farmer,region,practice   ===================================>  result 7
farmer,region,practice   ===================================>  result 8

参考

Hazell,p.B.R;诺顿,R.D.(1986(<用于农业经济分析的数学规划>。美国纽约。https://www.ifpri.org/publication/mathematical-programming-economic-analysis-agriculture

  1. 用允许的组合形成一个集合frp(farmer,region,practice)。这可以从csv文件中读取,也可以根据毛利率等进行计算。

  2. 在这套上循环

    parameter results(farmer,region,practice,*,*) 'collect results'; 
    loop(frp(farmer,region,practice),
    * extract data for single case
    endow(res) =  endowmentData(farmer,region,practice,res);
    ...
    * solve single case
    solve ....
    * store results in parameter
    results(farmer,region,practice,'x',crops) = x.l(crops);
    results(farmer,region,practice,'profit','-') = Prft.l;
    ....
    );
    * export results to spreadsheet or csv file.
    

PS与多个csv文件相比,使用一个包含所有数据的电子表格可能更容易。

最新更新