From 4333a1ef40960e2a790b1f81647d750f281fc7a1 Mon Sep 17 00:00:00 2001 From: wanotaitei Date: Sat, 14 Dec 2024 14:53:34 +0900 Subject: [PATCH] add: new marriage & childbearing --- Data/Simulations/Sample/Childbearing.tsv | 102 ++++++++++++++ Data/Simulations/Sample/Marriage.tsv | 102 ++++++++++++++ Data/Simulations/Settings.tsv | 10 +- .../Simulation/JapanProvinces.hpp | 5 - .../PAX_SAPIENTICA/Simulation/Settlement.hpp | 30 ++--- .../Simulation/SettlementAgent.hpp | 1 + .../Simulation/SimulationConst.hpp | 125 +++++++++++++++--- Library/PAX_SAPIENTICA/Version.hpp | 12 +- 8 files changed, 336 insertions(+), 51 deletions(-) create mode 100644 Data/Simulations/Sample/Childbearing.tsv create mode 100644 Data/Simulations/Sample/Marriage.tsv diff --git a/Data/Simulations/Sample/Childbearing.tsv b/Data/Simulations/Sample/Childbearing.tsv new file mode 100644 index 000000000..2ec8db3ba --- /dev/null +++ b/Data/Simulations/Sample/Childbearing.tsv @@ -0,0 +1,102 @@ +age hunter_gatherer agricultural +0 0 0 +1 0 0 +2 0 0 +3 0 0 +4 0 0 +5 0 0 +6 0 0 +7 0 0 +8 0 0 +9 0 0 +10 0 0 +11 0 0 +12 0 0 +13 0 0 +14 0.009022766008 0.003007588669 +15 0.03746975846 0.01248991949 +16 0.06757353696 0.02252451232 +17 0.09958830351 0.03319610117 +18 0.1337557159 0.04458523864 +19 0.1703668704 0.05678895681 +20 0.2098868832 0.0699622944 +21 0.2526807842 0.08422692807 +22 0.2995459554 0.09984865178 +23 0.3511586331 0.1170528777 +24 0.4089346823 0.1363115608 +25 0.4743033249 0.1581011083 +26 0.5500259893 0.1833419964 +27 0.6405890518 0.2135296839 +28 0.7534403528 0.2511467843 +29 0.9056625696 0.3018875232 +30 1.151236496 0.3837454986 +31 1.312976024 0.4376586748 +32 1.087701736 0.3625672452 +33 0.8668848806 0.2889616269 +34 0.7222288212 0.2407429404 +35 0.6129487486 0.2043162495 +36 0.5239938899 0.17466463 +37 0.4484244189 0.1494748063 +38 0.3825212912 0.1275070971 +39 0.3241175852 0.1080391951 +40 0.2715395289 0.09051317629 +41 0.2237504232 0.07458347441 +42 0.1799112904 0.05997043012 +43 0.139559001 0.046519667 +44 0.1021741604 0.03405805348 +45 0.06747719441 0.02249239814 +46 0.03521142259 0.01173714086 +47 0.005148315889 0.001716105296 +48 0 0 +49 0 0 +50 0 0 +51 0 0 +52 0 0 +53 0 0 +54 0 0 +55 0 0 +56 0 0 +57 0 0 +58 0 0 +59 0 0 +60 0 0 +61 0 0 +62 0 0 +63 0 0 +64 0 0 +65 0 0 +66 0 0 +67 0 0 +68 0 0 +69 0 0 +70 0 0 +71 0 0 +72 0 0 +73 0 0 +74 0 0 +75 0 0 +76 0 0 +77 0 0 +78 0 0 +79 0 0 +80 0 0 +81 0 0 +82 0 0 +83 0 0 +84 0 0 +85 0 0 +86 0 0 +87 0 0 +88 0 0 +89 0 0 +90 0 0 +91 0 0 +92 0 0 +93 0 0 +94 0 0 +95 0 0 +96 0 0 +97 0 0 +98 0 0 +99 0 0 +100 0 0 \ No newline at end of file diff --git a/Data/Simulations/Sample/Marriage.tsv b/Data/Simulations/Sample/Marriage.tsv new file mode 100644 index 000000000..18a9351d1 --- /dev/null +++ b/Data/Simulations/Sample/Marriage.tsv @@ -0,0 +1,102 @@ +age hunter_gatherer agricultural +0 0 0 +1 0 0 +2 0 0 +3 0 0 +4 0 0 +5 0 0 +6 0 0 +7 0 0 +8 0 0 +9 0 0 +10 0 0 +11 0 0 +12 0 0 +13 0 0 +14 0.00002406070935 0.00002406070935 +15 0.0000999193559 0.0000999193559 +16 0.0001801960986 0.0001801960986 +17 0.0002655688094 0.0002655688094 +18 0.0003566819091 0.0003566819091 +19 0.0004543116545 0.0004543116545 +20 0.0005596983552 0.0005596983552 +21 0.0006738154246 0.0006738154246 +22 0.0007987892143 0.0007987892143 +23 0.0009364230216 0.0009364230216 +24 0.001090492486 0.001090492486 +25 0.001264808867 0.001264808867 +26 0.001466735971 0.001466735971 +27 0.001708237472 0.001708237472 +28 0.002009174274 0.002009174274 +29 0.002415100186 0.002415100186 +30 0.003069963989 0.003069963989 +31 0.003501269398 0.003501269398 +32 0.002900537962 0.002900537962 +33 0.002311693015 0.002311693015 +34 0.001925943523 0.001925943523 +35 0.001634529996 0.001634529996 +36 0.00139731704 0.00139731704 +37 0.00119579845 0.00119579845 +38 0.001020056776 0.001020056776 +39 0.0008643135606 0.0008643135606 +40 0.0007241054103 0.0007241054103 +41 0.0005966677953 0.0005966677953 +42 0.000479763441 0.000479763441 +43 0.000372157336 0.000372157336 +44 0.0002724644279 0.0002724644279 +45 0.0001799391851 0.0001799391851 +46 0.0000938971269 0.0000938971269 +47 0.00001372884237 0.00001372884237 +48 0 0 +49 0 0 +50 0 0 +51 0 0 +52 0 0 +53 0 0 +54 0 0 +55 0 0 +56 0 0 +57 0 0 +58 0 0 +59 0 0 +60 0 0 +61 0 0 +62 0 0 +63 0 0 +64 0 0 +65 0 0 +66 0 0 +67 0 0 +68 0 0 +69 0 0 +70 0 0 +71 0 0 +72 0 0 +73 0 0 +74 0 0 +75 0 0 +76 0 0 +77 0 0 +78 0 0 +79 0 0 +80 0 0 +81 0 0 +82 0 0 +83 0 0 +84 0 0 +85 0 0 +86 0 0 +87 0 0 +88 0 0 +89 0 0 +90 0 0 +91 0 0 +92 0 0 +93 0 0 +94 0 0 +95 0 0 +96 0 0 +97 0 0 +98 0 0 +99 0 0 +100 0 0 \ No newline at end of file diff --git a/Data/Simulations/Settings.tsv b/Data/Simulations/Settings.tsv index 12c75510d..3a2f6dd07 100644 --- a/Data/Simulations/Settings.tsv +++ b/Data/Simulations/Settings.tsv @@ -19,9 +19,6 @@ female_marriageable_age_min 13 女性の最小婚姻可能年齢(歳) male_marriageable_age_min 17 男性の最小婚姻可能年齢(歳) female_marriageable_age_max 60 女性の最大婚姻可能年齢(歳) male_marriageable_age_max 70 男性の最大婚姻可能年齢(歳) -marriageable_age_constant 8.5 婚姻可能年齢定数 -marriageable_age_threshold 0.98 婚姻可能年齢閾値 -marriageable_age_all_weight 101.8 婚姻可能年齢重み #Childbirth -------------------- #出産 -------------------------------------------------- birth_interval 10 妊娠から出産までのStep間隔(step) hunter_gatherer_stillbirth_rate 0 狩猟採集死産率 (no effect) @@ -29,19 +26,16 @@ agricultural_stillbirth_rate 0 水田稲作死産率 (no effect) child_agriculture_priority 0.5 片親が農耕文化を持ち、もう一方の片親が農耕文化を持たない時の農耕文化継承の優先度 childbearing_age_min 15 出産の最小可能年齢(歳) childbearing_age_max 50 出産の最大可能年齢(歳) -childbearing_age_constant 8.5 出産可能年齢定数 -childbearing_age_threshold 16 出産可能年齢閾値 -childbearing_age_all_weight 101.8 出産可能年齢重み #Movement -------------------- #移動 -------------------------------------------------- max_hunter_gatherer_settlement_population 25 狩猟採集集落の最大人数(人) max_agricultural_settlement_population 80 水田稲作集落の最大人数(人) min_move_distance 1 最小移動距離(cell) max_move_distance 1600 最大移動距離(cell) -move_probability 0.01 移動確率 +move_probability 0.0021 移動確率 ocean_cost 1.1 海上の通行コスト coast_cost 0.7 海岸の通行コスト land_cost 2.5 傾斜度0度の陸上の通行コスト move_redo 10 移動再試行回数 move_method astar 移動の手法(astar/random) move_astar_loop 8 A*を行うルート数 -move_astar_distance 64 A*を行うルート間隔 \ No newline at end of file +move_astar_distance 128 A*を行うルート間隔 \ No newline at end of file diff --git a/Library/PAX_SAPIENTICA/Simulation/JapanProvinces.hpp b/Library/PAX_SAPIENTICA/Simulation/JapanProvinces.hpp index 5139f8f3d..4302fca64 100644 --- a/Library/PAX_SAPIENTICA/Simulation/JapanProvinces.hpp +++ b/Library/PAX_SAPIENTICA/Simulation/JapanProvinces.hpp @@ -142,7 +142,6 @@ namespace paxs { life_span_tsv.deleteBOM(); // 1 行目を分割する std::unordered_map menu = life_span_tsv.splitHashMapMurMur3('\t'); - std::size_t i = 1; // 1 行ずつ読み込み(区切りはタブ) while (life_span_tsv.getLine()) { @@ -165,13 +164,11 @@ namespace paxs { life_span.weight_farming_male.emplace_back(std::stod(sub_menu_v[menu[MurMur3::calcHash("agricultural_male_ndx")]])); life_span.weight_hunter_gatherer_female.emplace_back(std::stod(sub_menu_v[menu[MurMur3::calcHash("hunter_gatherer_female_ndx")]])); life_span.weight_hunter_gatherer_male.emplace_back(std::stod(sub_menu_v[menu[MurMur3::calcHash("hunter_gatherer_male_ndx")]])); - ; // 確率分布を生成 life_span.dist_farming_female = std::discrete_distribution<>(life_span.weight_farming_female.begin(), life_span.weight_farming_female.end()); life_span.dist_farming_male = std::discrete_distribution<>(life_span.weight_farming_male.begin(), life_span.weight_farming_male.end()); life_span.dist_hunter_gatherer_female = std::discrete_distribution<>(life_span.weight_hunter_gatherer_female.begin(), life_span.weight_hunter_gatherer_female.end()); life_span.dist_hunter_gatherer_male = std::discrete_distribution<>(life_span.weight_hunter_gatherer_male.begin(), life_span.weight_hunter_gatherer_male.end()); - ++i; } } @@ -315,7 +312,6 @@ namespace paxs { inputMtDNA_Region(japan_provinces_path); inputDistrict(japan_provinces_path); inputLifeSpan(japan_provinces_path); - } /// @brief @@ -488,7 +484,6 @@ namespace paxs { //std::vector mtdna_region_hash_list; // mtDNA ハッシュ計算用 std::vector mtdna_list; // mtDNA lifeSpan life_span; - }; } diff --git a/Library/PAX_SAPIENTICA/Simulation/Settlement.hpp b/Library/PAX_SAPIENTICA/Simulation/Settlement.hpp index 1ab57269e..c97275fd7 100644 --- a/Library/PAX_SAPIENTICA/Simulation/Settlement.hpp +++ b/Library/PAX_SAPIENTICA/Simulation/Settlement.hpp @@ -413,7 +413,7 @@ namespace paxs { // 妊娠していたら婚姻しない(婚姻可能と定義すると再婚者のデータで上書きされ子供への継承が不自然になる) if (female.getBirthIntervalCount() > 0) continue; // 婚姻するか乱数で決定 - if (!isMarried(female.getAge())) continue; + if (!isMarried(female.getAgeSizeT(), female.cgetFarming() > 0)) continue; // 集落グリッドを重み付け if (close_settlements_list_probabilities.size() == 0) { @@ -842,7 +842,7 @@ namespace paxs { } } // 出産可能かどうか - else if (agent.isAbleToGiveBirth() && isAbleToGiveBirth(agent.getAge())) { + else if (agent.isAbleToGiveBirth() && isAbleToGiveBirth(agent.getAgeSizeT(), agent.cgetFarming() > 0)) { agent.setBirthIntervalCount(SimulationConstants::getInstance()->birth_interval); } @@ -895,30 +895,20 @@ namespace paxs { /// @brief Is the agent married? /// @brief 確率で結婚するかどうかを返す - bool isMarried(const double age) noexcept { + bool isMarried(const std::size_t age, const bool is_agricultural) noexcept { // 婚姻可能年齢の上限値以上だったら結婚しない - if (age >= SimulationConstants::getInstance()->female_marriageable_age_max) return false; - auto x = [](double age) { return (age - SimulationConstants::getInstance()->female_marriageable_age_min_f64) / SimulationConstants::getInstance()->marriageable_age_constant; }; - auto weight = [=](double age) { - return std::exp(-std::pow(std::log(x(age)), 2.0) / settlement::sigma_p_2_x_2) / (x(age) * settlement::sigma_x_sqrt_2_x_pi); - }; - - const double threshold = static_cast(weight(age)) * (SimulationConstants::getInstance()->marriageable_age_threshold / SimulationConstants::getInstance()->marriageable_age_all_weight); // (0.98 / 101.8); - + const double threshold = SimulationConstants::getInstance()->getMarriageProbability(age, is_agricultural); + if (threshold == 0.0) return false; + if (threshold >= 1.0) return true; return SimulationConstants::getInstance()->random_dist(*gen) < threshold; } /// @brief Is able to give birth? /// @brief 確率で出産するかどうかを返す - bool isAbleToGiveBirth(const double age) noexcept { - //return true;// 毎回出産 - auto x = [](double age) { return (age - SimulationConstants::getInstance()->pregnant_age_min_f64) / SimulationConstants::getInstance()->childbearing_age_constant; }; - auto weight = [=](double age) { - return std::exp(-std::pow(std::log(x(age)), 2.0) / settlement::sigma_p_2_x_2) / (x(age) * settlement::sigma_x_sqrt_2_x_pi); - }; - - const double threshold = static_cast(weight(age)) * (SimulationConstants::getInstance()->childbearing_age_threshold / SimulationConstants::getInstance()->childbearing_age_all_weight); // (16 / 101.8); - + bool isAbleToGiveBirth(const std::size_t age, const bool is_agricultural) noexcept { + const double threshold = SimulationConstants::getInstance()->getChildbearingProbability(age, is_agricultural); + if (threshold == 0.0) return false; + if (threshold >= 1.0) return true; return SimulationConstants::getInstance()->random_dist(*gen) < threshold; } }; diff --git a/Library/PAX_SAPIENTICA/Simulation/SettlementAgent.hpp b/Library/PAX_SAPIENTICA/Simulation/SettlementAgent.hpp index fa9a370a2..288fb503c 100644 --- a/Library/PAX_SAPIENTICA/Simulation/SettlementAgent.hpp +++ b/Library/PAX_SAPIENTICA/Simulation/SettlementAgent.hpp @@ -59,6 +59,7 @@ namespace paxs { /// @brief Get the agent's age. /// @brief エージェントの年齢を取得する float getAge() const noexcept { return age / static_cast(SimulationConstants::getInstance()->steps_per_year); } + std::size_t getAgeSizeT() const noexcept { return static_cast(age) / static_cast(SimulationConstants::getInstance()->steps_per_year); } constexpr AgeType getAgeInt() const noexcept { return age; } diff --git a/Library/PAX_SAPIENTICA/Simulation/SimulationConst.hpp b/Library/PAX_SAPIENTICA/Simulation/SimulationConst.hpp index dd5e24571..0e6773b24 100644 --- a/Library/PAX_SAPIENTICA/Simulation/SimulationConst.hpp +++ b/Library/PAX_SAPIENTICA/Simulation/SimulationConst.hpp @@ -69,6 +69,20 @@ namespace paxs { std::uint_least8_t farming{}; }; + /// @brief + /// @brief 妊娠確率 + struct MarriageProbability { + std::vector agricultural{}; // 農耕民の確率 + std::vector hunter_gatherer{}; // 狩猟採集民の確率 + }; + /// @brief + /// @brief 出産確率 + struct ChildbearingProbability { + std::vector agricultural{}; // 農耕民の確率 + std::vector hunter_gatherer{}; // 狩猟採集民の確率 + }; + + struct SimulationConstants { // インスタンスを取得 static SimulationConstants* getInstance() { @@ -107,14 +121,6 @@ namespace paxs { std::uint_least8_t birth_interval = 10; // 妊娠可能 double pregnant_age_min_f64 = childbearing_age_min_f64 - static_cast(birth_interval) / static_cast(steps_per_year); - // 婚姻可能年齢定数 - double marriageable_age_constant = 8.5; - double marriageable_age_threshold = 0.98; - double marriageable_age_all_weight = 101.8; - // 出産可能年齢定数 - double childbearing_age_constant = 8.5; - double childbearing_age_threshold = 16.0; - double childbearing_age_all_weight = 101.8; // 結婚時に近くの集落からエージェントを探す際の探索範囲 std::uint_least32_t marriage_search_range = 60; @@ -174,6 +180,9 @@ namespace paxs { double ocean_cost = 0.5; // 海上の通行コスト double land_cost = 0.5; // 傾斜度0度の陸上の通行コスト + MarriageProbability marriage_probability; + ChildbearingProbability childbearing_probability; + std::uniform_real_distribution random_dist_f32 = std::uniform_real_distribution( 0.0f, 1.0f ); // 乱数分布 std::uniform_real_distribution random_dist = std::uniform_real_distribution( 0.0, 1.0 ); // 乱数分布 std::uniform_int_distribution step_per_year_dist = std::uniform_int_distribution( 0, 11 ); // 乱数分布 @@ -212,6 +221,96 @@ namespace paxs { return sr.getZ(area); } + // 項目の ID を返す + std::size_t getMenuIndex(const std::unordered_map& menu, const std::uint_least32_t& str_) const { + return (menu.find(str_) != menu.end()) ? menu.at(str_) : SIZE_MAX; + } + + // 婚姻確率を返す + double getMarriageProbability(const std::size_t age_, const bool is_agricultural) const noexcept { + return (is_agricultural) ? marriage_probability.agricultural[age_] : + marriage_probability.hunter_gatherer[age_]; + } + // 出産確率を返す + double getChildbearingProbability(const std::size_t age_, const bool is_agricultural) const noexcept { + return (is_agricultural) ? childbearing_probability.agricultural[age_] : + childbearing_probability.hunter_gatherer[age_]; + } + + void inputMarriage() noexcept { + std::string path = ""; + AppConfig::getInstance()->calcDataSettings(MurMur3::calcHash("SimulationProvincesPath"), + [&](const std::string& path_) {path = path_; }); + path += "/Marriage.tsv"; + paxs::InputFile probability_tsv(path); + if (probability_tsv.fail()) { + PAXS_WARNING("Failed to read Marriage TSV file: " + path); + return; + } + // 1 行目を読み込む + if (!(probability_tsv.getLine())) { + return; // 何もない場合 + } + // BOM を削除 + probability_tsv.deleteBOM(); + // 1 行目を分割する + std::unordered_map menu = probability_tsv.splitHashMapMurMur3('\t'); + marriage_probability.agricultural.clear(); + marriage_probability.hunter_gatherer.clear(); + // 1 行ずつ読み込み(区切りはタブ) + while (probability_tsv.getLine()) { + std::vector sub_menu_v = probability_tsv.split('\t'); + if ( + sub_menu_v.size() <= getMenuIndex(menu, MurMur3::calcHash("hunter_gatherer")) || + sub_menu_v.size() <= getMenuIndex(menu, MurMur3::calcHash("agricultural")) + ) { + PAXS_WARNING("Failed to read Japan Marriage TSV file: " + path + " at line " + std::to_string(i)); + marriage_probability.agricultural.emplace_back(0.0); + marriage_probability.hunter_gatherer.emplace_back(0.0); + continue; + } + marriage_probability.agricultural.emplace_back(std::stod(sub_menu_v[menu[MurMur3::calcHash("agricultural")]])); + marriage_probability.hunter_gatherer.emplace_back(std::stod(sub_menu_v[menu[MurMur3::calcHash("hunter_gatherer")]])); + } + } + void inputChildbearing() noexcept { + std::string path = ""; + AppConfig::getInstance()->calcDataSettings(MurMur3::calcHash("SimulationProvincesPath"), + [&](const std::string& path_) {path = path_; }); + if (path.size() == 0) return; + path += "/Childbearing.tsv"; + paxs::InputFile probability_tsv(path); + if (probability_tsv.fail()) { + PAXS_WARNING("Failed to read Childbearing TSV file: " + path); + return; + } + // 1 行目を読み込む + if (!(probability_tsv.getLine())) { + return; // 何もない場合 + } + // BOM を削除 + probability_tsv.deleteBOM(); + // 1 行目を分割する + std::unordered_map menu = probability_tsv.splitHashMapMurMur3('\t'); + childbearing_probability.agricultural.clear(); + childbearing_probability.hunter_gatherer.clear(); + // 1 行ずつ読み込み(区切りはタブ) + while (probability_tsv.getLine()) { + std::vector sub_menu_v = probability_tsv.split('\t'); + if ( + sub_menu_v.size() <= getMenuIndex(menu, MurMur3::calcHash("hunter_gatherer")) || + sub_menu_v.size() <= getMenuIndex(menu, MurMur3::calcHash("agricultural")) + ) { + PAXS_WARNING("Failed to read Japan Childbearing TSV file: " + path + " at line " + std::to_string(i)); + childbearing_probability.agricultural.emplace_back(0.0); + childbearing_probability.hunter_gatherer.emplace_back(0.0); + continue; + } + childbearing_probability.agricultural.emplace_back(std::stod(sub_menu_v[menu[MurMur3::calcHash("agricultural")]])); + childbearing_probability.hunter_gatherer.emplace_back(std::stod(sub_menu_v[menu[MurMur3::calcHash("hunter_gatherer")]])); + } + } + void init() { std::string str = ""; AppConfig::getInstance()->calcDataSettings(MurMur3::calcHash("SimulationConstants"), @@ -249,13 +348,6 @@ namespace paxs { stoiFunc(kvt, MurMur3::calcHash("marriage_search_range"), [&](const std::string& str_) {marriage_search_range = static_cast(std::stoul(str_)); }); marriage_search_range_pow2 = marriage_search_range * marriage_search_range; - stoiFunc(kvt, MurMur3::calcHash("marriageable_age_constant"), [&](const std::string& str_) {marriageable_age_constant = std::stod(str_); }); - stoiFunc(kvt, MurMur3::calcHash("marriageable_age_threshold"), [&](const std::string& str_) {marriageable_age_threshold = std::stod(str_); }); - stoiFunc(kvt, MurMur3::calcHash("marriageable_age_all_weight"), [&](const std::string& str_) {marriageable_age_all_weight = std::stod(str_); }); - stoiFunc(kvt, MurMur3::calcHash("childbearing_age_constant"), [&](const std::string& str_) {childbearing_age_constant = std::stod(str_); }); - stoiFunc(kvt, MurMur3::calcHash("childbearing_age_threshold"), [&](const std::string& str_) {childbearing_age_threshold = std::stod(str_); }); - stoiFunc(kvt, MurMur3::calcHash("childbearing_age_all_weight"), [&](const std::string& str_) {childbearing_age_all_weight = std::stod(str_); }); - stoiFunc(kvt, MurMur3::calcHash("cell_group_length"), [&](const std::string& str_) {cell_group_length = static_cast(std::stoul(str_)); }); stoiFunc(kvt, MurMur3::calcHash("immigration_start_steps"), [&](const std::string& str_) {immigration_start_steps = static_cast(std::stoul(str_)); }); stoiFunc(kvt, MurMur3::calcHash("immigration_end_steps"), [&](const std::string& str_) {immigration_end_steps = static_cast(std::stoul(str_)); }); @@ -282,6 +374,9 @@ namespace paxs { stoiFunc(kvt, MurMur3::calcHash("land_cost"), [&](const std::string& str_) {land_cost = std::stod(str_); }); pregnant_age_min_f64 = childbearing_age_min_f64 - static_cast(birth_interval) / static_cast(steps_per_year); + + inputMarriage(); + inputChildbearing(); } SimulationConstants() { diff --git a/Library/PAX_SAPIENTICA/Version.hpp b/Library/PAX_SAPIENTICA/Version.hpp index ffae57987..ed4c0187f 100644 --- a/Library/PAX_SAPIENTICA/Version.hpp +++ b/Library/PAX_SAPIENTICA/Version.hpp @@ -19,7 +19,7 @@ // 正式バージョン数値 #ifndef PAX_SAPIENTICA_LIBRARY_VERSION -#define PAX_SAPIENTICA_LIBRARY_VERSION (20241030L) +#define PAX_SAPIENTICA_LIBRARY_VERSION (20241214L) #endif // PAX_SAPIENTICA 主要バージョン ( 0 がテスト版 , 1 から正式リリース版 ) [vX.a.a] @@ -34,12 +34,12 @@ // PAX_SAPIENTICA 微修正バージョン [v6.0.a.a.X] #ifndef PAX_SAPIENTICA_LIBRARY_PATCHLEVEL -#define PAX_SAPIENTICA_LIBRARY_PATCHLEVEL (10) +#define PAX_SAPIENTICA_LIBRARY_PATCHLEVEL (16) #endif // バージョン名 ( https://github.com/AsPJT/PAX_SAPIENTICA ) #ifndef PAX_SAPIENTICA_LIBRARY_VERSION_NAME -#define PAX_SAPIENTICA_LIBRARY_VERSION_NAME "1.2.10 KIZAMIME TOTTAIMON" +#define PAX_SAPIENTICA_LIBRARY_VERSION_NAME "1.2.16 KIZAMIME TOTTAIMON" #endif //char name[ @@ -51,6 +51,12 @@ 更新履歴 バージョン | 更新日 | 概要 6.0.1.0.X | 2024/0X/XX | コピペ用 + 6.0.1.2.16 | 2024/12/14 | 生活に関するTSVデータ入力の追加 #116 + 6.0.1.2.15 | 2024/12/13 | 婚姻処理の高速化 #115 + 6.0.1.2.14 | 2024/12/10 | シミュレーションの人間・設定初期化ボタン・青銅器変数を追加 #114 + 6.0.1.2.13 | 2024/11/30 | 婚姻処理の高速化 #113 + 6.0.1.2.12 | 2024/11/17 | シミュレーションに婚姻移動表示とグリッド表示機能を追加 #112 + 6.0.1.2.11 | 2024/10/31 | シミュレーション変数の命名変更 #111 6.0.1.2.10 | 2024/10/30 | シミュレーション結果の追加 #110 6.0.1.2.9 | 2024/10/26 | 渡来人及び地区別の初期時の狩猟採集、農耕、SNP、言語の値の指定機能 #109 6.0.1.2.8 | 2024/10/26 | シミュレーションの選択項目のテキストを表示 #109