市场清仓价格算法 python求矩阵不同行不同列元素和的最大值
问题描述
求矩阵不同行不同列元素和的最大值(最小值)
问题求解
1.通过scipy库求解
scipy.optimize库中的linear_sum_assignment方法可以求解
输入一个矩阵,参数maximize=True时找最大值,否则求解最小值
返回元素所在的行坐标,列坐标
import numpy as np
from scipy.optimize import linear_sum_assignment
data = np.array([[10, 3, 6], [5, 2, 4], [2, 1, 5]])
rindex, cindex = linear_sum_assignment(data,maximize=True)
result = data[rindex, cindex]
print(rindex,cindex,result,sep='\n')
output:
[0 1 2]
[0 1 2]
[10 2 5]
2.通过市场清仓价格算法求解
具体相关术语,详见书籍《网络、群体与市场》10.3节
import numpy as np
# 估值矩阵
data = np.array([[10, 42, 35], [12, 45, 63], [44, 25, 44]])
# 市场清仓价格 初始化为0
price = np.zeros(data.shape[0],dtype=np.int)
# 不断循环直到找到市场清仓价格
while True:
# 收益矩阵 = 估值矩阵 - 价格
mdata = data - price
# 找出每个人的偏好卖家
prefer = mdata == np.max(mdata,1)[:,None]
# 计算每个卖家 有多少买家想买
prefer_sum = np.sum(prefer,0)
# 对于某个卖家,若买家大于1 就代表有受限组 否则此时为市场清仓价格
if not np.sum(prefer_sum > 1):
break
# 受限组的卖家价格提高1
price += (prefer_sum>1).astype(int)
print('清仓价格:',price)
print('偏好卖家:',prefer,sep='\n')
print('结果:',data[prefer])
output:
清仓价格: [4 0 3]
偏好卖家:
[[ True False False]
[False True False]
[False False True]]
结果: [10 2 5]
3.通过整数规划求解
略,可以通过各种软件和库进行整数规划,例如matlab cvx库等

浙公网安备 33010602011771号