问题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
…