微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ILOG CPLEX 中的比例

如何解决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 举报,一经查实,本站将立刻删除。