FR算法

FR算法将所有的结点看做是电子,每个结点收到两个力的作用:1. 其他结点的库伦力(斥力)2. 边对点的胡克力(引力)。那么在力的相互作用之下,整个布局最终会称为一个平衡的状态。

算法结构:
1. 给所有的点一个初始的随机位置
2. 计算每个点收到其他点的库伦力以及所有边对该点的胡克引力,得到该点受到的最终力。
3. 根据步骤2计算的力得到位置的偏移,调整布局中点的位置。
4. 迭代2,3直到网络区域平衡(全部结点的力的作用力较小),或者迭代达到一定的次数。

对于库伦力的计算:
库伦定理:真空中两个静止的电荷之间的相互作用力,与他们的电荷量的乘机成正比,与他们的距离的平方成反比。
在计算中,我们可以将点的点亮量度看成是1,具体的系数要根据布局图的大小来计算,使其得到一个相对的平衡。
所以,计算库伦力的公式演变成 k1/(distance*distance)

胡克定理:弹性物体的应力与应变成正比。
胡克定理的弹性系数也要根据时机情况而定,使其和库伦力保持一个相对的平衡。
所以,胡克力的公式演变成 k2*(distance – idea_distance)
Idea_distance为预期想要的边的长度。

个人理解:算法最终的结果使得整个网络区域一个平衡的位置,相对是比较对称的,边的长度也比较平衡。但是对于交叉的边边并不一定能够使其错开。所以对于边的交错比较严证的图,并不能很好的处理。如下:

这里写图片描述

但是我在网上看别人的demo跑出来的图,可以将其扭开。感觉代码也只有选取的系数不一样而已。不知道是不是自己的理解有偏差 (~ε(#…

根据提供的引用内容,我们可以了解到FR算法是一种无约束最优化方法,可以用于求解无约束最优化问题。下面是FR算法的Matlab代码实现: ```matlab function [x, fval, exitflag, output] = FR(fun, x0, options) % FR - Fletcher-Reeves conjugate gradient method % [x, fval, exitflag, output] = FR(fun, x0) starts at x0 and attempts to % find a local minimum of the function fun. fun is a function handle. x0 % is a column vector. The function fun(x) should return a scalar value. % % [x, fval, exitflag, output] = FR(fun, x0, options) minimizes with the % default optimization parameters replaced by values in the structure % options, created with the OPTIMOPTIONS function. % % The FR function can be called with a function handle and an initial % guess as follows: % x = FR(@fun, x0); % % The function returns the minimum value of the function and the % corresponding values of the variables. % % The function can also be called with additional options as follows: % options = optimoptions('FR', 'TolFun', 1e-6, 'MaxIter', 1000); % x = FR(@fun, x0, options); % % The available options are: % TolFun - Termination tolerance on the function value (default: 1e-6) % MaxIter - Maximum number of iterations allowed (default: 1000) % % The function returns the following: % x - Minimum value of the function % fval - Value of the function at the minimum % exitflag - Reason for stopping % 1 - Function value below TolFun % 2 - Maximum number of iterations reached % output - Structure containing output information iterations - Number of iterations performed % message - Termination message % % Example: % fun = @(x) x(1)^2 + x(2)^2; % x0 = [3; 4]; % x = FR(fun, x0); % % Reference: % Nocedal, J., & Wright, S. J. (2006). Numerical optimization % (2nd ed.). Springer. % % See also OPTIMOPTIONS. % Set default options defaultOptions.TolFun = 1e-6; defaultOptions.MaxIter = 1000; % Check for user-defined options if nargin < 3 options = []; end % Merge user-defined options with default options options = mergeOptions(defaultOptions, options); % Initialize variables x = x0; fval = fun(x); g = grad(fun, x); d = -g; k = 0; % Main loop while norm(g) > options.TolFun && k < options.MaxIter % Compute step size alpha = linesearch(fun, x, d); % Update variables x = x + alpha*d; fval_old = fval; fval = fun(x); g_old = g; g = grad(fun, x); % Compute beta beta = (g'*g)/(g_old'*g_old); % Update direction d = -g + beta*d; % Update iteration count k = k + 1; end % Set exit flag and output message if norm(g) <= options.TolFun exitflag = 1; message = 'Function value below TolFun'; else exitflag = 2; message = 'Maximum number of iterations reached'; end % Set output structure output.iterations = k; output.message = message; end function g = grad(fun, x) % Compute gradient of function at point x h = 1e-6; n = length(x); g = zeros(n, 1); for i = 1:n e = zeros(n, 1); e(i) = 1; g(i) = (fun(x+h*e) - fun(x-h*e))/(2*h); end end function alpha = linesearch(fun, x, d) % Compute step size using backtracking line search alpha = 1; rho = 0.5; c = 1e-4; fval = fun(x); g = grad(fun, x); while fun(x+alpha*d) > fval + c*alpha*(g'*d) alpha = rho*alpha; end end function options = mergeOptions(defaultOptions, options) % Merge user-defined options with default options if isempty(options) options = defaultOptions; else fields = fieldnames(defaultOptions); for i = 1:length(fields) if ~isfield(options, fields{i}) options.(fields{i}) = defaultOptions.(fields{i}); end end end end ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值