我正在尝试使用SWI-Prolog simplex library来求解一个以实数集为域的线性方程组。有没有人知道为什么下面的查询不成功?
maximize(
[],
state(
0,
[],
[
c(0,
[- 0.95*x(3),0.05*x(0),0.05*x(1),0.05*x(2)],
=,
1479754163278877r9007199254740992),
c(0,
[0.95*x(2),- 0.05*x(0),- 0.05*x(1),- 0.05*x(3)],
=,
185786871969449310676024028079063r3975352282315727403093661252059136
),
c(0,
[0.95*x(1),- 0.05*x(0),- 0.05*x(2),- 0.05*x(3)],
=,
756128230024134313216574233897861r15901409129262909612374645008236544
),
c(0,
[0.95*x(0),- 0.05*x(1),- 0.05*x(2),- 0.05*x(3)],
=,
294112628726237r72057594037927936
)
],
[]
),
S).
我打算解决的系统如下:
0.05*x(0)+0.05*x(1)+0.05*x(2)-0.95*x(3)
=
1479754163278877/9007199254740992
- 0.05*x(0)- 0.05*x(1)+0.95*x(2)- 0.05*x(3)
=
185786871969449310676024028079063/3975352282315727403093661252059136
- 0.05*x(0)+0.95*x(1)- 0.05*x(2)- 0.05*x(3)
=
756128230024134313216574233897861/15901409129262909612374645008236544
0.95*x(0)- 0.05*x(1)- 0.05*x(2)- 0.05*x(3)
=
294112628726237/72057594037927936
或者,你能知道用Prolog解决这个问题的更好方法吗?
发布于 2021-01-06 16:12:29
看起来求解器假设所有变量都是非负的。所以问题变成了:我们能否将x
是自由变量的Ax=b
重新表述为使用非负变量的东西?答案是:是的。使用称为变量拆分的技术,我们可以将每个x(j)
替换为xplus(j)-xmin(j)
where xplus(j),xmin(j)>=0
。因此方程系统就变成了:
sum(j, a(i,j)*(xplus(j)-xmin(j))) = b(i) for all i
xplus(j),xmin(j)>=0
我们可能需要确保(xplus(j),xmin(j))
对中只有一个可以成为非零。这可以自动保持,因为如果两者都在基矩阵B中,则基矩阵B将变为奇数。但我们也可以设定一个目标来处理这个问题:
min sum(j, xplus(j)+xmin(j))
只要方程组有一个可行解,目标就会确保只有一个(xplus(j),xmin(j))
是非零的。
https://stackoverflow.com/questions/65583359
复制