- 基本属性:
- 生产力
- 决策参数
- 父母与孩子
- 状态:
- 血量
- 食物存储
- 年龄
- 关系(记忆)
- 人与人相互之间的关系由相互行动的记忆决定
- 记忆包含:
- 给予/收到食物的数量
- 战斗中的被打
- 人的行动包含自我行动以及相互行动:
- 自我行动:生产,消费
- 相互行动:交易,战斗,生育,模仿
- 行动与否,行动的方式由决策函数描述
- 每个决策(暂时)由线型函数与阈值($ax + by + \dots>1$)决定
- 函数的参数($a, b, \dots$)为知识,由遗传和学习影响
- 函数的输入($x, y, \dots$)为相互关系和双方状态
- 行动的结果
- 改变记忆
- 改变个人状态
- (生育)产生新个体
- Member类:
- 描述个体
- 记录基本属性
- 记录状态
- Island类:
- 描述集体,控制模拟轮次
- 记录相互关系(记忆矩阵)
- 初始化:
- 设置并记录随机数种子
- 产生$N$位Member,随机设定初始属性和状态,随机设定相互关系,随机设置决策函数参数
- 生产
- 根据生产力,增加食物存储
- 战斗
- 随机分组、组内排序。
- 按概率设定某组相互开战与否(为了减少运算消耗)
- 在开战的组内,遍历组员。根据【攻击决策】函数,选出所有攻击者与被攻击者的组合
- 双方互相攻击,互相造成对方扣除与自身生命值相关的血量;双方互相偷盗对方的财产,数额与自身生命值相关
- 若有死亡案例,更新集体列表,更新编号,更新关系矩阵
- 消费
- 计算消耗量。消耗量会随着年龄逐步提升 (归一化决策函数中的年龄)
- 从血量中扣除消耗量,若血量小于零则记为死亡
- 从仓库中吃食物回满血
- 若有死亡案例,更新集体列表,更新编号,更新关系矩阵
- 交易与交流
- 随机分组、组内排序。
- 根据【给予决策】函数,选出一个(或零个)给予对象,给予与决策函数相关的仓库数额(为了避免bug,此数额要小于等于仓库存储量)
- 【给予决策】函数:需要考虑双方的关系网,如把对其他人记忆的内积作为输入。
- 被给予者的参数会被帮助者影响,参数改变为两人的均值
- 生育
- 择出满足年龄条件的人
- 随机分组,组内排序。
- 每组内便利,根据【生育决策】函数,判断互相好感,选择父母
- 判断双方是否满足生育条件(血量和仓库之和)
- 父母按比例扣除仓库数,总和为固定值,仓库不足时扣除血量。
- 产生孩子。设定孩子年龄(0),父母。孩子随机继承父母的基本属性与决策参数,添加少许随机浮动。孩子的初始血量为固定值(小于父母消耗值),存储……
- 父母无条件地offer孩子一次
- 若有出生案例,更新集体列表,更新编号,更新关系矩阵
- (模仿)
- 重复2~
- 决策输入的关系矩阵内积,可以拆分各项
- 决策函数的关系矩阵内积,可以更聪明地归一化(如victim_passive和benefit_passive可采用不同归一化函数形式。)
- 地图:二维格点,上下、左右联通。成员可以拥有格点
- *生产:基于拥有的土地量,决定生产力,如:productivity = f(land)。f是一个上凸函数
- 通行权:
- 作为新的记忆存储
- 给予双方的决策函数决定是否通行
- 可以通过允许通行的土地,与接壤的成员交易、战斗、扩张、生育(如下)
- 战斗、交易
- 假设 A <-> B | C [ ]
- A可以与B无条件战斗或交易
- A与C发生的战斗、交易,需经过B的同名决策函数判断
- 击杀敌人后,敌人立即丢失所有土地,面前战斗的土地立刻分给击杀者(临时方案:立刻获得扩张机会一次)
- *给予土地
- 类似给予决策函数,编写给予土地的决策函数(或者可以是同一个函数)
- 给予的对象为有通行权的人
- 若决定给予,那么选择离自己最远,离对象最近的土地
- *扩张
编写扩张决策函数假设 A <-> B | [ ] CA扩张到[ ],需经过B的同名决策函数判断,当B无意扩张(不可能),A才能成功扩张
- 生育
- 对象为有通行权的人
- 给予土地
- 把空间关系加入到决策函数的输入中:
- 土地数
- 邻居数
- 允许通行的人数
- 。。。
- 死亡后,土地的处理
每次战斗死亡后,桥头堡与作战者可进行一次无条件扩张,有机会吸收土地自然死亡后,土地平均分给孩子(利用给予函数)
- 每轮打乱存活成员列表
- shuffled_members = self._backup_member_list(to_split)
- self._rng.shuffle(shuffled_members)
- 每轮保存地图
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]]
- 出生时,给予特定数量的土地