Skip to content

Latest commit

 

History

History
138 lines (118 loc) · 5.41 KB

rules.md

File metadata and controls

138 lines (118 loc) · 5.41 KB

利维坦框架

生存单位:人

  • 基本属性:
    • 生产力
    • 决策参数
    • 父母与孩子
  • 状态:
    • 血量
    • 食物存储
    • 年龄
    • 关系(记忆)

基本关系

  • 人与人相互之间的关系由相互行动的记忆决定
  • 记忆包含:
    • 给予/收到食物的数量
    • 战斗中的被打

行动

  • 人的行动包含自我行动以及相互行动:
    • 自我行动:生产,消费
    • 相互行动:交易,战斗,生育,模仿
  • 行动与否,行动的方式由决策函数描述
    • 每个决策(暂时)由线型函数与阈值($ax + by + \dots>1$)决定
    • 函数的参数($a, b, \dots$)为知识,由遗传和学习影响
    • 函数的输入($x, y, \dots$)为相互关系和双方状态
  • 行动的结果
    • 改变记忆
    • 改变个人状态
    • (生育)产生新个体

实现方式

数据结构

  • Member类:
    • 描述个体
    • 记录基本属性
    • 记录状态
  • Island类:
    • 描述集体,控制模拟轮次
    • 记录相互关系(记忆矩阵)

模拟方式

  1. 初始化:
    1. 设置并记录随机数种子
    2. 产生$N$位Member,随机设定初始属性和状态,随机设定相互关系,随机设置决策函数参数
  2. 生产
    1. 根据生产力,增加食物存储
  3. 战斗
    1. 随机分组、组内排序。
    2. 按概率设定某组相互开战与否(为了减少运算消耗)
    3. 在开战的组内,遍历组员。根据【攻击决策】函数,选出所有攻击者与被攻击者的组合
    4. 双方互相攻击,互相造成对方扣除与自身生命值相关的血量;双方互相偷盗对方的财产,数额与自身生命值相关
    5. 若有死亡案例,更新集体列表,更新编号,更新关系矩阵
  4. 消费
    1. 计算消耗量。消耗量会随着年龄逐步提升 (归一化决策函数中的年龄)
    2. 从血量中扣除消耗量,若血量小于零则记为死亡
    3. 从仓库中吃食物回满血
    4. 若有死亡案例,更新集体列表,更新编号,更新关系矩阵
  5. 交易与交流
    1. 随机分组、组内排序。
    2. 根据【给予决策】函数,选出一个(或零个)给予对象,给予与决策函数相关的仓库数额(为了避免bug,此数额要小于等于仓库存储量)
    3. 【给予决策】函数:需要考虑双方的关系网,如把对其他人记忆的内积作为输入。
    4. 被给予者的参数会被帮助者影响,参数改变为两人的均值
  6. 生育
    1. 择出满足年龄条件的人
    2. 随机分组,组内排序。
    3. 每组内便利,根据【生育决策】函数,判断互相好感,选择父母
    4. 判断双方是否满足生育条件(血量和仓库之和)
    5. 父母按比例扣除仓库数,总和为固定值,仓库不足时扣除血量。
    6. 产生孩子。设定孩子年龄(0),父母。孩子随机继承父母的基本属性与决策参数,添加少许随机浮动。孩子的初始血量为固定值(小于父母消耗值),存储……
    7. 父母无条件地offer孩子一次
    8. 若有出生案例,更新集体列表,更新编号,更新关系矩阵
  7. (模仿)
  8. 重复2~

记录模型不完美的地方

  1. 决策输入的关系矩阵内积,可以拆分各项
  2. 决策函数的关系矩阵内积,可以更聪明地归一化(如victim_passive和benefit_passive可采用不同归一化函数形式。)

土地、地图

  1. 地图:二维格点,上下、左右联通。成员可以拥有格点
  2. *生产:基于拥有的土地量,决定生产力,如:productivity = f(land)。f是一个上凸函数
  3. 通行权:
    1. 作为新的记忆存储
    2. 给予双方的决策函数决定是否通行
    3. 可以通过允许通行的土地,与接壤的成员交易、战斗、扩张、生育(如下)
  4. 战斗、交易
    1. 假设 A <-> B | C [ ]
    2. A可以与B无条件战斗或交易
    3. A与C发生的战斗、交易,需经过B的同名决策函数判断
    4. 击杀敌人后,敌人立即丢失所有土地,面前战斗的土地立刻分给击杀者(临时方案:立刻获得扩张机会一次)
  5. *给予土地
    1. 类似给予决策函数,编写给予土地的决策函数(或者可以是同一个函数)
    2. 给予的对象为有通行权的人
    3. 若决定给予,那么选择离自己最远,离对象最近的土地
  6. *扩张
    1. 编写扩张决策函数
    2. 假设 A <-> B | [ ] C
    3. A扩张到[ ],需经过B的同名决策函数判断,当B无意扩张(不可能),A才能成功扩张
  7. 生育
    1. 对象为有通行权的人
    2. 给予土地
  8. 把空间关系加入到决策函数的输入中:
    1. 土地数
    2. 邻居数
    3. 允许通行的人数
    4. 。。。
  9. 死亡后,土地的处理
    1. 每次战斗死亡后,桥头堡与作战者可进行一次无条件扩张,有机会吸收土地
    2. 自然死亡后,土地平均分给孩子(利用给予函数)
  10. 每轮打乱存活成员列表
  • shuffled_members = self._backup_member_list(to_split)
  • self._rng.shuffle(shuffled_members)
  1. 每轮保存地图

原有模型的改动

f = A * a + B * b + C * c = [A, B, C].T @ [a, b, c]

f = A * a + B * b + C * c + X * a * b + Y * b * c + Z * a * c = [A, B, C].T @ [a, b, c] + [a, b, c].T @ M @ [a, b, c] M = [[0, X, Z], [X, 0, Y], [Z, Y, 0]]

强调家庭关系

  1. 出生时,给予特定数量的土地