Capacitated Facility Location Problem贪心算法实现

本文介绍了Capacitated Facility Location Problem的问题背景,即如何在满足顾客需求和工厂容量限制的同时,最小化总成本。文章提出了解决思路,包括将客户分配给设施的策略,并详细描述了基于贪心算法的代码实现,最终展示了运行结果。项目由三位成员共同完成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

给定Ñ个工厂和米个顾客,开工厂需要一定的费用,一个工厂有一定的容量限制,每个顾客也有一定的需求,而每个顾客要选取某个工厂也需要一定的分配费用,现在要求找出一个分配方案,把顾客分配给不同的工厂,然后在可以满足所有顾客需求的前提下让所有的花费(开工厂的花费和分配的花费)最小。

问题分析:

解决思路

设集合I = {1,...,m}是所有设施

集合J = {1,...,n}是所有客户

对于每个客户都有一个需求D_ {}Ĵ,只能被一个设施提供

对于每个设施都有一个容量,双}是该设施最多能提供的容量

对于每个设施都有一个固定成本F_ {I},当该设施开启的时候固定的开销

定义C_ {} IJ是设施j满足顾客我的要求的开销

对于每个设施i∈I,定义变量义}

          y_ {i} = \ left \ {\ begin {matrix} 1,如果设施打开&\\ 0,如果设施关闭&\ end {matrix} \ right。

对于每个设施i∈I,每个客户j∈J,定义变量 X_ {} IJ

x_ {ij} = \ left \ {\ begin {matrix} 1,if.facility.i.is.assigned.for.customer.j&\\ 0,否则&\ end {matrix} \ right。
对于单源容量设施位置问题可以描述为如下

因为顾客一般都比设施多,所以只关注客户的成本,可以制定出如下策略:

1.遍历所有客户,对于每一个客户,将该客户安排到所有设施的成本进行从小到大排序
2.对排序好的成本进行遍历,假如该设施剩余的容量满足客户的要求,则将该客户安排到该设施

3.代码实现

import random
import math
import matplotlib.pyplot as plt

CAPACITY = []
OPENCOST = []
ASSIGNCOST = []
OPENSTATUS = []
DEMAND = []
FACNUM = 0
CUSNUM = 0
Num = 0

#读取文件,获取各项变量
def init(filepath):
    with open(filepath, 'r') as f:
        global FACNUM
        global CUSNUM
        global CAPACITY
        global OPENCOST
        global ASSIGNCOST
        global OPENSTATUS
        FACNUM, CUSNUM = f.readline().strip("\n").split()
        FACNUM = int(FACNUM)
        CUSNUM = int(CUSNUM)
        OPENSTATUS = [0] * FACNUM
        for i in range(FACNUM):
            line = f.readline().strip("\n").split()
            CAPACITY.append(int(line[0]))
            OPENCOST.append(int(line[1]))

        for i in range(int(CUSNUM / 10)):
            line = f.readline().strip("\n").replace(' ', '').split(".")
            for j in range(10):
                DEMAND.append(int(line[j]))

        for i in range(CUSNUM):
            linetoread = int(FACNUM / 10)
            temp = []
            for j in range(linetoread):
                line = f.readline().strip("\n").replace(' ', '').split(".")
                for k in range(10):
                    temp.append(int(line[k]))

            ASSIGNCOST.append(temp)

    print(ASSIGNCOST)

def greedy():
    global CAPACITY

    capacity = CAPACITY.copy()
    openstatus = [0] * FACNUM
    totalcost = 0
    assign = [-1] * CUSNUM
    assigncost = 0
    opencost = 0

    for cus in range(CUSNUM):
    
        facIndex = []       # the facilities may be chosen
        for i in range(FACNUM):
            if capacity[i] >= DEMAND[cus]:
                facIndex.append(i)

        # ASSIGNCOST for customer i
        asforeach = ASSIGNCOST[cus]

        # ASSIGNCOST + OPENCOST for customer i
        temp = [sum(x) for x in zip(asforeach, OPENCOST)]

        # select the min cost index
        sindex = facIndex[0]
        for i in facIndex:
            if temp[i] < temp[sindex]:
                sindex = i

        openstatus[sindex] = 1
        capacity[sindex] = capacity[sindex] - DEMAND[cus]
        assign[cus] = s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值