%% En este programa se generan requerimientos por PICKUP y DELIVERY
%% representados por un vector de 2 dimensiones 
%% (1 coordenada pickup y 1 coordenada para el delivery).

%% EL LARGO DE LA CALLE ES 9 Km
%% SE SUPONE QUE HAY 20 REQUERIMIENTOS EN TOTAL, (10 con un patron y 10 con
%% otro)


%% Aca se definen los centros y los radios de las zonas.

%% Zona 1.
rp1=1; %% Radio en que ocurre el pickup
rd1=4; %% Radio de la zona del delivery, Noten que al ser distintos quedar una elipse
xp1=2; %% Coordenada X del centro de pickup (patron)
xd1=6; %% Coordenada X del centro de delivery (patron)
N1=10; %% Cantidad de requerimientos.
pick1=[rp1*(rand(N1,1)-0.5)+xp1]; 
deli1=[rd1*(rand(N1,1)-0.5)+xd1];

%% Zona 2.
rp2=2; %% Radio en que ocurre el pickup
rd2=2; %% Radio de la zona del delivery. Noten que con radios iguales queda un circulo.
xp2=8; %% Coordenada X del centro de pickup
xd2=4; %% Coordenada X del centro de delivery 
N2=10; %% Cantidad de requerimientos
pick2=[rp2*(rand(N2,1)-0.5)+xp2];
deli2=[rd2*(rand(N2,1)-0.5)+xd2];


figure 
plot(pick1,deli1,'k+')
hold on
plot(pick2,deli2,'ko' )
axis([0 10 0 10])
title('Llamadas tipo, + patron 1, o patron 2')
xlabel('Pickup [km]')
ylabel('Delivery [km]')


data= [[pick1;pick2] [deli1;deli2]]; %% aca se junta toda la data
data=0.1*round(10*data); % aca se hace que las coordenadas queden con un decimal.

%% Se buscan los viajes tpicos entre zonas
%% Con dos clusters (un viaje tipo)
Nclus=2; %% Aca se fija el nmero de clusters
[center,U,obj_fcn] = fcm(data, Nclus); %%fcm es Fuzzy-C means, vean en la ayuda de Matlab mas ejemplos.


%% GRADOS DE PERTENENCIA U
figure
plot3(data(:,1),data(:,2),U(1,:),'k+') %En el plano XY pickup-delivery, en Z el gr. de pertenencia al cluster 1
hold on
plot3(data(:,1),data(:,2),U(2,:),'ko') %En el plano XY pickup-delivery, en Z el gr. de pertenencia al cluster 2

%Entonces recuerden que queremos proyectar U(X,Y) en los planos XZ e YZ.

figure
plot(data(:,1),U(1,:),'ko') %Pickup versus funcion de pertenencia cluster 1.
hold on
plot(data(:,1),U(2,:),'ko') %Pickup versus funcion de pertenencia cluster 2.


figure
plot(data(:,2),U(1,:),'ko') %Delivery versus funcion de pertenencia cluster 1.
hold on
plot(data(:,2),U(2,:),'ko') %Delivery versus funcion de pertenencia cluster 2.


% Ahora que tenemos los dibujos, queremos ajustar alguna funcin de
% pertenencia adecuada a la geometria de los datos. 

% Usualmente se ocupan gaussianas donde la media est dada por el centro
% del cluster (valor entregado por FCM), pero si queremos ajustar cualquier
% otra funcion que queramos, el comando que sirve es nlinfit.

% Primero: se define la funcin que queremos ajustar. Los parmetros de
% ajuste es el vector p, y x son los valores que toma la funcin.
% las funciones las pueden escribir ustedes, o bien, ocupar alguna
% predefinida:

%modelFun =  @(p,x)sigmf(x,[p(1) p(2)]); % Sigmoidal
modelFun =  @(p,x)gaussmf(x,[p(1) p(2)]); % Gaussiana

% nlinfit es algoritmo numrico iterativo de ajuste no lineal, que requiere
% un punto de inicio adecuado. Ojo que cuando hay pocos datos es super
% importante tomar un buen valor inicial para que el algoritmo converja.

startingVals = [1 5]; %Valor inicial
coefEsts11 = nlinfit(data(:,1), U(1,:)', modelFun, startingVals); %Cluster1, pickup
coefEsts12 = nlinfit(data(:,1), U(2,:)', modelFun, startingVals); %Cluster1, delivery
coefEsts21 = nlinfit(data(:,2), U(1,:)', modelFun, startingVals); %Cluster2, pickup
coefEsts22 = nlinfit(data(:,2), U(2,:)', modelFun, startingVals); %Cluster2, delivery

% En coefEsts se tiene los coeficientes de la funcin no lineal que
% ajustamos. Ahora graficaremos los datos junto a las gaussianas que
% ajustamos.

xgrid = linspace(0,9,100); % 100 datos entre 0 y 9.

figure
line(xgrid, modelFun(coefEsts11, xgrid), 'Color','r');
hold on
line(xgrid, modelFun(coefEsts12, xgrid), 'Color','b');
plot(data(:,1), U(1,:)','ro')
plot(data(:,1), U(2,:)','bo')
xlabel('Pickup [Km]')
ylabel('Membership function')
hold off

figure
line(xgrid, modelFun(coefEsts21, xgrid), 'Color','r');
hold on
line(xgrid, modelFun(coefEsts22, xgrid), 'Color','b');
plot(data(:,2), U(1,:)','ro')
plot(data(:,2), U(2,:)','bo')
xlabel('Delivery [Km]')
ylabel('Membership function')
hold off





