2011|08|
2013|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|05|06|07|08|09|10|11|12|
2016|01|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|

2018-07-20 ワーシャル-フロイド法(応用) [長年日記]

/*
  gcc -g wf4.cpp -o wf4
 
  ワーシャル-フロイド法(その4)
 
  参考:ゼオスTTのブログ
  http://zeosutt.hatenablog.com/entry/2015/05/05/045943
 
*/
 
#include <stdio.h>
#include <math.h>
#include <stdlib.h> 
 
typedef struct location{
  // ちなみに X,Y 軸座標は、→に+  ↑に+
  int num;
  char name[10];
  double longitude; // 経度 東経 139.691 X軸  
  double latitude;  // 緯度 北緯 35.698  Y軸 
} LOCATION;
 
LOCATION location[] = {
  {0,"A",35.896889, 139.966776},
  {1,"B",35.911303, 139.950609},
  {2,"C",35.902413, 139.950861},
  {3,"D",35.905665, 139.945430},
  {4,"E",35.891797, 139.959714},
  {5,"F",35.888019, 139.949214},
  {6,"G",35.887682, 139.945090},
  {7,"H",35.900693, 139.938919},
  {8,"I",35.898430, 139.932503},
  {9,"J",35.899640, 139.919513},
  {10,"K",35.893257, 139.934952},
  {11,"L",35.892819, 139.943374},
  {12,"M",35.887158, 139.922399},
  {13,"N",35.893778, 139.952453}
};
 
#define rad2deg(a) ((a)/M_PI * 180.0) /* rad を deg に換算するマクロ関数 */
#define deg2rad(a) ((a)/180.0 * M_PI) /* deg を rad に換算するマクロ関数 */
 
double distance_km(LOCATION* A, LOCATION* B, double *rad_up)
{
  double earth_r = 6378.137;
  
  double loRe = deg2rad(B->longitude - A->longitude); // 東西
  double laRe = deg2rad(B->latitude - A->latitude); // 南北
  
  double EWD = cos(deg2rad(A->latitude))*earth_r*loRe; // 東西距離
  double NSD = earth_r*laRe; //南北距離
  
  double distance = sqrt(pow(NSD,2)+pow(EWD,2));  
  *rad_up = atan2(NSD, EWD);
  
  return distance;
}
 
LOCATION* new_location(LOCATION* D, double diff_p_x, double diff_p_y) 
{
  double earth_r = 6378.137;
  
  double loRe = diff_p_x / earth_r / cos(deg2rad(D->latitude)); // 東西
  double laRe = diff_p_y / earth_r;  // 南北
  
  double diff_lo = rad2deg(loRe); // 東西
  double diff_la = rad2deg(laRe); // 南北
  
  static LOCATION C;
  
  C.longitude = D->longitude + diff_lo; // 東西
  C.latitude = D->latitude + diff_la; // 南北
  
  return &C;
}
 
double diff_longitude(double diff_p_x, double latitude) 
{
  double earth_r = 6378.137;
  // ↓ これが正解だけど、
  double loRe = diff_p_x / earth_r / cos(deg2rad(latitude)); // 東西
  // 面倒なので、これで統一しよう(あまり差が出ないしね)
  //double loRe = diff_p_x / earth_r / cos(deg2rad(35.700759)); // 東西
  double diff_lo = rad2deg(loRe); // 東西
  
  return diff_lo; // 東西
}
 
double diff_latitude(double diff_p_y) 
{
  double earth_r = 6378.137;
  double laRe = diff_p_y / earth_r;  // 南北
  double diff_la = rad2deg(laRe); // 南北
  
  return diff_la; // 南北
}
 
 
 
double d[14][14];  // d[i][k]:ノードiからノードkへの距離 
int next[14][14];  // ノードi から ノードj への最短経路における i の1つ後のノード
 
int main(void)
{
  // 変数の初期化
  for(int i = 0; i < 14; i++){
	for(int j = 0; j < 14; j++){
	  d[i][j] = 99999999.9; // 距離の初期化(でっかい値を入力しておく(INT_MAXは足し算の時に桁上がりが起こるので使わない)
	  next[i][j] = j; // ノードi から ノードj への最短経路における i の1つ後のノード
	}
  }
 
 
  // 確認用の表示
  printf("\n[STEP1]\n");
 
  for(int i = 0; i < 14; i++){
	for(int k = 0; k < 14; k++){
	  printf("d[%d][%d]):%f\t",i,k,d[i][k]);
	  printf("next[%d][%d]):%d\n",i,k,next[i][k]);
	}
  }
 
  //// ここからは実際の距離を手書き
 
  for(int i = 0; i < 14; i++){
	d[i][i] = 0; //// 同じノードへの距離は0になるので、上書き
  }
 
  double rad_up;
  d[0][1]  = distance_km(&location[0], &location[1], &rad_up);
  d[0][4]  = distance_km(&location[0], &location[4], &rad_up);
 
  d[1][0]  = distance_km(&location[1], &location[0], &rad_up);
  d[1][3]  = distance_km(&location[1], &location[3], &rad_up);
 
  d[2][3]  = distance_km(&location[2], &location[3], &rad_up);
  d[2][4]  = distance_km(&location[2], &location[4], &rad_up);
  d[2][13]  = distance_km(&location[2], &location[13], &rad_up);
 
  d[3][1]  = distance_km(&location[3], &location[1], &rad_up);
  d[3][2]  = distance_km(&location[3], &location[2], &rad_up);
  d[3][7]  = distance_km(&location[3], &location[7], &rad_up);
 
  d[4][0]  = distance_km(&location[4], &location[0], &rad_up);
  d[4][2]  = distance_km(&location[4], &location[2], &rad_up);
  d[4][13]  = distance_km(&location[4], &location[13], &rad_up);
 
  d[5][4]  = distance_km(&location[5], &location[4], &rad_up);
  d[5][6]  = distance_km(&location[5], &location[6], &rad_up);
  d[5][13]  = distance_km(&location[5], &location[13], &rad_up);
 
  d[6][5]  = distance_km(&location[6], &location[5], &rad_up);
  d[6][11]  = distance_km(&location[6], &location[11], &rad_up);
  d[6][12]  = distance_km(&location[6], &location[12], &rad_up);
 
  d[7][3]  = distance_km(&location[7], &location[3], &rad_up);
  d[7][8]  = distance_km(&location[7], &location[8], &rad_up);
  d[7][11]  = distance_km(&location[7], &location[11], &rad_up);
 
  d[8][7]  = distance_km(&location[8], &location[7], &rad_up);
  d[8][9]  = distance_km(&location[8], &location[9], &rad_up);
  d[8][10]  = distance_km(&location[8], &location[10], &rad_up);
 
  d[9][8]  = distance_km(&location[9], &location[8], &rad_up);
 
  d[10][8]  = distance_km(&location[10], &location[8], &rad_up);
  d[10][11]  = distance_km(&location[10], &location[11], &rad_up);
 
  d[11][6]  = distance_km(&location[11], &location[6], &rad_up);
  d[11][7]  = distance_km(&location[11], &location[7], &rad_up);
  d[11][10]  = distance_km(&location[11], &location[10], &rad_up);
 
  d[12][6]  = distance_km(&location[12], &location[6], &rad_up);
 
  d[13][2]  = distance_km(&location[13], &location[2], &rad_up);
  d[13][4]  = distance_km(&location[13], &location[4], &rad_up);
  d[13][5]  = distance_km(&location[13], &location[5], &rad_up);
 
  
  // 確認用の表示
  printf("\n[STEP2]\n");
 
  for(int i = 0; i < 14; i++){
	for(int k = 0; k < 14; k++){
	  printf("d[%d][%d]):%f\t",i,k,d[i][k]);
	  printf("next[%d][%d]):%d\n",i,k,next[i][k]);
	}
  }
 
  // 経路長計算
  for (int k =0; k < 14; k++){
	for (int i =0; i < 14; i++){
	  for(int j = 0; j < 14; j++){
		if(d[i][j] > d[i][k] + d[k][j]){
 
		  d[i][j] = d[i][k] + d[k][j];
		  next[i][j] = next[i][k]; //更新処理
		}
	  }
	}
  }
 
  // 計算結果
  printf("\n[STEP3]\n");
 
  for(int i = 0; i < 14; i++){
	for(int k = 0; k < 14; k++){
	  printf("d[%d][%d]):%f\t",i,k,d[i][k]);
	  printf("next[%d][%d]):%d\n",i,k,next[i][k]);
	}
  }
 
  // 経路パス表示
 
  printf("\n[Path]\n");
  for(int i = 0; i < 14; i++){
	for(int k = 0; k < 14; k++){
	  
	  int cur;
	  printf("d[%d][%d]: ",i,k);
	  
	  for (cur = i; cur != k; cur = next[cur][k]){
        printf("%d -> ", cur);
	  }
	  printf("%d\n", k);
	}
  }
}
syntax2html
/*
  gcc -g wf4.cpp -o wf4
 
  ワーシャル-フロイド法(その4)
 
  参考:ゼオスTTのブログ
  http://zeosutt.hatenablog.com/entry/2015/05/05/045943
 
*/
 
#include <stdio.h>
#include <math.h>
#include <stdlib.h> 
 
typedef struct location{
  // ちなみに X,Y 軸座標は、→に+  ↑に+
  int num;
  char name[10];
  double longitude; // 経度 東経 139.691 X軸  
  double latitude;  // 緯度 北緯 35.698  Y軸 
} LOCATION;
 
LOCATION location[] = {
  {0,"A",35.896889, 139.966776},
  {1,"B",35.911303, 139.950609},
  {2,"C",35.902413, 139.950861},
  {3,"D",35.905665, 139.945430},
  {4,"E",35.891797, 139.959714},
  {5,"F",35.888019, 139.949214},
  {6,"G",35.887682, 139.945090},
  {7,"H",35.900693, 139.938919},
  {8,"I",35.898430, 139.932503},
  {9,"J",35.899640, 139.919513},
  {10,"K",35.893257, 139.934952},
  {11,"L",35.892819, 139.943374},
  {12,"M",35.887158, 139.922399},
  {13,"N",35.893778, 139.952453}
};
 
#define rad2deg(a) ((a)/M_PI * 180.0) /* rad を deg に換算するマクロ関数 */
#define deg2rad(a) ((a)/180.0 * M_PI) /* deg を rad に換算するマクロ関数 */
 
double distance_km(LOCATION* A, LOCATION* B, double *rad_up)
{
  double earth_r = 6378.137;
  
  double loRe = deg2rad(B->longitude - A->longitude); // 東西
  double laRe = deg2rad(B->latitude - A->latitude); // 南北
  
  double EWD = cos(deg2rad(A->latitude))*earth_r*loRe; // 東西距離
  double NSD = earth_r*laRe; //南北距離
  
  double distance = sqrt(pow(NSD,2)+pow(EWD,2));  
  *rad_up = atan2(NSD, EWD);
  
  return distance;
}
 
LOCATION* new_location(LOCATION* D, double diff_p_x, double diff_p_y) 
{
  double earth_r = 6378.137;
  
  double loRe = diff_p_x / earth_r / cos(deg2rad(D->latitude)); // 東西
  double laRe = diff_p_y / earth_r;  // 南北
  
  double diff_lo = rad2deg(loRe); // 東西
  double diff_la = rad2deg(laRe); // 南北
  
  static LOCATION C;
  
  C.longitude = D->longitude + diff_lo; // 東西
  C.latitude = D->latitude + diff_la; // 南北
  
  return &C;
}
 
double diff_longitude(double diff_p_x, double latitude) 
{
  double earth_r = 6378.137;
  // ↓ これが正解だけど、
  double loRe = diff_p_x / earth_r / cos(deg2rad(latitude)); // 東西
  // 面倒なので、これで統一しよう(あまり差が出ないしね)
  //double loRe = diff_p_x / earth_r / cos(deg2rad(35.700759)); // 東西
  double diff_lo = rad2deg(loRe); // 東西
  
  return diff_lo; // 東西
}
 
double diff_latitude(double diff_p_y) 
{
  double earth_r = 6378.137;
  double laRe = diff_p_y / earth_r;  // 南北
  double diff_la = rad2deg(laRe); // 南北
  
  return diff_la; // 南北
}
 
 
 
double d[14][14];  // d[i][k]:ノードiからノードkへの距離 
int next[14][14];  // ノードi から ノードj への最短経路における i の1つ後のノード
 
int main(void)
{
  // 変数の初期化
  for(int i = 0; i < 14; i++){
	for(int j = 0; j < 14; j++){
	  d[i][j] = 99999999.9; // 距離の初期化(でっかい値を入力しておく(INT_MAXは足し算の時に桁上がりが起こるので使わない)
	  next[i][j] = j; // ノードi から ノードj への最短経路における i の1つ後のノード
	}
  }
 
 
  // 確認用の表示
  printf("\n[STEP1]\n");
 
  for(int i = 0; i < 14; i++){
	for(int k = 0; k < 14; k++){
	  printf("d[%d][%d]):%f\t",i,k,d[i][k]);
	  printf("next[%d][%d]):%d\n",i,k,next[i][k]);
	}
  }
 
  //// ここからは実際の距離を手書き
 
  for(int i = 0; i < 14; i++){
	d[i][i] = 0; //// 同じノードへの距離は0になるので、上書き
  }
 
  double rad_up;
  d[0][1]  = distance_km(&location[0], &location[1], &rad_up);
  d[0][4]  = distance_km(&location[0], &location[4], &rad_up);
 
  d[1][0]  = distance_km(&location[1], &location[0], &rad_up);
  d[1][3]  = distance_km(&location[1], &location[3], &rad_up);
 
  d[2][3]  = distance_km(&location[2], &location[3], &rad_up);
  d[2][4]  = distance_km(&location[2], &location[4], &rad_up);
  d[2][13]  = distance_km(&location[2], &location[13], &rad_up);
 
  d[3][1]  = distance_km(&location[3], &location[1], &rad_up);
  d[3][2]  = distance_km(&location[3], &location[2], &rad_up);
  d[3][7]  = distance_km(&location[3], &location[7], &rad_up);
 
  d[4][0]  = distance_km(&location[4], &location[0], &rad_up);
  d[4][2]  = distance_km(&location[4], &location[2], &rad_up);
  d[4][13]  = distance_km(&location[4], &location[13], &rad_up);
 
  d[5][4]  = distance_km(&location[5], &location[4], &rad_up);
  d[5][6]  = distance_km(&location[5], &location[6], &rad_up);
  d[5][13]  = distance_km(&location[5], &location[13], &rad_up);
 
  d[6][5]  = distance_km(&location[6], &location[5], &rad_up);
  d[6][11]  = distance_km(&location[6], &location[11], &rad_up);
  d[6][12]  = distance_km(&location[6], &location[12], &rad_up);
 
  d[7][3]  = distance_km(&location[7], &location[3], &rad_up);
  d[7][8]  = distance_km(&location[7], &location[8], &rad_up);
  d[7][11]  = distance_km(&location[7], &location[11], &rad_up);
 
  d[8][7]  = distance_km(&location[8], &location[7], &rad_up);
  d[8][9]  = distance_km(&location[8], &location[9], &rad_up);
  d[8][10]  = distance_km(&location[8], &location[10], &rad_up);
 
  d[9][8]  = distance_km(&location[9], &location[8], &rad_up);
 
  d[10][8]  = distance_km(&location[10], &location[8], &rad_up);
  d[10][11]  = distance_km(&location[10], &location[11], &rad_up);
 
  d[11][6]  = distance_km(&location[11], &location[6], &rad_up);
  d[11][7]  = distance_km(&location[11], &location[7], &rad_up);
  d[11][10]  = distance_km(&location[11], &location[10], &rad_up);
 
  d[12][6]  = distance_km(&location[12], &location[6], &rad_up);
 
  d[13][2]  = distance_km(&location[13], &location[2], &rad_up);
  d[13][4]  = distance_km(&location[13], &location[4], &rad_up);
  d[13][5]  = distance_km(&location[13], &location[5], &rad_up);
 
  
  // 確認用の表示
  printf("\n[STEP2]\n");
 
  for(int i = 0; i < 14; i++){
	for(int k = 0; k < 14; k++){
	  printf("d[%d][%d]):%f\t",i,k,d[i][k]);
	  printf("next[%d][%d]):%d\n",i,k,next[i][k]);
	}
  }
 
  // 経路長計算
  for (int k =0; k < 14; k++){
	for (int i =0; i < 14; i++){
	  for(int j = 0; j < 14; j++){
		if(d[i][j] > d[i][k] + d[k][j]){
 
		  d[i][j] = d[i][k] + d[k][j];
		  next[i][j] = next[i][k]; //更新処理
		}
	  }
	}
  }
 
  // 計算結果
  printf("\n[STEP3]\n");
 
  for(int i = 0; i < 14; i++){
	for(int k = 0; k < 14; k++){
	  printf("d[%d][%d]):%f\t",i,k,d[i][k]);
	  printf("next[%d][%d]):%d\n",i,k,next[i][k]);
	}
  }
 
  // 経路パス表示
 
  printf("\n[Path]\n");
  for(int i = 0; i < 14; i++){
	for(int k = 0; k < 14; k++){
	  
	  int cur;
	  printf("d[%d][%d]: ",i,k);
	  
	  for (cur = i; cur != k; cur = next[cur][k]){
        printf("%d -> ", cur);
	  }
	  printf("%d\n", k);
	}
  }
}
syntax2html
/*
  gcc -g wf4.cpp -o wf4
 
  ワーシャル-フロイド法(その4)
 
  参考:ゼオスTTのブログ
  http://zeosutt.hatenablog.com/entry/2015/05/05/045943
 
*/
 
#include <stdio.h>
#include <math.h>
#include <stdlib.h> 
 
typedef struct location{
  // ちなみに X,Y 軸座標は、→に+  ↑に+
  int num;
  char name[10];
  double longitude; // 経度 東経 139.691 X軸  
  double latitude;  // 緯度 北緯 35.698  Y軸 
} LOCATION;
 
LOCATION location[] = {
  {0,"A",35.896889, 139.966776},
  {1,"B",35.911303, 139.950609},
  {2,"C",35.902413, 139.950861},
  {3,"D",35.905665, 139.945430},
  {4,"E",35.891797, 139.959714},
  {5,"F",35.888019, 139.949214},
  {6,"G",35.887682, 139.945090},
  {7,"H",35.900693, 139.938919},
  {8,"I",35.898430, 139.932503},
  {9,"J",35.899640, 139.919513},
  {10,"K",35.893257, 139.934952},
  {11,"L",35.892819, 139.943374},
  {12,"M",35.887158, 139.922399},
  {13,"N",35.893778, 139.952453}
};
 
#define rad2deg(a) ((a)/M_PI * 180.0) /* rad を deg に換算するマクロ関数 */
#define deg2rad(a) ((a)/180.0 * M_PI) /* deg を rad に換算するマクロ関数 */
 
double distance_km(LOCATION* A, LOCATION* B, double *rad_up)
{
  double earth_r = 6378.137;
  
  double loRe = deg2rad(B->longitude - A->longitude); // 東西
  double laRe = deg2rad(B->latitude - A->latitude); // 南北
  
  double EWD = cos(deg2rad(A->latitude))*earth_r*loRe; // 東西距離
  double NSD = earth_r*laRe; //南北距離
  
  double distance = sqrt(pow(NSD,2)+pow(EWD,2));  
  *rad_up = atan2(NSD, EWD);
  
  return distance;
}
 
LOCATION* new_location(LOCATION* D, double diff_p_x, double diff_p_y) 
{
  double earth_r = 6378.137;
  
  double loRe = diff_p_x / earth_r / cos(deg2rad(D->latitude)); // 東西
  double laRe = diff_p_y / earth_r;  // 南北
  
  double diff_lo = rad2deg(loRe); // 東西
  double diff_la = rad2deg(laRe); // 南北
  
  static LOCATION C;
  
  C.longitude = D->longitude + diff_lo; // 東西
  C.latitude = D->latitude + diff_la; // 南北
  
  return &C;
}
 
double diff_longitude(double diff_p_x, double latitude) 
{
  double earth_r = 6378.137;
  // ↓ これが正解だけど、
  double loRe = diff_p_x / earth_r / cos(deg2rad(latitude)); // 東西
  // 面倒なので、これで統一しよう(あまり差が出ないしね)
  //double loRe = diff_p_x / earth_r / cos(deg2rad(35.700759)); // 東西
  double diff_lo = rad2deg(loRe); // 東西
  
  return diff_lo; // 東西
}
 
double diff_latitude(double diff_p_y) 
{
  double earth_r = 6378.137;
  double laRe = diff_p_y / earth_r;  // 南北
  double diff_la = rad2deg(laRe); // 南北
  
  return diff_la; // 南北
}
 
 
 
double d[14][14];  // d[i][k]:ノードiからノードkへの距離 
int next[14][14];  // ノードi から ノードj への最短経路における i の1つ後のノード
 
int main(void)
{
  // 変数の初期化
  for(int i = 0; i < 14; i++){
	for(int j = 0; j < 14; j++){
	  d[i][j] = 99999999.9; // 距離の初期化(でっかい値を入力しておく(INT_MAXは足し算の時に桁上がりが起こるので使わない)
	  next[i][j] = j; // ノードi から ノードj への最短経路における i の1つ後のノード
	}
  }
 
 
  // 確認用の表示
  printf("\n[STEP1]\n");
 
  for(int i = 0; i < 14; i++){
	for(int k = 0; k < 14; k++){
	  printf("d[%d][%d]):%f\t",i,k,d[i][k]);
	  printf("next[%d][%d]):%d\n",i,k,next[i][k]);
	}
  }
 
  //// ここからは実際の距離を手書き
 
  for(int i = 0; i < 14; i++){
	d[i][i] = 0; //// 同じノードへの距離は0になるので、上書き
  }
 
  double rad_up;
  d[0][1]  = distance_km(&location[0], &location[1], &rad_up);
  d[0][4]  = distance_km(&location[0], &location[4], &rad_up);
 
  d[1][0]  = distance_km(&location[1], &location[0], &rad_up);
  d[1][3]  = distance_km(&location[1], &location[3], &rad_up);
 
  d[2][3]  = distance_km(&location[2], &location[3], &rad_up);
  d[2][4]  = distance_km(&location[2], &location[4], &rad_up);
  d[2][13]  = distance_km(&location[2], &location[13], &rad_up);
 
  d[3][1]  = distance_km(&location[3], &location[1], &rad_up);
  d[3][2]  = distance_km(&location[3], &location[2], &rad_up);
  d[3][7]  = distance_km(&location[3], &location[7], &rad_up);
 
  d[4][0]  = distance_km(&location[4], &location[0], &rad_up);
  d[4][2]  = distance_km(&location[4], &location[2], &rad_up);
  d[4][13]  = distance_km(&location[4], &location[13], &rad_up);
 
  d[5][4]  = distance_km(&location[5], &location[4], &rad_up);
  d[5][6]  = distance_km(&location[5], &location[6], &rad_up);
  d[5][13]  = distance_km(&location[5], &location[13], &rad_up);
 
  d[6][5]  = distance_km(&location[6], &location[5], &rad_up);
  d[6][11]  = distance_km(&location[6], &location[11], &rad_up);
  d[6][12]  = distance_km(&location[6], &location[12], &rad_up);
 
  d[7][3]  = distance_km(&location[7], &location[3], &rad_up);
  d[7][8]  = distance_km(&location[7], &location[8], &rad_up);
  d[7][11]  = distance_km(&location[7], &location[11], &rad_up);
 
  d[8][7]  = distance_km(&location[8], &location[7], &rad_up);
  d[8][9]  = distance_km(&location[8], &location[9], &rad_up);
  d[8][10]  = distance_km(&location[8], &location[10], &rad_up);
 
  d[9][8]  = distance_km(&location[9], &location[8], &rad_up);
 
  d[10][8]  = distance_km(&location[10], &location[8], &rad_up);
  d[10][11]  = distance_km(&location[10], &location[11], &rad_up);
 
  d[11][6]  = distance_km(&location[11], &location[6], &rad_up);
  d[11][7]  = distance_km(&location[11], &location[7], &rad_up);
  d[11][10]  = distance_km(&location[11], &location[10], &rad_up);
 
  d[12][6]  = distance_km(&location[12], &location[6], &rad_up);
 
  d[13][2]  = distance_km(&location[13], &location[2], &rad_up);
  d[13][4]  = distance_km(&location[13], &location[4], &rad_up);
  d[13][5]  = distance_km(&location[13], &location[5], &rad_up);
 
  
  // 確認用の表示
  printf("\n[STEP2]\n");
 
  for(int i = 0; i < 14; i++){
	for(int k = 0; k < 14; k++){
	  printf("d[%d][%d]):%f\t",i,k,d[i][k]);
	  printf("next[%d][%d]):%d\n",i,k,next[i][k]);
	}
  }
 
  // 経路長計算
  for (int k =0; k < 14; k++){
	for (int i =0; i < 14; i++){
	  for(int j = 0; j < 14; j++){
		if(d[i][j] > d[i][k] + d[k][j]){
 
		  d[i][j] = d[i][k] + d[k][j];
		  next[i][j] = next[i][k]; //更新処理
		}
	  }
	}
  }
 
  // 計算結果
  printf("\n[STEP3]\n");
 
  for(int i = 0; i < 14; i++){
	for(int k = 0; k < 14; k++){
	  printf("d[%d][%d]):%f\t",i,k,d[i][k]);
	  printf("next[%d][%d]):%d\n",i,k,next[i][k]);
	}
  }
 
  // 経路パス表示
 
  printf("\n[Path]\n");
  for(int i = 0; i < 14; i++){
	for(int k = 0; k < 14; k++){
	  
	  int cur;
	  printf("d[%d][%d]: ",i,k);
	  
	  for (cur = i; cur != k; cur = next[cur][k]){
        printf("%d -> ", cur);
	  }
	  printf("%d\n", k);
	}
  }
}
syntax2html

2018-07-18 structの中のメンバ関数 メソッド の作り方 [長年日記]

/*
  g++ -g test.cpp -o test
*/
 
#include<stdio.h>
 
struct PERSON{		
  double a1,a2;
  double d1,d2;
  double arrival_CS(double);  // 到着時刻に関する満足度関数
  double departure_CS(double); // 出発時刻に対する満足度関数
 
};
 
double PERSON::arrival_CS(double time){
  double ret; 
 
  if (time < a1){
	ret = 1.0;
  }
  else if (time > a2){
	ret = 0.0;
  }
  else {
	ret = 1.0 / (a1 - a2) * ( time - a2);
  }
  
  return ret;
}
 
double PERSON::departure_CS(double time){
  double ret; 
 
  if (time < d1){
	ret = 1.0;
  }
  else if (time > d2){
	ret = 0.0;
  }
  else {
	ret = 1.0 / (d1 - d2) * ( time - d2);
  }
  
  return ret;
}
 
int main (){
 
  PERSON person;	// 構造体定義名の前に「struct」がいらない(C++にあってCにない規定らしい)
 
  // 以下が、マインド(心)変数
 
  person.a1 = 1;	
  person.a2 = 3;	
 
  person.d1 = 2;	
  person.d2 = 4;	
 
  double time = 2.7;
  
  double aa = person.arrival_CS(time);
  double bb = person.departure_CS(time);
 
  printf("time = %f, aa = %f, bb = %f\n", time, aa, bb);
 
  return 0;
}
syntax2html

2018-06-21 CNNの逆伝搬学習の理屈 [長年日記]


2018-06-20 巡回セールスマン問題で理解するイジングモデル [長年日記]


2018-06-04 postgreSQLの内容をcsvファイルにする [長年日記]

ca_db=# COPY inter_mediation TO 'd:\testtest.csv' WITH CSV HEADER;


2018-06-03 postgreSQLのテーブルをコピーする [長年日記]

CREATE TABLE 新テーブル AS SELECT * FROM 既存テーブル;


2018-05-22 Restrictive relative clauses 制限的関係節 [長年日記]

出展:https://plaza.rakuten.co.jp/shimpeichen77/diary/201111020004/

 
■Restrictive relative clauses 制限的関係節
■Non-restrictive relative clauses 非制限的関係節
というのがある。
 
これだけ聞くと何だかサッパリわからない。
 
例文
(1) My sister who lives in New York works for Donald Trump.
 
(2) My sister, who lives in New York, works for Donald Trump.
 
この2つの文章の意味は全く違う。
(1)"私のNYに住んでいる妹はDonald Trumpで働いている"
→つまり妹が何人かいて、そのうち1人がNYに住んでいる
(2)”私の妹は、ニューヨークに住んでいて・・・”
→つまり妹は1人、その妹はNYに住んでいる
 
(1)のwho lives in New York はこの文章に絶対に必要な情報なので
カンマで区切ってはいけない。(=Restrictive relative clauses )
(2)のwho lives in New York はなくてもいい補足情報なので
カンマで区切る。(=Non-restrictive relative clauses )
 
よく論文でも、
前の語を"which is..."と説明することがあるが原理は同じ。
 
■まとめると、
・A who is B → Bは必要不可欠
・A, who is B, → Bはオマケ
(※ whichの場合も同じ)

2018-05-11 (対応済み) AKIYAMA ‏さんの「ソース見たが合計特殊出生率の定義がそもそも間違っている.やり直し.」関する、江端の考え方の報告 [長年日記]

// 妊娠可能性率(ARTグラフより算出)

double pregnant_capability[100] = {0.0}; // 15歳を1.0とする

pregnant_capability[15]=1.000 ;

pregnant_capability[16]=0.9875 ;

pregnant_capability[17]=0.975 ;

pregnant_capability[18]=0.9625 ;

pregnant_capability[19]=0.95 ;

pregnant_capability[20]=0.9375 ;

pregnant_capability[21]=0.925 ;

pregnant_capability[22]=0.9125 ;

pregnant_capability[23]=0.9 ;

pregnant_capability[24]=0.8875 ;

pregnant_capability[25]=0.875 ;

pregnant_capability[26]=0.85625;

pregnant_capability[27]=0.8375 ;

pregnant_capability[28]=0.81875;

pregnant_capability[29]=0.8 ;

pregnant_capability[30]=0.78125;

pregnant_capability[31]=0.75 ;

pregnant_capability[32]=0.71875;

pregnant_capability[33]=0.6875 ;

pregnant_capability[34]=0.65625;

pregnant_capability[35]=0.625 ;

pregnant_capability[36]=0.5625 ;

pregnant_capability[37]=0.5 ;

pregnant_capability[38]=0.4375 ;

pregnant_capability[39]=0.375 ;

pregnant_capability[40]=0.3125 ;

pregnant_capability[41]=0.26875;

pregnant_capability[42]=0.225 ;

pregnant_capability[43]=0.18125;

pregnant_capability[44]=0.1375 ;

pregnant_capability[45]=0.09375;

pregnant_capability[46]=0.075 ;

pregnant_capability[47]=0.05625;

pregnant_capability[48]=0.0375 ;

pregnant_capability[49]=0.01875;

double sigma_pregnant_capability = 0;

for(int i = 15; i < 50; i++){ //

sigma_pregnant_capability += pregnant_capability[i]; // 同じ値を何度も計算している

}

for (int year = 1970; year < 2100; year++){ // 1970年から2100年までループ計算

// 数値をかえて再コンパイルのこと

#if 0

double dummy = 0;

for(int i = 15; i < 50; i++){ // 特殊出産率の対象 15歳から49歳までの人口加算

dummy += women[i];

}

// 1970年の特殊出生率 2.14 / 35は特殊出生率の対象期間(35年) / 1.05は男性の出生比率

// 2017年の特殊出生率 1.44 / 35は特殊出生率の対象期間(35年) / 1.05は男性の出生比率

double mem_new_birth = dummy * 2.14 / 35.0 * 1.05/(1.05+1.00);

double womem_new_birth = dummy * 2.14 / 35.0 * 1.00/(1.05+1.00);

#else

double sigma_rate_by_age = 0;

for(int i = 15; i < 50; i++){ // 特殊出産率の対象 15歳から49歳までの人口加算

sigma_rate_by_age += pregnant_capability[i] / women[i];

}

// "妊娠可能性係数" という概念を導入

double k_pregnant = 2.14 / sigma_rate_by_age; // 合計特殊出生率 "2.14" から逆算する

double mem_new_birth = k_pregnant * sigma_pregnant_capability * 1.05/(1.05+1.00);

double womem_new_birth = k_pregnant * sigma_pregnant_capability * 1.00/(1.05+1.00);

#endif

因みに、コード修正前と修正後でグラフを比較したが、ほとんど差が見れれなかった。

従って、これまでの計算方法でも、計算結果に差がでないことが分かった(まずは一安心)

(1970年スタート 特殊出生率2.14、2100年の段階で、0.0160548%程度の誤差しかなかった)


2018-05-10 Range Extenderに接続されたデバイスを制御するために、ルータでMacフィルタリングを設定する方法は? [長年日記]

Range Extenderに接続されたデバイスを制御するために、ルータでMacフィルタリングを設定する方法は?

Range Extenderに接続しているクライアントを制御するために、メインルータでMac Filteringを設定しようとしたが、設定が正常に動作しなかったことがありました。 ここではその理由を説明し、それを動作させるための詳細な手順を紹介します。

 

始める前に:

Range Extenderがルータに正常に接続していることを確認して、Range Extenderがどのモードで動作しているかを確認してください:

注:RE200 / RE210 / RE580D / RE590T / TL-WA850RE_V2 / TL-WA860RE_V2 / TL-WA854RE_V2は、デフォルトでプロキシモードで動作します。

 

この記事では、例としてRE210とC7を取り上げます。 以下はネットワークトポロジです:

拓?.PNG

Note: この記事では、Mac Filteringは、ルータに直接接続されたデバイスではなく、Range Extenderに接続されているクライアントを制御することを目的としています。

 

Part A: Range Extenderがプロキシモードで動作している場合

1.プロキシモードの特殊性:

プロキシモードでは、Range Extenderが各クライアントを置き換えます’ Range Extenderによって自動的に生成された仮想MACアドレスを持つMACアドレス。 したがって、ルータは実際のMACアドレスとしてクライアントの仮想MACアドレスを取得するため、実際のMACアドレスではなく、ルータのMACフィルタリングでこれらのクライアントの仮想MACアドレスを入力する必要があります。 下の図を比較することで、プロセスをよりよく理解できます。

a. お使いのコンピュータを確認してください’このようなMACアドレス。 あなたのコンピュータはここにあります’ 実際のMACアドレス (8C–89–A5–CE–14-93).

pc mac.PNG

b。 次に、ルーターのWebページに表示されているコンピュータのMACアドレスを確認します。 あなたのコンピュータの仮想MACアドレスはWebページのここにあります’ これがあなたのコンピュータの仮想 MAC アドレスです (16–CC–20–CE–14-93).

web mac.PNG

c。 これでルータはあなたのコンピュータの仮想MACアドレスだけを見ることができますが、実際のMACアドレスは見ることができません。 しかし、あなたが知っておくべき重要なことがあります。各クライアントの仮想MACアドレスの後半24ビットは、クライアントの実際のMACアドレスの後半24ビットとまったく同じです。

上記のコンピュータの実際のMACアドレスを比較することで、ルールを簡単に見つけることができます (8C–89–A5–CE–14-93) と、仮想MACアドレス (16–CC–20–CE–14-93).

 

2. REに接続しているクライアントの仮想MACアドレスを検索します。

a。 クライアントデバイスの実際のMACアドレスを確認し、書き留めてください。 これらのクライアントデバイスの仮想MACアドレスを見つける必要があります。

b。 ルータのWeb GUIにログインし、 DHCPクライアントリストに移動します。ここでは、ルータに関連付けられたデバイスのすべてのMACアドレスを確認できます。 これらのMACアドレスを比較すると 後者の24ビットはクライアントデバイスと 実際のMACアドレス; 後者の24ビットでは、クライアントデバイスを簡単に見つけることができます; 仮想MACアドレス。 次にそれらを書き留めてください。 あなたはそれらを必要とします。

3.PNG

注:ルーターの[ DHCPクライアント]リストを確認する方法がわからない場合は、ルーターのベンダーに問い合わせてください。

 

3. Range ExtenderのMACアドレスを検索する.

TL-WA850REのようなシングルバンドレンジエクステンダには2.4GHz MACアドレスが1つあり、デュアルバンドレンジエクステンダにはそれぞれ2.4GHzと5GHzで使用される2つのMACアドレスがあります。

a。 ルータのWeb GUIにログインし、ワイヤレス2.4GHz - > ワイヤレス統計を選択すると、ルータに関連付けられている2.4GHz帯のデバイスのMACアドレスが表示されます 。 これらのMACアドレスをRange Extenderの背面に印刷されたMACアドレスと比較すると、“ 14-CC-20-42-B8-E5” あなたのレンジエクステンダーが2.4GHzで使用するMACアドレスです。

sta mac.PNG

b。 Range ExtenderがデュアルバンドRange Extenderである場合、引き続き5GHz MACアドレスを見つける必要があります。 手順 a)とほぼ同じ手順で、Range Extenderの5GHz MACアドレス(14-CC-20-42-B8-E7)を簡単に見つけることができます。 実際にRange Extenderの2.4GHz MACアドレスは、5GHz MACアドレスと非常によく似ています。

Range Extenderの2.4GHz MACアドレス( 14-CC-20-42-B8-E5)とそのルールを簡単に比較すると、 5GHz MACアドレス( 14-CC-20-42-B8-E7)。

2.PNG

注:ルーターの[ワイヤレス統計情報]の確認方法がわからない場合は、ルーターのベンダーに問い合わせてください。

 

4. MACフィルタリング(ホワイトリスト)を設定する:リストの有効なエントリで指定されたステーションがインターネットにアクセスできるようにします。

ここでは、仮想MACアドレスを使用してMACフィルタリングを設定する方法を紹介する例として、Archer C7のWhite Listを例として取り上げます。

a。 ルータのWeb GUIにログインし、ワイヤレス2.4GHz - > ワイヤレス M ACフィルタリング 新規追加。 次に、PCの[仮想MACアドレス]を入力し、[有効] - > [保存] とステータスを選択します。

ADD RE.PNG

b. Click 新しいをもう一度追加し、範囲拡張子の2.4GHz MACアドレスを入力します。 ステータスを[有効にする - >保存する.

TIAN RE.PNG

c。 [許可]を選択して[有効にする]をクリックします。 その後、リストに指定したコンピュータだけがインターネットにアクセスできます。

ENABLE.2.PNG

d。 ルータとRange Extenderが両方ともデュアルバンドデバイスである場合は、ルータの wireless 5GHz WEB GUIで上記の手順を繰り返すことができます。

注:ルータのMACフィルタリングの設定方法がわからない場合は、ルータのベンダーに問い合わせてください。

 

パートB Range Extenderがユニバーサルモードで動作している場合

このモードでは、Range Extenderはそのすべてのクライアントを置き換えます’ REのMACアドレスを持つMACアドレス! つまり、REのMACアドレスをルータのMACフィルタリングに入力するだけです:

  1. あなたのルータのMACフィルタリングにREのrsのMACアドレスをタイプした後。 “ Allow” を選択すると、Range Extenderに接続しているすべてのクライアントがインターネットにアクセスできるようになります。
  2. あなたのルータのMACフィルタリングにREのrsのMACアドレスをタイプした後。 拒否を選択すると、Range Extenderに接続しているすべてのクライアントがインターネットにアクセスできなくなります。

 

パートC: Range ExtenderがWDSモードで動作している場合

レンジャーエクステンダーがWDSモードで動作している場合、Range Extenderはクライアントを’ これらのクライアントの実際のMACアドレスを使用しながら、仮想MACアドレスまたはREのMACアドレスを持つMACアドレス。 したがって、これらのクライアントデバイスは’ ルータのMACフィルタリングでの実際のMACアドレス。 他に特別な設定は必要ありません。

 

各機能と構成の詳細を知りたい場合は、 Download Center 製品のマニュアルをダウンロードしてください。

This Article Suits for:
RE580D , TL-WA854RE , TL-WA860RE

2018-05-03 クロスケーブルでなくても繋がる [長年日記]

少くとも、ストレートであろうがクロスであろうが、私のPCとラズパイは繋がった。

ただ、クロスを購入しないと、昨日のような問題に至れないので、結局、不安材料は、一つ一つ潰していかないと、ダメという点では、必要だったと言えると思う。