河北富宇环保设备有限公司
河北富宇环保设备有限公司是专业从事UV光氧,VOC催化燃烧设备,布袋除尘器,小型除尘器,脉冲除尘器,单机除尘器,旋风除尘器,湿式除尘器及除尘器骨架,除尘器布袋,电磁脉冲阀,脉冲控制仪,星型卸料器等。
www.chuchenhb.com背景
期货市场上的货物卖方和货物的买方期望通过期货市场进行货物买卖,达到买卖双方钱货交换的目的(买方从卖方获取货物并向卖方支付对应货款)。
数据说明
1)货物数量均为正整数,且所有买方购买货物数量总和等于所有卖方公布的货物数量总和。
2)货物编号为货物的唯一编号,不同卖方客户可持有相同货物编号的货物,其可拆分分配给不同的买方客户,但拆分后的数量也必须为正整数,其货物编号也保持不变;同一买方客户从相同卖方客户获得的同一货物编号的货物应按货物编号对数量进行合并。
3)每个客户在每个品种上最多有一条购买货物意向,一条意向中,不同优先级的意向维度不能相同。
解题思路
1、以买方为主体,遍历buyer数据(也可以卖方为主体,倒过来也可以试试)
2、根据买家的五个意向找到相应的卖家
3、按顺序遍历相应的卖家数据,如果品种相同就进行交易
4、如果卖家卖完了,删掉此卖家;如果买家买完了,卖家的货物数量减掉买家买完的
代码如下,每天持续更新,请持续关注
# encoding:utf-8
import os
'''
1)货物数量均为正整数,且所有买方购买货物数量总和等于所有卖方公布的货物数量总和。
2)货物编号为货物的唯一编号,不同卖方客户可持有相同货物编号的货物,
其可拆分分配给不同的买方客户,但拆分后的数量也必须为正整数,其货物编号也保持不变;
同一买方客户从相同卖方客户获得的同一货物编号的货物应按货物编号对数量进行合并。
3)每个客户在每个品种上最多有一条购买货物意向,一条意向中,不同优先级的意向维度不能相同。
输出结果应包括买方客户、卖方客户、品种、货物编号、仓库、分配货物数量、
对应意向顺序(对应多个则填写对应意向顺序,以“-”分割)。
如果该匹配条目不对应任何意向,或者客户未提任何意向,则“对应意向顺序”列填0 。
'''
import pandas as pd
import csv
os.chdir(r'E:\项目文件\CCF\基于买方意向的货物撮合交易')
def writeOneCsv(relate_record, src):
with open(src, 'a', newline='\n') as csvFile:
writer = csv.writer(csvFile)
writer.writerow(relate_record)
buyer = pd.read_csv('buyer.csv', encoding='gbk', dtype=str)
result = pd.read_csv('result.csv', encoding='gbk', dtype=str)
seller = pd.read_csv('seller.csv', encoding='gbk', dtype=str)
# 用于记录已卖掉的id
selled = []
for one in buyer.itertuples():
buyer1 = getattr(one, '买方客户')
buy_num = getattr(one, '购买货物数量')
brand = getattr(one, '品种')
first = getattr(one, '第一意向')
first1 = getattr(one, '值1')
second = getattr(one, '第二意向')
second2 = getattr(one, '值2')
third = getattr(one, '第三意向')
third3 = getattr(one, '值3')
forth = getattr(one, '第四意向')
forth4 = getattr(one, '值4')
fifth = getattr(one, '第五意向')
fifth5 = getattr(one, '值5')
yx = '1'
data = pd.DataFrame()
if isinstance(fifth, str):
data = seller[(seller[first] == first1) & (seller[second] == second2) & (seller[third] == third3) &
(seller[forth] == forth4) & (seller[fifth] == fifth5)]
yx = '1-2-3-4-5'
elif isinstance(forth, str):
data = seller[(seller[first] == first1) & (seller[second] == second2) & (seller[third] == third3) &
(seller[forth] == forth4)]
yx = '1-2-3-4'
elif isinstance(third, str):
data = seller[(seller[first] == first1) & (seller[second] == second2) & (seller[third] == third3)]
yx = '1-2-3'
elif isinstance(second, str):
data = seller[(seller[first] == first1) & (seller[second] == second2)]
yx = '1-2'
elif isinstance(first, str):
data = seller[(seller[first] == first1)]
else:
# 只买SR的情况
data = seller[(seller['品种'] == 'SR')]
yx = '0'
for index, row in data.iterrows():
id = getattr(row, 'id')
if not id in selled:
brand1 = getattr(row, '品种')
seller1 = getattr(row, '卖方客户')
goods_id = getattr(row, '货物编号')
sell_num = getattr(row, '货物数量(张)')
cart = getattr(row, '仓库')
brand2 = getattr(row, '品牌')
location = getattr(row, '产地')
year = getattr(row, '年度')
level = getattr(row, '等级')
cat = getattr(row, '类别')
if brand == brand1:
sy_num = int(buy_num) - int(sell_num)
if sy_num > 0:
print('卖家卖完了,买家还要买')
finish = [buyer1, seller1, brand, goods_id, cart, sell_num, yx]
writeOneCsv(finish, 'new1212.csv')
print(finish)
selled.append(id)
seller = seller.drop([int(id)])
else:
finish = [buyer1, seller1, brand, goods_id, cart, buy_num, yx]
writeOneCsv(finish, 'new1212.csv')
print('买家买完了,卖家还有剩')
print(finish)
seller.iloc[int(id), 4] = int(sell_num) - int(buy_num)
break
可以试试的算法或软件:
遗传算法
遗传算法 求解旅行商 TSP 问题,matlab代码
python实现遗传算法(旅行商问题)
cplex强行搜索
使用CPlex CP求解约束规划问题
gurobi
Gurobi 求解简单约束规划
lingo
最小匹配算法的lingo程序
TAG:CCF