Optimization GAMS中的迭代优化

Optimization GAMS中的迭代优化,optimization,gams-math,Optimization,Gams Math,假设一个单一农场问题,如Mayaland示例(Hazell&Norton,1986;第2章;第2.2节),我们可以在GAMS中使用以下代码进行优化 数据(单个农场) Mayaland.csv resourses\u endowments.csv 活动\u毛利.csv 代码(单个农场) resourses\u endowments.csv 活动\u毛利.csv 预期结果(多个农场、多个地区、多种耕作方式) 我们如何使上述代码能够解决多个级别的每个唯一组合的问题?换句话说,May

假设一个单一农场问题,如Mayaland示例(
Hazell&Norton,1986;第2章;第2.2节
),我们可以在
GAMS
中使用以下代码进行优化

数据(单个农场)

  • Mayaland.csv
  • resourses\u endowments.csv
  • 活动\u毛利.csv
代码(单个农场)

  • resourses\u endowments.csv
  • 活动\u毛利.csv
预期结果(多个农场、多个地区、多种耕作方式)

我们如何使上述代码能够解决多个级别的每个唯一组合的问题?换句话说,
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
参考

哈泽尔,p.B.R.,诺顿,R.D.(1986)。农业经济分析的数学规划。美国纽约

  • 使用允许的组合,形成一套
    frp(农民、地区、机构)
    。这可以从csv文件中读取,也可以根据毛利率计算

  • 绕着这一组转一圈

    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文件相比,使用一个包含所有数据的电子表格可能更容易

  • 使用允许的组合,形成一套
    frp(农民、地区、机构)
    。这可以从csv文件中读取,也可以根据毛利率计算

  • 绕着这一组转一圈

    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文件相比,使用一个包含所有数据的电子表格可能更容易。

    Hi@Erwin Kalvelagen,感谢您的帮助!我不能用正确的方法建立方程。简而言之,我似乎无法将您的解释转换为实际的代码。您介意更新您的答案以提供更完整的解决方案吗?我将在下一篇评论中共享数据的单个CSV文件。
    农民、地区、实践、resrs、作物、玉米、大豆、高粱、花生、resEndow、grosMarg farmer1、a、p1、土地、玉米、1、1、1、1、1、1、1、1、16.51372农民1、a、p1、劳动力、大豆、1.42、1.87、1.92、2.64、51219农民1、a、p1、骡子、高粱、1.45、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1,,,,0.98,0.54874农场主2,b,p2,土地,玉米,1,1,1,1,16.51372农场主2,b,p3,劳动力,大豆,1.42,1.87,1.92,2.64,51219农场主2,b,p4,骡子,高粱,1.45,1.27,1.16,1.45,101523农场主2,b,p5,市场,花生,0.98,0.54874
    你到底不明白什么?模型方程应该和你的“单一情况”模型相同。老实说,我不太懂。如果我改变了数据,方程就不起作用了。直接从<代码>利润。。Prft=E=sum(crops,grosMarg(crops)*x(crops)),我得到的错误
    维度不同-符号引用了声明的更多/更少索引
    。这对你来说有用吗?没错,错误信息是不言自明的,但我似乎不明白如何解决它。如果你能更新你的答案,这将对我有很大帮助。嗨@Erwin Kalvelagen,谢谢你的帮助!我不能用正确的方法建立方程。简而言之,我似乎无法将您的解释转换为实际的代码。您介意更新您的答案以提供更完整的解决方案吗?我将在下一篇评论中共享数据的单个CSV文件。
    农民、地区、实践、resrs、作物、玉米、大豆、高粱、花生、resEndow、grosMarg farmer1、a、p1、土地、玉米、1、1、1、1、1、1、1、1、16.51372农民1、a、p1、劳动力、大豆、1.42、1.87、1.92、2.64、51219农民1、a、p1、骡子、高粱、1.45、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1,,,,0.98,0.54874农场主2,b,p2,土地,玉米,1,1,1,1,16.51372农场主2,b,p3,劳动力,大豆,1.42,1.87,1.92,2.64,51219农场主2,b,p4,骡子,高粱,1.45,1.27,1.16,1.45,101523农场主2,b,p5,市场,花生,0.98,0.54874
    你到底不明白什么?模型方程应该和你的“单一情况”模型相同。老实说,我不太懂。如果我改变了数据,方程就不起作用了。直接从<代码>利润。。Prft=E=sum(crops,grosMarg(crops)*x(crops)),我得到的错误
    维度不同-符号引用了声明的更多/更少索引
    。这对你来说有用吗?没错,错误信息是不言自明的,但我似乎不明白如何解决它。如果你能更新你的答案,这将对我有很大帮助。
    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;
    
    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
    
    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
    
    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
    
    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
    
    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.