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
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 如果有帮助,请更新您的代码。
我有一个 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
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 如果有帮助,请更新您的代码。