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];    
        
        
        
      }