【问题标题】:Integer Programs - How to force the solution to be in multiples of an integer?整数程序 - 如何强制解为整数的倍数?
【发布时间】:2015-07-30 16:05:40
【问题描述】:

因此,我正在尝试创建具有最佳解决方案的 IP,其中所有变量都是整数,并且都是数字的倍数,例如 3。(因此解决方案中的变量必须为 0, 3、6、9、12等)

我在 R 中编写代码,很容易设置解决方案必须为整数的约束 (all.int = TRUE),但我不确定如何将其设置为数字的倍数。我必须在 Ax

【问题讨论】:

    标签: r constraints mathematical-optimization integer-programming


    【解决方案1】:

    为此,您可以定义一些整数变量 x,然后定义 y = 3*x。现在y 是整数和 3 的倍数。

    例如,考虑一个平凡的 IP,它找到小于或等于 10 的 3 的最大倍数(当然,这里的主要动机是将其嵌入到更复杂的整数程序中)。你可以这样做:

    library(lpSolve)
    mod <- lp(direction = "max",
              objective.in = c(0, 1),  # (x, y)
              const.mat = rbind(c(3, -1),  # 3x - y = 0
                                c(0, 1)),  # y <= 10
              const.dir = c("=", "<="),
              const.rhs = c(0, 10),
              all.int = TRUE)
    mod$solution[2]
    # [1] 9
    

    【讨论】:

    • 哇,谢谢!这真的很有帮助!所以我必须添加一个新变量 [所以在 const.mat 中添加一个新列,在本例中为 'y'] 以将解决方案 'x' 锁定为倍数?
    • @Timothy 我们定义了y = 3x 所以y 是3 的倍数的变量。
    【解决方案2】:

    据我了解,您的标准是答案的 mod 3 为 0。如果是这样, mod(intResult,3) == 0 呢?

    由于我不是用你的语言写的,上面可能不是有效的 R,但我想你会明白的,因为上面是有效的 C,假设 mod 是返回 intResult 模的函数的名称3.

    【讨论】:

    • OP 已指定这是一个整数规划问题,因此所有约束在变量中必须是线性的。模函数不是其输入的线性函数,因此不能在这里使用。
    • 我刚刚再次阅读了OP的问题,并没有提到函数必须是线性的要求。由于模返回一个整数,它应该是公平的游戏。让我们看看 OP 为自己说了什么。
    • 标题以“整数程序”开头,问题以“所以我正在尝试创建这个IP”开头,问题被标记为“整数编程”,所以很明显这个是一个整数规划问题。从the wiki article 可以看出,整数程序中的所有约束在决策变量中必须是线性的。
    • Mod 是整数运算。获得生命。
    • 我没有说“整数运算”,我说的是“决策变量的线性函数”。整数程序可以包含像“3x = 3”这样的约束,因为函数“3x”和“x-2y”是变量的线性函数;例如当 x 取值 1、2、3、4、5 时,函数“3x”取值 3、6、9、12、15(线性变化)。 “x mod 3”不具有此属性,对输入 1、2、3、4、5 取值 1、2、0、1、2(非线性)。线性约束是 IP 的基本属性。由于您似乎对 IP 不熟悉,因此我建议您在 cmets 中采取不那么好斗的语气。
    猜你喜欢
    • 1970-01-01
    • 2011-07-22
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    • 2018-07-06
    相关资源
    最近更新 更多