首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GAMS中的迭代优化

GAMS中的迭代优化
EN

Stack Overflow用户
提问于 2020-11-12 11:20:24
回答 1查看 168关注 0票数 0

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

数据(单场)

  • Mayaland.csv

代码语言:javascript
复制
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

代码语言:javascript
复制
resrs,resEndow
Labor,16.5
Land,5
Mules,10
Market,0.5

  • activity_gross_margin.csv

代码语言:javascript
复制
crop,grosMarg
Corn,1372
Bean,1219
Sorghum,1523
Peanut,4874

代码(单场)

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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中的每一行(以下)代表一个独立的观察,因此应该独立建模。

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2020-11-12 18:35:44

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

这个集合上的

  1. 循环

参数结果(农民,地区,实践,*,*)‘收集结果’;环路(农民,地区,实践),*提取数据的单个案例赋予(Res)=endowmentData(农民,地区,实践,res);.*解决单个案例解决.*存储结果:参数结果(农民、地区、实践、'x‘、作物)=x.l(作物);结果(农民、地区、实践、’利润‘)= Prft.l;);*将结果导出到电子表格或csv文件.

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64802937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档