市场清仓价格算法 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库等

posted @ 2020-09-07 09:37  aminor  阅读(1236)  评论(0)    收藏  举报
/**/ /**/