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|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|

2017-08-08 シミュレーションプログラム「バーチャル株式会社 エバタ 」 [長年日記]

/*
  gcc -g hiseiki.cpp -o hiseiki
*/
 
/*
  まず「基本形」 普通の会社を想定する 
  
  景気の波がある
 
  非正規雇用はいつでも解雇できる。
  正規雇用は解雇できない。
 
  必要な労働力は人数で換算できる。
  景気の波は
 
  景気循環には、3~4年周期の「キチンの波」、約10年周期の「ジュグラーの波」、20~30年周期の「クズネッツの波」、約50年周期の「コンドラチェフの波」の四種類があるとされ、それぞれ、在庫投資、設備投資、建設投資、技術革新が原因とされてきた。しかし、これらの周期性の計測や、因果関係に確定的な根拠があるわけではない。現在のところ確実に観測できるのは約4年周期の波だけで、しかも設備投資がそれを主導するように同調的に変動している。周期問題の分析は今後の課題に残されている。
 
  今回は、約10年周期の「ジュグラーの波」を採用する。
 
  企業の寿命は考えない。雇用期間は20歳から60歳までの40年
 
  一人の人間が生み出す利益は、年齢とともに単調的に増加する(長期雇用のメリット)
  一人の人間の人件費も年齢と共に単調的に増加する
  
  年齢に応じて100人いるとすると4000人
  提供労働力は、年齢に応じて増えていく(給料も増えるが、能力はそれを超えると考える)
  需要労働力は、変動する
 
  需要労働力に対して、提供労働力が大きいと、損害になる 1200円→2400円 2倍
  需要労働力に対して、提供労働力が小さいと、(競争に負けるので)、やはり損害になる
  需要労働力と、提供労働力が一致していることが望ましい
 
  正規社員 1.25 → 2.50  (http://www.mhlw.go.jp/file/06-Seisakujouhou-11650000-Shokugyouanteikyokuhakenyukiroudoutaisakubu/0000120286.pdf)
  非正規社員 1.00 のまま
 
  その金が支払われるのは、その能力がある(あるいは教育に投資をしていると仮定する)
 
  正規社員は退職せず、非正規社員は問答無用で解雇できるものとする
 
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h> 
 
 
 
typedef struct person{
  int age;  // 20歳~60歳 のいずれか
  int position;  // 1:正規社員 0:非正規社員
  double productivity;  // 生産力 正規社員の場合 
 
  ///////////
  struct person *prev;  /* 前の構造体を示すポインタ */
  struct person *next;  /* 次の構造体を示すポインタ */ 
 
} PERSON;
 
 
typedef struct company{
  int payroll;
  double productivity;  // 会社としての生産力の合計   
} COMPANY;
 
 
PERSON *p_first_person, *p_last_person;   //社員リスト(あえてグローバルで保持)
 
// 社員用リストの先頭と終端を作成するルーチン
/*
  リストの先頭と終端をはグローバルでも良いのであるが、
  一応、メインルーチンの方で、陽に定義できるように、
  ここでは、返り値としている
*/
 
double min(double a, double b){
    if (b > a) 
        return a;
    else 
        return b;
};
 
double juglar_cycles(int year)
{
  // 10年で変動するsin周期
  // ベースとするのは2017年とする(単なる仮説)
  
  int x = (year -7) % 10;
  double y = sin( (double)x /10.0 * 2 * 3.141592654);
 
  return y;
}
  
 
 
 
void init_person_list(PERSON **p_first_person, PERSON **p_last_person)
{
  PERSON *p_top_person = (PERSON *)malloc(sizeof(PERSON));
  if(p_top_person == NULL) {
    printf("メモリが確保できません\n");
    exit(EXIT_FAILURE);
  }
  memset(p_top_person, 0, sizeof(PERSON)); // ゼロクリア
 
 
  PERSON *p_tail_person = (PERSON *)malloc(sizeof(PERSON));
  if(p_tail_person == NULL) {
    printf("メモリが確保できません\n");
    exit(EXIT_FAILURE);
  }
  memset(p_tail_person, 0, sizeof(PERSON)); // ゼロクリア
 
  *p_first_person = p_top_person;
  *p_last_person = p_tail_person;
 
  (*p_first_person)->prev = NULL;
  (*p_last_person)->next = NULL;
  (*p_first_person)->next = (*p_last_person);
  (*p_last_person)->prev = (*p_first_person);
 
  return;
}
 
// 社員オブジェクトを生成して、社員用リストに追加するルーチン
void add_person(PERSON *p_ref_person)
{
 
  PERSON *new_p_person = (PERSON *)malloc(sizeof(PERSON));
  if(new_p_person == NULL) {
    printf("メモリが確保できません\n");
    exit(EXIT_FAILURE);
  }
  memset(new_p_person, 0, sizeof(PERSON)); // ゼロクリア
  memcpy(new_p_person, p_ref_person, sizeof(PERSON)); // 引数の動的メモリの内容コピー
 
  // personの追加属性記述ここから
 
 
 
  // personの追加属性記述ここまで
 
  PERSON *p_person = p_last_person->prev;
 
  p_person->next = new_p_person;
  new_p_person->prev = p_person;
 
  p_last_person->prev = new_p_person;
  new_p_person->next = p_last_person;
 
  return;
}
 
void delete_person(PERSON *p_person)  
{
  // ポインタを貼り替えて
  p_person->prev->next = p_person->next;
  p_person->next->prev = p_person->prev;
  
  // そのメモリを解放する
  free(p_person);
 
  return;
 
}
 
 
int main()
{
  
  // 社員格納用リストの作成
  init_person_list(&p_first_person, &p_last_person); 
  
  //20歳から59歳までの正規社員、各世代100人づつ、合計4000人を作成する
  
  /////// PERSONを作成する ///////
  for (int age = 20; age < 60; age ++){
    for (int i = 0; i < 100; i++){
      
      PERSON person;
      
      person.age = age;
      person.position = 1;  // 1:正規社員 0:非正規社員
      person.productivity = 1.25 + (2.50 -1.25) / 40.0 * ((double)age -20.0); //20歳 1.25 60歳 2.50まで線形変化
      
      add_person(&person);
    }
  }
  /////// PERSONを作成する ///////  
  
  
  COMPANY company;
  
  company.payroll = 0; // 従業員数ゼロリセット
  company.productivity = 0.0; // 生産力ゼロリセット
  
  double sum_profit = 0;
  
  for ( int year = 2017; year < 2040; year++){
    
    //// 年齢を1歳加算し、定年
    // ===== PERSON ループを回す========
    PERSON* p_person = p_first_person->next;  
    while (p_person != p_last_person){
      
      p_person->age += 1;
      p_person->productivity = 1.25 + (2.50 -1.25) / 40.0 * ((double)(p_person->age) -20.0); //20歳 1.25 60歳 2.50まで線形変化
      
      if (p_person->age >= 60){ // 60歳になったら定年
        delete_person(p_person);
      }
      
      p_person = p_person->next;
    }
    // ===== PERSON ループを回す(ここまで)========
    
    //// 100人の20歳の新入社員を入社する
    for (int i = 0; i < 100; i++){
      /////// PERSONを作成する ///////
      PERSON person;
      
      person.age = 20;
      person.position = 1;  // 1:正規社員 0:非正規社員
      person.productivity = 1.25 + (2.50 -1.25) / 40.0 * ((double)person.age -20.0); //20歳 1.25 60歳 2.50まで線形変化
      
      add_person(&person);
    }
 
    /////////// ここから生産力算出ループ
 
    company.productivity = 0; // 生産力ゼロリセット
    company.payroll = 0 ; // 従業員数ゼロリセット
 
    // ===== PERSON ループを回す========
    p_person = p_first_person->next;
    while (p_person != p_last_person){
      
      company.payroll += 1 ; // 従業員数一人加算
      company.productivity += p_person->productivity; // 生産力加算
      
      p_person = p_person->next;
    }
    // ===== PERSON ループを回す(ここまで)========
    
    //printf("company.payroll = %d\n",company.payroll); // company.payroll = 4000
    //printf("company.productivity = %f\n",company.productivity); // company.productivity = 7437.500000
    
    double potential = juglar_cycles(year) * 1500.0 + 7500.0; // 景気ライン
    double border = 7000.0; // 利益のボーダー
    
    double profit = min(company.productivity, potential) - border;
    sum_profit += profit; 
    
    //printf("year = %d company.productivity = %f potential = %f profit = %f sum_profit=%f\n",year,company.productivity, potential, profit,sum_profit);
    printf("%d,%f,%f,%f,%f\n",year,company.productivity, potential, profit,sum_profit);
    
  } //  for ( int year = 2017; year < 2040; year++){
  
  return 0;
}