如何解决ILOG CPLEX 中的比例
我试图在我的解决方案中包含比例性。 .dat 如下:
Farms = {Rice,Barns,Snyder};
Crops = {Corn,Wheat,SoyBeans};
UsableLand = [400,600,300];
Water = [600,800,375];
MaximumQuota = [600,500,325];
WaterConsumption = [3,2,1];
Profit = [1000,750,250];
我的 .mod 目前构建如下:
{string} Farms = ...;
{string} Crops = ...;
int UsableLand[Farms]=...;
int Water[Farms]=...;
int MaximumQuota[Crops]=...;
int WaterConsumption[Crops]=...;
int Profit[Crops]=...;
constraint LandAcre[Farms];
constraint Wateracre[Farms];
constraint CropLimit[Crops];
constraint Propotionality[Crops][Farms];
dvar float+ ProductionAmount[Crops][Farms];
maximize
sum(i in Crops)
sum(j in Farms)
Profit[i]*ProductionAmount[i][j];
subject to {
forall(j in Farms)
LandAcre[j]:
sum(i in Crops) ProductionAmount[i][j] <= UsableLand[j];
forall(j in Farms)
Wateracre[j]:
sum(i in Crops) WaterConsumption[i] * ProductionAmount[i][j] <= Water[j];
forall(i in Crops)
CropLimit[i]:
sum(j in Farms) ProductionAmount[i][j] <= MaximumQuota[i];
我的问题是如何将比例作为约束条件。我是否添加例如:
forall(j in Farms)
Proportionality [j]:
sum(i in Crops) ProductionAmount[i][j] / UsableLand[j] == ProductionAmount[i][j] / UsableLand[j];
非常感谢任何指导!
解决方法
你可以使用
dvar float ratio[Crops] in 0..1;
然后写
forall(j in Farms)
Proportionality :
forall(i in Crops)ProductionAmount[i][j] / UsableLand[j] == ratio[i];
你整个 .mod 就会是
{string} Farms = ...;
{string} Crops = ...;
int UsableLand[Farms]=...;
int Water[Farms]=...;
int MaximumQuota[Crops]=...;
int WaterConsumption[Crops]=...;
int Profit[Crops]=...;
constraint LandAcre[Farms];
constraint WaterAcre[Farms];
constraint CropLimit[Crops];
//constraint Propotionality[Crops][Farms];
dvar float+ ProductionAmount[Crops][Farms];
dvar float ratio[Crops] in 0..1;
maximize
sum(i in Crops)
sum(j in Farms)
Profit[i]*ProductionAmount[i][j];
subject to {
forall(j in Farms)
LandAcre[j]:
sum(i in Crops) ProductionAmount[i][j] <= UsableLand[j];
forall(j in Farms)
WaterAcre[j]:
sum(i in Crops) WaterConsumption[i] * ProductionAmount[i][j] <= Water[j];
forall(i in Crops)
CropLimit[i]:
sum(j in Farms) ProductionAmount[i][j] <= MaximumQuota[i];
forall(j in Farms)
Proportionality :
forall(i in Crops)ProductionAmount[i][j] / UsableLand[j] == ratio[i];
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。