以LP格式编写目标函数和约束

时间:2019-02-15 20:10:42

标签: cplex cvxpy

我正在使用CVXPY解决目标函数。变量是大矩阵。我想创建一个函数,将目标函数和约束写入文本文件,然后可将其用于其他求解器,例如CPLEX。一种方法是将每个变量明确地写为字符串,然后将它们连接起来以创建目标函数。但是,我正在寻找其他方法,以使表达式不会变得太大。例如,如果变量如下:

<div class="input-group w-auto">
  <input type="text" class="form-control" />
</div>

则表达式将为w11 + w12 + w21 + w22。可以想象,如果变量矩阵增长,则表达式也将增长。

有没有一种方法可以将变量初始化为LP格式的矩阵?

1 个答案:

答案 0 :(得分:-1)

用于编写在cplex求解器中使用的文本文件的matlab代码...可能对您有所帮助,如果您有更好的东西,可以将其发布

clc;
clear all;
close all;
%fileID = fopen('test2_in.txt','wt');

filename = fullfile('"E:\...','ex_1.txt'); 

 fileID = fopen('ex_1.txt','w+'); 


formatSpec = 'MAXIMIZE \n Obj:';
fprintf(fileID,formatSpec);


obj_coeff = [0.12 0.15];
%-------------------------------------------------------------------------
% Writing Objective function for the problem
for ii = 1:length(obj_coeff) 
     if ii==length(obj_coeff)
        formatSpec = '(%d) X_%d';
    else
        formatSpec = ' (%d) X_%d +';
    end
    fprintf(fileID,formatSpec,obj_coeff(ii),ii);
end
formatSpec = '\n\nSUBJECT TO \n';
fprintf(fileID,formatSpec);
%-------------------------------------------------------------------------
%-------------------------------------------------------------------------
%writing constraints
temp = 1;
for jj = 1:length(obj_coeff) 
    if jj==length(obj_coeff)
        formatSpec = ' X_%d <= %d\n r %d:';
        fprintf(fileID,formatSpec ,jj,temp+1);
        temp = temp+1;
    else
        formatSpec = ' X_%d +';
        fprintf(fileID,formatSpec,jj);
    end        
end
formatSpec = '\n\n binary\n ';
fprintf(fileID,formatSpec);
for ii = 1:1:length(obj_coeff) 
    formatSpec = 'X_%d ';
    fprintf(fileID,formatSpec,ii); 
end

formatSpec = '\n\nEND';
fprintf(fileID,formatSpec);
fclose(fileID);