我目前正在设置一个优化问题,该问题的目标是在给定一些固定约束的情况下定义一些参数,以最大程度地减少与某些目标参数的距离
嗨,您已经在Excel Solver中设置了问题,并且工作正常,但是当我在LinearOptimization服务中进行翻译时,由于优化而变得不可行。
不幸的是,我无法理解是否设置了用于最小化绝对差的数学方法,或者在用Google Linear Optimization Services语言转换模型时仅犯了一些错误。我无法浏览我设置的模型的详细信息。
这是问题陈述
i = 1,2,3
变量
曦
迪
参数
target_i
coeff_i
targetvalue
我想定义Xi这样
最小化总和(abs(Di))
Di = target_i-Xi
有以下矛盾
Xi在0到1之间
sum(Xi)= 1
Sum(Xi * coeff_i)=目标值
拒绝它在线性优化服务中,我使用了等效的问题:
最小和(Di)
用下面的约束上
迪> = target_i-僖
狄<= - (target_i-11)
Xi为0和1之间
总和(十一)= 1
萨姆(僖* 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));
}
}
您能帮我理解错误在哪里吗?
我没有查看源代码,但是在您的描述中看到了一个问题。你写:
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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句