【问题标题】:Mixed integer programming looping混合整数规划循环
【发布时间】:2017-03-03 23:21:39
【问题描述】:

我有一个包含 25 个约束和三个下标变量的混合整数程序。有两种类型的变量,一种是整数,一种是二进制。 整数变量称为 Axyz,二进制变量称为 Bxyz。这是我的公式:

目标 A111 + A112 + A113 + A211 + A212 + A213 + ... A252525

约束:第一个约束 A111 + 90 B111 与优化功能相同的问题。以及如何使这个约束输出。

第二个约束: A111 + A112 + A113 + A211 + A212 + A213 + ... A252525 >= 1000 输出。如何编码?

到目前为止,我唯一的代码是针对目标的,并且仅部分由于 A252525 问题而起作用。这里是:

from itertools import product

num = "".join(map(str, range(1, 25)))
l = map(lambda x: 'A' + x, (map('1'.join, product(num, num))))

print (" + ".join(l))

如果你运行它,你会看到它在 A119 之后因为范围而开始重复。要了解我想要什么,您必须运行代码。

我希望输出看起来完全像下面这样。显然那些......是我想要的。输出实际上会包含介于两者之间的所有内容。

A111 + A112 + A113 + A211 + A212 + A213 + ... A252525
A111 + 90 B111 <= 0 
A112 + 90 B112 <= 0 ... A252525 + 90 B252525 <= 0
A111 + A112 + A113 + A211 + A212 + A213 + ... A252525 >= 1000

更新:

这是我想要的确切输出:

A010101 + A010102 + A010103 + A010104 + A010105 + A010106 + A010107 + A010108 + A010109 + A010110 + A020101 + A020102 + A020103 + A020104 + A020105 + A020106 + A020107 + A020108 + A020109 + A020110 + A030101 + A030102 + A030103 + A030104 + A030105 + A030106 + A030107 + A030108 + A030109 + A030110 + A010201 + A010202 + ....... + A030210

x 代表星期几(我们假设这 3 天)
y 代表周(我们假设 2 周)
z 代表推销员(我们假设是 10 个推销员)

这就像在第 1 周的第 1 天,推销员 1 正在工作,依此类推。 在我想要的输出中,如前所述,有三个下标; xyz。所以在我想要的输出中,每个下标分别代表前两个、第二个和第三个两个数字。例如:对于第一项,x 是 01,y 是 01,z 也是 01,对于最后一项,x 是 03,y 是 02,z 是 10。我忘记提到的是我希望用户输入 x、y 和 z 的值。因为我希望用户输入 x=3,y=2,并且 z=10(这代表最后一个术语)。我假设会是这样。 “y” 02 只有在“y”的所有 01 都完成后才会开始,即 A030110。在示例输出中查看此内容。

那么对于第一组约束,它需要是这样的:

A010101 + 90 B010101 <= 0
A010102 + 90 B010102 <= 0 

这将持续到目标中的每一个术语。

不要担心第二组约束。而且你不需要知道约束是什么意思。在这里你不需要知道它是什么意思。

【问题讨论】:

    标签: python python-3.x loops mixed-integer-programming


    【解决方案1】:

    我还是不太明白你这样做的目的是什么。

    无论如何,以下内容将生成您想要的确切输出。我不喜欢 permutations() 的硬编码方式,它是一种 hack,但会产生您想要的数字排列方式。

    def permutations(*args):
        assert len(args) == 3
        for y in args[1]:
            for x in args[0]:
                for z in args[2]:
                    yield ''.join([x, y, z])
    
    two_digit_string = lambda x: '{:02d}'.format(x)
    
    NUM_DOW, NUM_WEEK, NUM_SALESMEN = 3, 2, 10
    dows = tuple(two_digit_string(x) for x in range(1, NUM_DOW+1))
    weeks = tuple(two_digit_string(x) for x in range(1, NUM_WEEK+1))
    salesmen = tuple(two_digit_string(x) for x in range(1, NUM_SALESMEN+1))
    
    l = ('A'+''.join(digits) for digits in permutations(dows, weeks, salesmen))
    print(' + '.join(l))
    

    输出:

    A010101 + A010102 + A010103 + A010104 + A010105 + A010106 + A010107 + A010108 + A010109 + A010110 +
    A020101 + A020102 + A020103 + A020104 + A020105 + A020106 + A020107 + A020108 + A020109 + A020110 +
    A030101 + A030102 + A030103 + A030104 + A030105 + A030106 + A030107 + A030108 + A030109 + A030110 +
    A010201 + A010202 + A010203 + A010204 + A010205 + A010206 + A010207 + A010208 + A010209 + A010210 +
    A020201 + A020202 + A020203 + A020204 + A020205 + A020206 + A020207 + A020208 + A020209 + A020210 +
    A030201 + A030202 + A030203 + A030204 + A030205 + A030206 + A030207 + A030208 + A030209 + A030210
    

    【讨论】:

    • 这没有任何作用。它只是运行代码。根本没有输出。
    • 有一个print() 函数调用将显示类似于所显示的内容。如果没有,你已经改变了一些东西。
    • 我没有改变任何东西。您是否运行了此代码,并且对您有用?
    • 是的,这就是我的答案中显示的输出的生成方式。又做了一次(使用 Python 2.7.13)。但是,在使用 Python 3.6.0 运行时似乎没有做任何事情。你在用什么?
    • 好的。我会尽可能地改变问题。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多