首页 > 解决方案 > R中不等式系统的解决方案

问题描述

假设我有以下不等式系统:

  -2x + y <= -3
1.25x + y <= 2.5
        y >= -3

我想找到(x, y)满足上述不等式的多个元组。

library(Rglpk)

obj <- numeric(2)
mat <- matrix(c(-2, 1, 1.25, 1, 0, 1), nrow = 3)
dir <- c("<=", "<=", ">=")
rhs <- c(-3, 2.5, -3)

Rglpk_solve_LP(obj = obj, mat = mat, dir = dir, rhs = rhs)

使用上面的代码似乎只返回 1 个可能的解决方案 tuple (1.5, 0)。是否可以返回其他解决方案元组?

编辑:根据评论,我有兴趣了解是否有任何功能可以帮助我找到角点。

标签: rlinear-programmingsolver

解决方案


实际上,要了解给定问题的可能答案,我们可以尝试以图形方式解决不等式系统。

关于在stackowerflow中绘制R中的不等式有一个很好的答案。使用给定的方法,我们可以绘制下图:

library(ggplot2)

fun1 <- function(x) 2*x - 3        # this is the same as -2x + y <= -3
fun2 <- function(x) -1.25*x + 2.5  # 1.25x + y <= 2.5
fun3 <- function(x) -3             # y >= -3
x1 = seq(-1,5, by = 1/16)
mydf = data.frame(x1, y1=fun1(x1), y2=fun2(x1),y3= fun3(x1))
mydf <-  transform(mydf, z = pmax(y3,pmin(y1,y2)))
ggplot(mydf, aes(x = x1)) + 
  geom_line(aes(y = y1), colour = 'blue') +
  geom_line(aes(y = y2), colour = 'green') +
  geom_line(aes(y = y3), colour = 'red') +
  geom_ribbon(aes(ymin=y3,ymax = z), fill = 'gray60')

在此处输入图像描述

所有可能的(数量无限)元组都位于灰色三角形内。可以使用以下代码找到顶点。

obj <- numeric(2)
mat <- matrix(c(-2, 1.25, 1, 1), nrow = 2)
rhs <- matrix(c(-3, 2.5), nrow = 2)

aPoint <- solve(mat, rhs)

mat <- matrix(c(-2, 0, 1, 1), nrow = 2)
rhs <- matrix(c(-3, -3), nrow = 2)

bPoint <- solve(mat, rhs)

mat <- matrix(c(1.25, 0, 1, 1), nrow = 2)
rhs <- matrix(c(2.5, -3), nrow = 2)

cPoint <- solve(mat, rhs) 

注意矩阵参数的顺序。

你得到坐标:

> aPoint
          [,1]
[1,] 1.6923077
[2,] 0.3846154
> bPoint
     [,1]
[1,]    0
[2,]   -3
> cPoint
     [,1]
[1,]  4.4
[2,] -3.0

推荐阅读