问题记录
使用matlab+yalmip+cplex求解一个线性的整数规划问题时,遇到了程序运行时间特别长,但从求解器输出的信息看,求解时间并不长的问题。这意味着程序在运行期间可能经过了很长时间的问题建模与求解预处理。
反复调试后发现问题可能是出在添加约束部分的代码上。
问题案例
以下是一个简化的问题案例:
1 | n = 100; |
在添加约束时,这里使用了循环的方式,将每个约束逐个添加到约束集合中。这种方式在约束数量较少时不会有太大问题,但当约束数量较多时,会导致程序运行时间过长。此外约束会随迭代次数改变,在没有预分配内存的情况下,会导致内存频繁分配与释放,降低程序运行效率。
因此,在添加约束的代码中应当尽量避免循环,而是使用向量化的方式。
优化方案
以下是优化后的代码:
1 | n = 100; |
在这里,将约束向量化,直接将矩阵A与向量x相乘,得到一个m维的列向量,然后与向量b进行比较,得到一个m维的列向量,这个列向量即为约束条件。采用这种方式不仅能让代码更加简洁,程序的运行效率也会大大提高。