0

我有一个带有 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 

这将持续到目标中的每一个术语。

不要担心第二组约束。而且你不需要知道约束是什么意思。在这里你不需要知道它是什么意思。

4

1 回答 1

0

我还是不太明白你这样做的目的是什么。

无论如何,以下内容将生成您想要的确切输出。我不喜欢这种方式permutations()是硬编码的,它是一种 hack,但会产生你想要的数字排列。

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
于 2017-03-04T02:24:56.417 回答