【问题标题】:Iterative Optimization in GAMSGAMS 中的迭代优化
【发布时间】:2020-11-13 02:35:44
【问题描述】:

假设像 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

  • ressourses_endowments.csv
resrs,resEndow
Labor,16.5
Land,5
Mules,10
Market,0.5
  • activity_gross_margin.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
  • ressourses_endowments.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_margin.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. 和 Norton, R. D. (1986)。 农业经济分析的数学规划。美国纽约。 https://www.ifpri.org/publication/mathematical-programming-economic-analysis-agriculture

【问题讨论】:

    标签: optimization gams-math


    【解决方案1】:
    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 文件相比,使用包含所有数据的单个电子表格可能更容易。

    【讨论】:

    • 嗨@Erwin Kalvelagen,感谢您的帮助!我无法以正确的方式建立方程式。简而言之,我似乎无法将您的解释翻译成有效的实际代码。您介意更新您的答案以提供更完整的解决方案吗?我将在下一条评论中分享数据的单个 CSV 文件。
    • farmer,region,practice,resrs,crop,Corn, Bean, Sorghum, Peanut,resEndow,grosMarg farmer1,a,p1,Land,Corn,1,1,1,1,16.5,1372 farmer1,a,p1,Labor,Bean,1.42,1.87,1.92,2.64,5,1219 farmer1,a,p1,Mules,Sorghum,1.45,1.27,1.16,1.45,10,1523 farmer1,a,p1,Market,Peanut,,,,0.98,0.5,4874 farmer2,b,p2,Land,Corn,1,1,1,1,16.5,1372 farmer2,b,p3,Labor,Bean,1.42,1.87,1.92,2.64,5,1219 farmer2,b,p4,Mules,Sorghum,1.45,1.27,1.16,1.45,10,1523 farmer2,b,p5,Market,Peanut,,,,0.98,0.5,4874
    • 你到底有什么不明白的?模型方程应该与您的“单一案例”模型相同。
    • 说实话我不是很懂。如果我更改数据,方程式将不起作用。就在Profit.. Prft =E= sum(crops, grosMarg (crops)*x(crops)),我收到错误dimension different - the symbol is referenced with more/less indices as declared。这对你有用吗?
    • 没错,错误信息是不言自明的,但我似乎无法理解如何解决它。如果您可以更新您的答案,这将对我有很大帮助。
    猜你喜欢
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 2021-07-25
    • 2013-05-29
    • 2019-09-07
    • 1970-01-01
    相关资源
    最近更新 更多