我正在使用CVXPY解决目标函数。变量是大矩阵。我想创建一个函数,将目标函数和约束写入文本文件,然后可将其用于其他求解器,例如CPLEX。一种方法是将每个变量明确地写为字符串,然后将它们连接起来以创建目标函数。但是,我正在寻找其他方法,以使表达式不会变得太大。例如,如果变量如下:
<div class="input-group w-auto">
<input type="text" class="form-control" />
</div>
则表达式将为w11 + w12 + w21 + w22。可以想象,如果变量矩阵增长,则表达式也将增长。
有没有一种方法可以将变量初始化为LP格式的矩阵?
答案 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);