繁体   English   中英

求解器约束被忽略

[英]Solver constraints ignored

我现在面临一个让我疯狂两天的新问题:我正在尝试运行以下命令:

Sub getNoShortSalePortfolio()

Dim ws As Worksheet
Set ws = ActiveWorkbook.ActiveSheet

Dim assetReturns As ListObject
Set assetReturns = ws.ListObjects("tblAssetReturns")

Dim numColumnsAssets As Long
numColumnsAssets = assetReturns.ListColumns.Count
    
Dim portfolioWeightsVector() As Variant
Dim activeCellAddress As Variant
Dim adjustableCellsAddress As String

activeCellAddress = ws.Range("noShortSale").Address

adjustableCellsAdress = activeCellAddress & ":" & Range(activeCellAddress).Offset(numColumnsAssets - 2, 0).Address

Range(adjustableCellsAdress).ClearContents

Solverreset

SolverOptions Precision:=0.0001, Iterations:=10, AssumeNonNeg:=True
SolverOk SetCell:=Range("noShortSaleMean"), MaxMinVal:=1, ByChange:=Range(adjustableCellsAdress) ', EngineDesc:="GRG Nonlinear"

SolverAdd CellRef:=Range(adjustableCellsAdress), Relation:=1, FormulaText:=1
SolverAdd CellRef:=Range("noShortSaleWeightSum"), Relation:=3, FormulaText:=1
SolverAdd CellRef:=Range("noShortSaleVola"), Relation:=2, FormulaText:=Range("portfolioVolaAssetShare")

SolverSolve UserFinish:=True
SolverFinish KeepFinal:=1
End Sub

但是,我的求解器只迭代 2 次并返回一个全部相等的解决方案向量(在我的情况下说 10%,因为我想将我的解决方案的总和限制为小于或等于 100%。

此外,我希望作为另一个约束,我的解向量的函数满足来自另一个单元格的预定值,但是,求解器似乎完全忽略了这个约束。 我究竟做错了什么?

编辑:这是求解器的屏幕截图在此处输入图像描述

手动运行求解器在此处输入图像描述

达到所需(和预期的解决方案: 在此处输入图像描述 但是,似乎目标单元格和其他约束未在我的 VBA 中定义。

我很感激任何帮助

非常感谢

托马斯

 Sub getNoShortSalePortfolio()

Dim ws As Worksheet
Set ws = ActiveWorkbook.ActiveSheet

Dim assetReturns As ListObject
Set assetReturns = ws.ListObjects("tblAssetReturns")

Dim numColumnsAssets As Long
numColumnsAssets = assetReturns.ListColumns.Count
    
Dim portfolioWeightsVector() As Variant
Dim activeCellAddress As Variant
Dim adjustableCellsAddress As String

activeCellAddress = ws.Range("noShortSale").Address

adjustableCellsAdress = activeCellAddress & ":" & Range(activeCellAddress).Offset(numColumnsAssets - 2, 0).Address

Range(adjustableCellsAdress).ClearContents

Solverreset

SolverOptions Precision:=0.000001, Iterations:=20, AssumeNonNeg:=True
SolverOk SetCell:="noShortSaleMean", MaxMinVal:=1, ValueOf:=0, ByChange:=Range(adjustableCellsAdress), Engine:=1, EngineDesc:="GRG Nonlinear"
'SolverOk SetCell:="noShortSaleVola", MaxMinVal:=2, ByChange:=Range(adjustableCellsAdress), EngineDesc:="GRG Nonlinear"

SolverAdd CellRef:=Range(adjustableCellsAdress), Relation:=1, FormulaText:=1
SolverAdd CellRef:="noShortSaleWeightSum", Relation:=2, FormulaText:=1
SolverAdd CellRef:="noShortSaleVola", Relation:=2, FormulaText:="portfolioVolaAssetShare"

SolverSolve UserFinish:=True
SolverFinish KeepFinal:=1 
End Sub

我找到了解决这个问题的一种方法。我需要删除这些 Range() 东西,然后它会正常运行(即作为手动解决方案)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM