【发布时间】:2013-12-04 13:32:27
【问题描述】:
尝试使用 Solver 基础解决以下问题:
给定: 范围:{x | x from double} 和点:{(x,y) | x,y 来自双}
求分段线性函数 - { (a,b) | a,b from double} 其中:
- 绘制的直线位于范围的 x 之间。
- 涵盖所有要点。
- 图表下的最小面积。
示例: 范围:{1, 2, 3} ,点 {(1,40), (1.5,40), (2.5,70)}
我的解决方案:
用 Simplex 最小化以下问题:
foreach i 范围添加:
var ai = new Decision(Domain.RealRange(0, 100), null);
var bi = new Decision(Domain.RealRange(0, 100), null);
model.AddDecisions(a, b);
从 i 范围内的点中获取点添加约束
model.AddConstraints("c{0}".F(pointIdx), a * point.x + b >= point.y);
然后添加目标:
model.AddGoal("area", GoalKind.Minimize, goal);
并得到解决方案:
var solution = context.Solve(new SimplexDirective());
该解决方案有效地给了我一个正确的答案,但对于简单的情况需要很多时间,它需要 130 毫秒。你能告诉我我做错了什么吗?我在哪里可以优化? Simplex 方法是否适合这种情况? 我们是否有比 SolverFoundation 更好的软件解决方案进行优化。
【问题讨论】:
-
如果大部分时间都花在设置问题上,我不会太惊讶。您是否针对大量变量对问题进行了基准测试?
-
您可以尝试使用索引决策而不是标量决策。解释在这里:nathanbrixius.wordpress.com/2011/07/18/…
-
@AndersGustafsson 我给你的时间来自。解决方案.GetReport()