我有一个带有25个约束和三个下标变量的混合整数程序。有两种类型的变量,一种是整数,一种是二进制。 整数变量称为Axyz,二进制称为Bxyz。这是我的表述:
目标A111 + A112 + A113 + A211 + A212 + A213 + ... A252525< - 最后一个是问题所在。我不能这样说。因此,我需要将所有这些更改为一个下标的三位下标。我的意思是A111变为A001001001,A252525变为A025025025,因此编译器可以读取它。
约束:第一个约束
A111 + 90 B111 <= 0
A112 + 90 B112&lt; = 0
同样的问题将在这里作为优化功能。以及如何进行此约束输出。
第二个约束: A111 + A112 + A113 + A211 + A212 + A213 + ... A252525&gt; = 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(这是代表最后一个术语的内容)。我假设它会是怎样的。 &#34; y&#34; 02只会在所有01开始时为#34; y&#34;完成,这将是A030110。在样本输出中看到这一点。
然后对于第一组约束,它需要像:
A010101 + 90 B010101 <= 0
A010102 + 90 B010102 <= 0
这将继续目标中的每个术语。
不要担心第二组限制。而且你不需要知道约束的含义。在这里,您不需要知道它的含义。
答案 0 :(得分:0)
我仍然不明白你的目的是什么。
无论如何,以下内容将生成您想要的确切输出。我不喜欢permutations()
被硬编码的方式,而且它是一个黑客攻击,但会产生按照你想要的方式排列的数字排列。
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