2

尝试使用 Solver 基础解决以下问题:

给定:范围:{x | x from double} 和点:{(x,y) | x,y 来自双}

查找分段线性函数 - { (a,b) | a,b 来自 double} 其中:

  • 绘制的线性线位于范围的 x 之间。
  • 涵盖所有要点。
  • 图表下方的最小区域。

示例:范围:{1, 2, 3} ,点 {(1,40), (1.5,40), (2.5,70)}

在此处输入图像描述

我的解决方案:

使用 Simplex 最小化以下问题:

foreach 我范围添加:

var ai = new Decision(Domain.RealRange(0, 100), null);
var bi = new Decision(Domain.RealRange(0, 100), null);
model.AddDecisions(a, b);

来自 i 范围内的点的 foreach 点添加约束

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 更好的软件解决方案进行优化。

4

1 回答 1

1

尝试从 OML 字符串加载您的模型,强制单纯形求解器检查您的问题是否是 LP

于 2013-12-04T05:32:27.000 回答