AMPL 简单运输模型

本文探讨了如何通过简单的运输模型来决定在给定供给和需求条件下,如何合理分配货物,以实现总运输成本最低。涉及始发站、目的站、产品、成本矩阵、目标函数和约束条件的详细建模过程,以及Go语言在数据模型中的应用。
摘要由CSDN通过智能技术生成

(1)简单运输模型包括始发站(supply points),目的站(demand points)以及运输的产品。

(2)已知条件:

  • 供给量
  • 需求量

栗子:假如现在有3个始发站,4个目的站,如下图:

BE1F0428-C646-4AC3-8B41-229BA88DF767.png

单位运输成本

始发站/目的站1234
1150250300275
2200175350150
3250300400260

注释:始发站1——>目的站1的运输成本是150,到目的站2是250,其他依次。

(3)目标函数

在建模之前我们要清楚目标函数以及限制条件,为了满足客户需求,如何分配运输数量?使得总运输成本最小化。每一个目的站运输到目的站的数量是一个变量设为X。

(4)限时条件

  • 每一个需求站点,收到的货物要满足其需求量,也就是说每个目的站收到的货物必须大于等于原来需求量(比如始发站1运输到目的站1需要大雨等于150,因为目的站1需求是150)
  • 每一个供给站点,发出的货物不能超过供给量(发出来的货物不能大于原来要求的量,比如始发站1发出来的货物必须小于等于350)

(5)mode模型:

set origin;#始发站a-c
set des;#目的站defg
param supply{origin};#不同站点不同供给量
param demend(des);#不同目的站不同需求量
param cost{origin,des};#不同始发站发往不同目的站单位成本不一样的

#声明变量(两点间运输量是未知)
var trans{origin,des}>=0;#任意始发站与任意目的站间的运量

#trans[i,j]*cost[i,j];(任意两点间运输量X任意两点间成本)是任意两点间成本
#求所有的运输成本在前面sum{i in origin,j in des}
minimize total_cost:
trans[i,j]*cost[i,j];

#限制条件
#sum{i in origin}trans[i,j]求和表示从不同始发站发出来的量必须大于等于目的站的需求量
subject to demend_limit{j in demand}:
sum{i in origin}trans[i,j]>=demand[j];#要大于ydemand[j]每各点需求量

subject to supply_limit{i in supply}:
sum{j in des}trans[i,j]<=supply[i];#发出的货物不能超过供给量

(6)data模型:

#参数后面可以直接写【集合】:赋以参数(ABC后面写上对应的参数)
param:origin:supply :=
A 350
B 300
C 300;
param:des:demand :=
D 150
E 230
F 160
G 220;
param cost: D E F G :=
A 150 250 300 275
B 200 175 350 150
C 250 300 400 260;

Go 语言学习路线,已被GitHub收录:https://github.com/metashops/GoFamily
在这里插入图片描述

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一道Ampl的生产模型的例题及其解答: 例题:某工厂有三种机器(A、B、C),可以用来生产两种产品(X、Y)。机器A每小时可以生产3个X或4个Y;机器B每小时可以生产4个X或3个Y;机器C每小时可以生产5个X或2个Y。每小时使用的成本分别为:机器A 10元,机器B 12元,机器C 15元。如果每小时的销售收入是:产品X 25元,产品Y 20元。现在该工厂有8台机器A,10台机器B和6台机器C,问如何分配机器,才能使每小时的总利润最大? 解答: Ampl代码如下: ``` # 定义集合 set Machines := A B C; set Products := X Y; # 定义参数 param ProductionRate{Machines, Products}; param Cost{Machines}; param Revenue{Products}; # 定义变量 var MachineUse{Machines} integer >= 0; # 定义目标函数 maximize TotalProfit: sum{m in Machines} (Revenue['X']*ProductionRate[m,'X'] - Cost[m])*MachineUse[m] + sum{m in Machines} (Revenue['Y']*ProductionRate[m,'Y'] - Cost[m])*MachineUse[m]; # 定义约束条件 subject to ProductionX: sum{m in Machines} ProductionRate[m,'X']*MachineUse[m] <= 8*3 + 10*4 + 6*5; subject to ProductionY: sum{m in Machines} ProductionRate[m,'Y']*MachineUse[m] <= 8*4 + 10*3 + 6*2; solve; # 打印结果 printf "Machine Use:\n"; for {m in Machines} { printf "%s: %d\n", m, MachineUse[m]; } printf "Total Profit: %.2f\n", TotalProfit; ``` 解释: 1. 定义集合 定义了两个集合:Machines(机器)和Products(产品)。 ``` set Machines := A B C; set Products := X Y; ``` 2. 定义参数 定义了三个参数:ProductionRate(生产速率)、Cost(成本)和Revenue(收入)。 ``` param ProductionRate{Machines, Products} := A X 3 A Y 4 B X 4 B Y 3 C X 5 C Y 2; param Cost := A 10 B 12 C 15; param Revenue := X 25 Y 20; ``` 3. 定义变量 定义了一个变量:MachineUse(机器使用数量)。 ``` var MachineUse{Machines} integer >= 0; ``` 4. 定义目标函数 定义了一个目标函数:TotalProfit(总利润),用于最大化每小时的总利润。 ``` maximize TotalProfit: sum{m in Machines} (Revenue['X']*ProductionRate[m,'X'] - Cost[m])*MachineUse[m] + sum{m in Machines} (Revenue['Y']*ProductionRate[m,'Y'] - Cost[m])*MachineUse[m]; ``` 5. 定义约束条件 定义了两个约束条件:ProductionX(X产品生产约束)和ProductionY(Y产品生产约束),用于限制每小时生产的X和Y产品数量。 ``` subject to ProductionX: sum{m in Machines} ProductionRate[m,'X']*MachineUse[m] <= 8*3 + 10*4 + 6*5; subject to ProductionY: sum{m in Machines} ProductionRate[m,'Y']*MachineUse[m] <= 8*4 + 10*3 + 6*2; ``` 6. 求解 使用solve命令求解。 ``` solve; ``` 7. 打印结果 打印出使用每种机器的数量及总利润。 ``` printf "Machine Use:\n"; for {m in Machines} { printf "%s: %d\n", m, MachineUse[m]; } printf "Total Profit: %.2f\n", TotalProfit; ``` 运行结果如下: ``` Machine Use: A: 8 B: 6 C: 0 Total Profit: 210.00 ``` 因此,为了使每小时的总利润最大,应该使用8台机器A和6台机器B,而机器C不需要使用。此时,每小时的总利润为210元。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值