`Sub Leagues_Solver()
Dim i As Integer
For i = 0 To 30
' Leagues_Solver Macro
'Reset Solver
SolverReset
mytarget = Range("$A$1").Offset(i, 0)
'
SolverOk SetCell:=Sheets("Footballprediction.ai Stats LG").Range("$C$1").Offset(i, 0).Address, MaxMinVal:=3, ValueOf:=mytarget, ByChange:=Sheets("Footballprediction.ai Stats LG").Range("$K$2").Offset(i, 0).Address, Engine:=1 _
, EngineDesc:="GRG Nonlinear"
SolverAdd CellRef:=Sheets("Footballprediction.ai Stats LG").Range("$K$2").Offset(i, 0).Address, Relation:=1, FormulaText:="1"
SolverAdd CellRef:=Sheets("Footballprediction.ai Stats LG").Range("$K$2").Offset(i, 0).Address, Relation:=3, FormulaText:="0"
SolverSolve (True)
'Approve the solution and avoid the popups
SolverSolve userFinish:=True
SolverFinish KeepFinal:=1
Next i
End Sub
(A)要达到的价值 | (C)平均Conf.int | (K)阿尔法 | (L)Stand.Dev. | (M)样品 | (N)Conf.Int. | (O)平均 |
---|---|---|---|---|---|---|
2,000 | #NUM! | 0,000 | 1,826 | 4 | #NUM! | 4,000 |
上面是我的代码和表格的第一行。我的主要目标是将 C 列设置为 A 列的值,在本例中为 2,但问题是通过更改 alpha,C 列不可能恰好等于 2,但它会非常好对我来说,如果它大约是 2,例如:正确的 2 或 3 位小数。不知道这样说是否可以理解,谢谢您的帮助!
SolverOk SetCell:="$B$2", MaxMinVal:=2, ValueOf:=0, ByChange:="$K$2", Engine:=1 _
, EngineDesc:="GRG Nonlinear"
设定目标值为
=abs(a2-c2)
然后将上面的第一行包含在解算器循环 (VB) 中,以便更改单元格 K2.offset 以最小化 B2.offset。
这将使您尽可能接近 - 这应该避免问题 RE:在“完全匹配”的情况下“求解器未能收敛”,这正是您所尝试的。
根据需要进行修改以允许所需的限制(例如 0-1)。
仅供参考 - 如果您的目标是使置信区间 = 0,则应最小化其绝对值(如果它一开始甚至可以变为负值)。
此外 - 初始估计通常对于最终收敛非常重要。您可能希望一开始就获得更好的初步猜测(例如目标搜索 - 您可以根据需要记录宏/定制)以实现自动化。
PPS - 您提供的代码似乎与示例表不一致 - 鉴于您的目标似乎引用了表中的标题(而其他单元格从第 2 行开始,而不是第 1 行) - 也许这就是您需要做的全部不同。
祝你好运..