Python 中的混合整数程序

Mixed Integer Program in Python

我有一个 MIP 问题需要在 Python 中输出。到目前为止,请参阅以下尝试。我只需要一些能为我指明正确方向的建议。

digits = [("00"+str(x))[-3:] for x in range(1, 10)]

var_1 = 2
var_2 = 1
var_3 = 3

LHS = [5,6,7]          
RHS = [100,200,300]
count = 1

for v1 in range(var_1):
    for v2 in range(var_2):
        for v3 in range(var_3):
            print("x"+digits[v1]+digits[v2]+digits[v3]+" - 20 z"+digits[v1]+digits[v2]+digits[v3]+" <= 0")

for v2 in range(var_2):
    for v3 in range(var_3):
        print("x"+digits[v2]+digits[v3]+" + "+"x" +digits[v2]+digits[v3]+" <= 123")

当前输出:

x001001001 - 20 z001001001 <= 0
x001001002 - 20 z001001002 <= 0
x001001003 - 20 z001001003 <= 0
x002001001 - 20 z002001001 <= 0
x002001002 - 20 z002001002 <= 0
x002001003 - 20 z002001003 <= 0
x001001 + x001001 <= 123
x001002 + x001002 <= 123
x001003 + x001003 <= 123

我的代码没有产生我想要的结果。这是我希望它产生的输出。

c1: x001001001 - 20 z001001001 <= 0
c2: x001001002 - 20 z001001002 <= 0
c3: x001001003 - 20 z001001003 <= 0
c4: x002001001 - 20 z002001001 <= 0
c5: x002001002 - 20 z002001002 <= 0
c6: x002001003 - 20 z002001003 <= 0
c7: x001001001 + x002001001 <= 123
c8: x001001002 + x002001002 <= 123
c9: x001001003 + x002001003 <= 123

如有任何帮助,我们将不胜感激。我需要用来简化代码的任何模块也会有所帮助。我有更多的代码行,其中包含这些数字的不同顺序组合,但如果我能获得足够的知识,那么我应该能够做到。

我还希望能够将此输出打印到文本文件中。这样做最简单的方法是什么?有什么建议么?谢谢

这是你的代码的一个工作版本,你有大部分正确的东西你只是在这里和那里错过了几个步骤,但是你去吧:

digits = [("00"+str(x))[-3:] for x in range(1, 10)]

var_1 = 2
var_2 = 1
var_3 = 3

LHS = [5,6,7]          
RHS = [100,200,300]
count = 0 # set it to zero for start not 1

for v1 in range(var_1):
    for v2 in range(var_2):
        for v3 in range(var_3):
            count += 1
            print("c"+str(count)+": ",end='') # print the count
            print("x"+digits[v1]+digits[v2]+digits[v3]+" - 20 z"+digits[v1]+digits[v2]+digits[v3]+" <= 0")

for v1 in range(var_1-1): # or just put '1' if you want to but something has to be there
    for v2 in range(var_2):
        for v3 in range(var_3):
            count += 1
            print("c"+str(count)+": ",end='')
            print("x"+digits[v1]+digits[v2]+digits[v3]+" + "+"x" +digits[v1]+digits[v2]+digits[v3]+" <= 123") # I put the digits[v1] in

您只需要实现您的 count 变量,然后在第二部分中您需要放入 for v1 in range(var_1-1): 以便它实际上获得第一个 001,尽管您可以只手动把它扔在那里,但我不知道你需要它做什么,是的。

这是获得你想要的东西的直接方法,但不知道为什么你想要那样,可能还有另一种方法:

var_1 = 2
var_2 = 1
var_3 = 3

count = 1

for v1 in range(var_1):
    for v2 in range(var_2):
        for v3 in range(var_3):
            print('c{0}: x{1:03}{2:03}{3:03} - 20 z{1:03}{2:03}{3:03} <= 0'.format(count,v1+1,v2+1,v3+1))
            count += 1

for v3 in range(var_3):
    print('c{0}: x001001{1:03} + x002001{1:03} <= 123'.format(count,v3+1))
    count += 1

在 Python 3.6 上,使用 f-strings 更简单:

var_1 = 2
var_2 = 1
var_3 = 3

count = 1

for v1 in range(1,var_1+1):
    for v2 in range(1,var_2+1):
        for v3 in range(1,var_3+1):
            print(f'c{count}: x{v1:03}{v2:03}{v3:03} - 20 z{v1:03}{v2:03}{v3:03} <= 0')
            count += 1

for v3 in range(1,var_3+1):
    print(f'c{count}: x001001{v3:03} + x002001{v3:03} <= 123')
    count += 1

参见Format Specification Mini-Language

DD1,您来对地方了。您在这里所需的一切并不那么困难。使用下面的代码作为起点。这是对您的代码的修复。它提供了您需要的输出。其他回复也很有帮助。

for v1 in range(var_1):
    for v2 in range(var_2):
        for v3 in range(var_3):
            print("c"+str(count)+":", end=" ")
            print("x"+digits[v1]+digits[v2]+digits[v3]+" - 20 z"+digits[v1]+digits[v2]+digits[v3]+" <= 0")
            count += 1

for v2 in range(var_2):
    for v3 in range(var_3):
        print("c"+str(count)+":", end=" ")
        print(" + ".join("x"+d+digits[v2]+digits[v3] for d in digits[:var_1]), end = " ")
        print("<= 123")
        count += 1

我建议你看一下三个主题:连接方法、列表推导和列表切片。这些对于您想要的代码类型很有用。

用于将代码保存为文本文件。你可以使用这个:

import sys

orig_stdout = sys.stdout
a = open('filename.txt', 'w')  # w for write
sys.stdout = a

#put your code here

sys.stdout = orig_stdout
file.close()

如果您愿意,post 如果有帮助,请更新您的代码。