python实现数模问题2

问题2:如果网上购物需要按仓库所在地缴纳消费税,企业建仓库时要考虑为消费者减少消费税以保持企业产品的竞争力。请你建模分析:如果尽可能少建仓库,订货要保证一天内送达,而且尽可能为消费者减轻消费税负担,应该在哪几个城市建立仓库?并求出各仓库的规模比和它的供应范围。

#-*- coding=utf-8 -*-
import xlrd
import copy
#录入数据#
#########

data=xlrd.open_workbook("C:/Users/hasee/Desktop/visualableWea.vscode/Bdata2.xls")
table = data.sheets()[0]  #获得表格

curDom=[2, 4, 18, 19, 50, 7, 39, 1, 22, 10, 11, 31, 6, 8, 24, 47, 3, 5]
for x in range(len(curDom)):
    curDom[x]-=1
effect=0.03
listInf=[]

for i in range(1,51):
    list1=[]
    for j in range(0,9):
        if j not in [0,1,2,3] :
            list1.append(table.cell(i,j).value)
    listInf.append(list1)   

data=xlrd.open_workbook("C:/Users/hasee/Desktop/visualableWea.vscode/excel_out2.xls")
table = data.sheets()[0] 

listx=[]
for i in range(2,52):
    list1=[]
    for j in range(2,53):
        list1.append(table.cell(i,j).value)
    listx.append(list1) 

connectedToBackup=[[] for x in range(50)] #相连城市的备选表
taxInf=[]
for x in range(50):
    connectedToBackup[x].append(x)
    for y in range(50):
        if listx[x][y]==1:
            connectedToBackup[x].append(y)
#########

#########
#函数def部分

def domed(curDom):
    connected=[0 for x in range(50)]
    for x in range(len(curDom)):
        connected[x]=1
        for y in range(50):
            if listx[x][y]==1:
                connected[y]=1

    if 0 in connected:
        return False
    else:
        return True

def calTaxCur(curDom): #计算当前tax情况
    taxInf=[[] for x in range(50)]
    for x in range(50):
        for y in range(2):
            taxInf[x].append(0)
    taxSum=0
    for x in range(50):
        tax=1000000
        for y in range(50):
            if (y in curDom) and (y in connectedToBackup[x]):
                curTax=float(listInf[x][0])*float(listInf[y][3])+float(listInf[x][1])*float(listInf[y][4])
                if tax>=curTax:
                    tax=curTax
                    taxInf[x][0]=y
                    taxInf[x][1]=curTax
        taxSum=taxSum+taxInf[x][1]
    temp=[taxInf,taxSum]    
    return temp


def trySubCity(curDom): #看看是否能在支配集中替换某一个城市
    for x in range(len(curDom)): #测试每个城市
        for y in range(50):
            testDom=copy.deepcopy(curDom)
            testDom[x]=y
            if domed(testDom):
                if calTaxCur(testDom)[1]<taxCurSum: #应该被替换  
                    return testDom
    return curDom           

def tryAddCity(curDom): #尝试在支配集中加入一个城市
    for y in range(50):
        if y not in curDom:
            testDom=copy.deepcopy(curDom)
            testDom.append(y)
            testTaxSum=calTaxCur(testDom)[1]
            if testTaxSum<taxCurSum: #应该被替换 
                if taxCurSum-testTaxSum>taxCurSum*effect:#效率上升X%
                    temp=[testTaxSum,testDom]   
                    return temp
    temp=[taxCurSum,curDom]     
    return temp
########

##
#主体部分

taxCurSum=calTaxCur(curDom)[1]
flag=True
while flag:
    flag=False
    while((trySubCity(curDom))!=curDom): #if updated
        curDom=trySubCity(curDom)
        flag=True   
        print('1')
    temp=tryAddCity(curDom) 
    print('2')
    while(temp[1]!=curDom): #有更新的话
        taxCurSum=temp[0]
        curDom=temp[1]
        flag=True
        print('3')
print(curDom)
print(taxCurSum)
##


########
#bakcup
'''
def baoli(listx,pointNumSum):
    answer=[]
    connected=[0 for x in range(pointNumSum)]
    for x in range(pointNumSum):#处理数值
        listx[x][pointNumSum]+=1
    for x in range(pointNumSum):
        if (listx[x][pointNumSum]==1): #找到孤立点
            answer.append(x+1)
            connected[x]=1
            listx[x][pointNumSum]-=1

    for x in range(pointNumSum):
        max,flag=1,0
        for y in range(pointNumSum):
            if listx[y][pointNumSum]>max and y+1 not in answer: #找出当前能覆盖最多非被覆盖的点的非支配集内的点
                max=listx[y][pointNumSum]
                flag=y
        if max>1 : #如果还找的出未入支配集的且与最多未被覆盖点相连的点
            answer.append(flag+1)
            connected[flag]=1
            listx[flag][pointNumSum]-=max
            for z in range(pointNumSum):
                if listx[flag][z]==1: #如果有与要加入支配集的点相连的点
                    connected[z]=1 #相连点置1
                    listx[z][pointNumSum]-=2
                    for m in range(pointNumSum):
                        if listx[z][m]==1:
                            listx[m][pointNumSum]-=1
    for x in range(pointNumSum):
        if (listx[x][pointNumSum]==1  ): #找到孤立点
            answer.append(x+1)
            connected[x]=1
    #print(connected)

    return answer
'''

effect=0.045 curDom=[1, 3, 17, 18, 49, 6, 38, 0, 21, 9, 10, 30, 5, 7, 23, 46, 2, 4] taxSum=42065.62280000002
effect=0.045 curDom=[2, 4, 18, 19, 50, 7, 39, 1, 22, 10, 11, 31, 6, 8, 24, 47, 3, 5, 16] taxSum=40193.388800000015
effect=0.03 curDom=[2, 4, 18, 19, 50, 7, 39, 1, 22, 10, 11, 31, 6, 8, 24, 47, 3, 5, 16, 23] taxSum=38871.30630000001

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值