如何用matlab解这个优化问题
发布网友
发布时间:2022-05-02 10:47
我来回答
共1个回答
热心网友
时间:2022-06-19 11:19
fmincon解决不了这个问题,因为约束里面有if。
粒子群和遗传算法这类优化算法什么优化问题都能解决的,就是存在时间过长和每次最优解不相等的问题。
你的模型描述有问题,以下是大致代码:
function obj = ObjectiveFun(x)
%这里是照着max来写的,如果算法是要求min,则要改动
%公式中x是二维变量,但是在优化中需要把二维变量拉为一维变量
%所以传进来的x必须是一维的,索引长度为
%nt(1) + nt(2) + ... + nt(T)
%代码只是个算法流程,没经过调试
%目标函数是双循环求和
%初始化参数
c0 = 0.37;%mu1
c1 = 0.1;%mu3
c2 = 0.9;%mu2
T = 96;%时段数
nt = zeros(T);%初始化nt
delta = zeros(T);%初始化delta
x_a = zeros(T);%初始化x_a
x_d = zeros(T);%初始化x_d
for t = 1:T%每个时段包含的x维数不一样?
nt (t) = 10;%如果x的维数不一样,则要按不一样的来设置
delta(t) = 1.0;
end
x_a(1) = 5.0;
x_d(1) = 7.0;
for t = 2:T
if (x(t - 1) < x_a(t - 1))%模型的x_t-1这么描述有问题,与x是二维变量相矛盾,请确认模型的正确性!!!
x_a(t) = 2 * x_a(t - 1) - x(t - 1);
else
x_a(t) = x_a(t - 1);
end
if (x(t - 1) < x_d(t - 1))%模型的x_t-1这么描述有问题,与x是二维变量相矛盾,请确认模型的正确性!!!
x_d(t) = 2 * x_d(t - 1) - x(t - 1);
else
x_d(t) = x_d(t - 1);
end
end
%x_bar_a = ? %用于判断belta1的取值
%x_bar_d = ? %用于判断belta2的取值
for t = 1:T%每个时段包含的x维数不一样?
for i = 1:nt(t)
r(t,i) = 0.3;%参数rti的值,也可以拉伸为一维变量,这里我延续模型中对rti的定义用二维
end
end
for i = 1:nt(t)
w(i) = 5.0;%参数wi的值
end
index = 0;
obj = 0.0;
for t = 1:T
sum_wx = 0;
for i=1:nt(t)
sum_wx = sum_wx + w(i) * x(index + i);
end
for i = 1:nt(t)%循环t---i
mu1 = c0 * x( index + i);%mu1是x_ti的函数
mu3 = c1 * ln(x(index + i) / r(t,i));%mu3是x_ti的函数
if (sum_wx <= x_bar_a)
mu2 = ln(sum_wx / x_a(t));
elseif (sum_wx >=x_bar_d)
mu2 = ln(sum_wx / x_d(t));
else
mu2 = 0.0;
end
end
obj1 = delta(t) * (mu1 + mu2 + mu3);
obj = obj + obj1;
index = index + nt(t);%index = nt(1) + nt(2) + ... + nt(t)
end
end