我有一个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")
CURRENT OUTPUT:
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
任何帮助将不胜感激。我需要使用的任何模块都可以使代码更简单。我有更多的代码行,其中包含这些数字的不同顺序组合,但如果我能获得不错的知识,那么我应该能够做到。
我还希望能够将此输出打印到文本文件中。最简单的方法是什么?有什么建议?感谢
答案 0 :(得分: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,尽管你可能只是手动抛出在那里,但我不知道你需要这个,是的。是的。
答案 1 :(得分: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
答案 2 :(得分: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()
如果您愿意,请发布您的代码的任何更新,如果这有帮助的话。