GOOGLE APP SCRIPT-LinearOptimizationService-最小绝对增量-问题不可行

问题描述 投票:1回答:1

我目前正在设置一个优化问题,其目的是在给定一些固定约束的情况下,定义一些参数以最小化与某些目标参数的距离

您好已经在Excel Solver中设置了问题并且可以正常工作,但是当我在LinearOptimization服务中进行翻译时,由于进行优化,我变得不可行。

[很遗憾,我无法设置数学以实现绝对差最小化,还是在使用Google Linear Optimization Services语言转换模型时仅犯了一些错误。我无法浏览我设置的模型的详细信息。

这里是问题说明

i = 1,2,3

变量习Di

参数target_icoeff_i目标值

我想这样定义Xi

最小化总和(abs(Di))Di = target_i-Xi

具有以下矛盾

Xi在0到1之间sum(Xi)= 1Sum(Xi * coeff_i)= targetvalue

为了在线性优化服务中拒绝它,我使用了等效问题:

最小化和(Di)

具有以下矛盾Di> = target_i-XiDi <=-(target_i-Xi)Xi在0到1之间sum(Xi)= 1Sum(Xi * coeff_i)= targetvalue

这是我编写的用于实现它的脚本

// test data  
  var TargetFrequency=2
  var ActualVolumesByBand=[50,100,1200]
  var AvgDropByBand=[5,15,25]
  var TargetDistribution=[0.25,0.5,0.25]
  var Weight=[2,1,2]
  var NumberOfPeriods=52

  var tolerance=0.0001
  var nBands=ActualVolumesByBand.length
  var engine = LinearOptimizationService.createEngine();

// adds a variable for each distribution band

 for (var i=0; i<nBands; i++)

  {
   engine.addVariable('distance'+i, 0, 10000)
   engine.addVariable('FinalDistribution'+i, 0, 1)
  }

 // set objective coefficients using weight and distance 

   for (var i=0; i<nBands; i++)  
  {
   engine.setObjectiveCoefficient('distance'+i, Weight[i])
  }

// set problem
  engine.setMinimization()



////Start Setting COntraints


  // define support arrays
  var LowerBound0=new Array
  for (var i=0;i<nBands;i++ )
  {
    LowerBound0[i]=0
  }
  Logger.log(LowerBound0)
  var UpperBound1000=new Array
  for (var i=0;i<nBands;i++ )
  {
    UpperBound1000[i]=10000
  }
  Logger.log(UpperBound1000)


  var C12VariblesArray= []
  for (var i=0;i<nBands;i++ )
  {
    C12VariblesArray[i]=['distance'+i, 'FinalDistribution'+i]
  }

  Logger.log(C12VariblesArray)


  var C1Coefficients=[]
  for (var i=0;i<nBands;i++ )
  {
    C1Coefficients[i]=[1, 1]
  }
  Logger.log(C1Coefficients)



/// Adding fist constraint for absolute value minimization

engine.addConstraints(TargetDistribution, UpperBound1000 ,C12VariblesArray ,C1Coefficients )
//

    var C2Coefficients=[]
  for (var i=0;i<nBands;i++ )
  {
    C2Coefficients[i]=[-1,1]
  }
  Logger.log(C2Coefficients)

// Adding second constraint for absolute value minimization


engine.addConstraints(TargetDistribution, UpperBound1000,C12VariblesArray ,C2Coefficients )


// adding constraint for integrity of distribution 


  var C34VariblesArray= []
  for (var i=0;i<nBands;i++ )
  {
    C34VariblesArray[i]='FinalDistribution'+i
  }

  Logger.log(C34VariblesArray)


  var C3Coefficients = []
  for (var i=0;i<nBands;i++ )
  {
    c=1
  }

  Logger.log(C3Coefficients)                

  var c3=engine.addConstraint(1, 1)

  for (var i=0;i<nBands;i++ ){
    c3.setCoefficient('FinalDistribution'+i,1 )
  }


// adding constraint for target frequency 

// calculate total volume

var TotalVolume=0

  for (var i=0;i<nBands;i++ )
{
    TotalVolume=TotalVolume+ActualVolumesByBand[i]
}


    var C4Coefficients = []
  for (var i=0;i<nBands;i++ )
  {
    C4Coefficients[i]=TotalVolume/NumberOfPeriods/AvgDropByBand[i]
  }

  Logger.log(C4Coefficients)                  

  var c4=engine.addConstraint(TargetFrequency,TargetFrequency)
  for (var i=0;i<nBands;i++ ){
    c4.setCoefficient('FinalDistribution'+i,C4Coefficients[i] )
  }

  ////Finish setting COntraints


// start solving

var solution = engine.solve();
if (!solution.isValid()) {
  Logger.log('No solution ' + solution.getStatus());
} else {
   for (var i=0;i<nBands;i++ )
  {
    Logger.log('Value of band '+i+': ' + solution.getVariableValue('FinalDistribution'+i));
  }
}

您能帮我了解错误在哪里吗?

google-apps-script google-sheets linear-programming nonlinear-optimization
1个回答
0
投票

我没有查看源代码,但是我在您的描述中看到了一个问题。您写道:

minimize sum(Di)
with the following contraints
Di >= target_i-Xi
Di <= -(target_i-Xi)

这看起来不正确。数学通常由以下公式得出:

min sum(i, |target(i)-X(i)|)

<=>

min sum(i, d(i))
-d(i) <= target(i)-X(i) <= d(i)

<=>

min sum(i, d(i))
d(i) >= target(i)-X(i)
d(i) >= -(target(i)-X(i))    
© www.soinside.com 2019 - 2024. All rights reserved.