我正在使用MATLAB R2016a遗传算法优化工具箱来优化80个整数值。我有这些限制:
x(80) > x(79) > x(78) > x(77) > x(76) ... x(5) > x(4) > x(3) > x(2) > x(1)
所有整数变量的范围都在1到500之间。我在MATLAB中使用了这段代码:
f = @(x)Cost_function(x, my_data);
num_of_var = 80;
for mx = 1:num_of_var-1
A(mx,:) = [zeros(1,mx-1),1,-1, zeros(1,num_of_var-mx-1)];
end
b = repmat(-3, [num_of_var-1,1]);
lb = ones([num_of_var-1,1]);
up = repmat(500,[num_of_var-1,1]);
options = optimoptions('ga');
options.Display = 'iter';
options.PopulationSize = 200;
options.UseParallel = 0;
IntCon = 1:1:num_of_var;
[x, fval, exitflag] = ga(f, num_of_var, A, b, [], [], lb, up,[] ,IntCon, options);
这段代码是否正确?在某些情况下,此代码返回高于边界的整数。例如,这是第一次返回此代码的成本函数:
11 89 129 136 168 191 208 232 267 299 306 312 312 270 270 293 297 296 283 192 188 239 241 239 226 212 212 301 275 231 221 210 179 182 200 224 227 258 270 264 225 204 183 199 202 236 305 310 313 276 272 259 256 336 329 310 303 303 296 289 275 235 233 232 194 196 203 268 294 313 340 336 333 263 260 257 265 275 409 174964160
否则此输出结构不满足我提到的约束。为什么呢?
答案 0 :(得分:1)
我认为您在谈论结果中的最后一个数字:174964160。这是因为您在num_of_var-1
和num_of_var
的计算中使用lb
代替up
您可能需要进行更多迭代。否则你可以用不同的方式建模。不要将变量x与x(k) <= x(k+1) - 3
一起使用,而是使用变量dx(k)>=3
来表示x(k)
和x(k+1)
之间的差异。