0

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

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

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

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

4

3 回答 3

0

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

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

请参阅格式规范迷你语言

于 2017-03-15T02:17:44.770 回答
0

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

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,虽然你可以手动把它扔在那里但我不知道你需要什么为此,是的。

于 2017-03-15T01:58:19.893 回答
0

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()

如果您愿意,请发布您的代码的任何更新,如果这有帮助的话。

于 2017-03-15T02:40:49.183 回答