我有一个带有 25 个约束和三个下标变量的混合整数程序。有两种类型的变量,一种是整数,一种是二进制。整数变量称为 Axyz,二进制变量称为 Bxyz。这是我的配方:
目标 A111 + A112 + A113 + A211 + A212 + A213 + ... A252525 <-- 最后一个是问题所在。我不能这样说。所以我需要将它们全部更改为一个下标的三位数字下标。我的意思是A111变成A001001001,A252525变成A025025025,这样编译器就可以读取了。
约束:第一个约束 A111 + 90 B111 <= 0 A112 + 90 B112 <= 0
与优化函数相同的问题。以及如何使这个约束输出。
第二个约束:A111 + A112 + A113 + A211 + A212 + A213 + ... A252525 >= 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(这代表最后一个术语)。我假设会是这样。“y” 02 只有在“y”的所有 01 都完成后才会开始,即 A030110。在示例输出中查看此内容。
然后对于第一组约束,它需要像:
A010101 + 90 B010101 <= 0
A010102 + 90 B010102 <= 0
这将持续到目标中的每一个术语。
不要担心第二组约束。而且你不需要知道约束是什么意思。在这里你不需要知道它是什么意思。