循环的混合整数编程

时间:2017-03-03 23:21:39

标签: python python-3.x loops mixed-integer-programming

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

这将继续目标中的每个术语。

不要担心第二组限制。而且你不需要知道约束的含义。在这里,您不需要知道它的含义。

1 个答案:

答案 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