如何使用TridentGoalSeek处理数组求解最优因子使余额趋近于0
问题概述
核心计算需求
- 待处理数组为固定规则的几何序列:首元素恒为1,后续每一项等于前一项乘以待求解的因子值,数组最大长度不超过20
- 余额计算规则:数组所有元素求和后,用用户自定义的初始资本值减去该总和,即为最终余额
- 寻优目标:调整生成数组所用的因子值,让最终余额尽可能趋近于0
开发背景
- 刚接触Visual Studio一周,编程、IDE操作属于完全新手阶段
- TridentGoalSeek是安装的第一个NuGet包
- 这是第一次在Stack Overflow发布技术问题
已尝试的实现方案
原始数组计算代码
最初用于生成数组的基础逻辑实现如下:
static void CalcTurns() { int i = 1; do { Turn[i] = Turn[i - 1] * rate; Player1.TotalPlayed += Turn[i]; Player1.Balance = Player1.Capital - Player1.TotalPlayed; i++; } while (Player1.TotalPlayed + Turn[i - 1] * rate < Player1.Capital); }
步长递增式自行寻优实现
参考@The General的评论尝试自行实现求解逻辑:保留原有计算方法用于结果对比,选择极小步长(minewt)递增因子以提升精度,该方案最终未达到预期效果,对应代码如下:
static void GoalSeek() { while (Player1.Balance > 1) { dynamicRate += 0.000001f; int i = 1; do { Turn[i] = Turn[i - 1] * dynamicRate; Player1.TotalPlayed += Turn[i]; Player1.Balance = Player1.Capital - Player1.TotalPlayed; i++; } while (Player1.TotalPlayed + Turn[i - 1] * dynamicRate < Player1.Capital); } }
递归版本寻优实现
后续又尝试通过递归方式实现求解逻辑,遇到的问题为:当用户输入资本值较大时会触发「Stack Overflow」栈溢出错误,仅小数值输入可正常运行,对应递归版本实现代码如下:
static void CalcTurns(decimal factor, float _balance, float _totalPlayed) { int i = 1; while (_totalPlayed + (Turn[i-1] * (float)factor) < Player1.Capital) { Turn[i] = Turn[i - 1] * (float)factor ; _totalPlayed += Turn[i]; _balance = Player1.Capital - _totalPlayed; Player1.Turns++; Player1.Balance = _balance; Player1.TotalPlayed = _totalPlayed; i++; } if (_balance > 0.1) { dynamicRate += 0.0001m; CalcTurns(dynamicRate , Player1.Capital - minBet , minBet); } }
待解决需求
希望掌握TridentGoalSeek的正确使用方法,完成上述因子寻优计算,让最终余额尽可能趋近于0。
内容的提问来源于stack exchange,提问作者SS24_7
相关产品推荐
相关产品推荐

