1. 程式人生 > >簡學LINGO(三)——例項篇

簡學LINGO(三)——例項篇

1. 裝配線平衡模型

一個裝配線含有一系列的工作站,在最終產品的加工過程中每個工作站執行一種或者是幾種特定的任務。裝配線週期是指所有工作站完成分配給他們各自任務所花費時間的最大值。平衡裝配線的目標是為每個工作站分配加工任務,儘可能使每個工作站執行相同數量的任務,其最終標準是轉配線週期最短。不適當的平衡裝配線將會產生瓶頸——有較少任務的工作站將被迫等待前面分配了較多工的工作站。

這個模型的目標是最小化裝配線週期,有兩類約束:

(1)要保證每件任務只能也必須分配至一個工作站來加工;

(2)要保證滿足任務件的所有優先關係。

例  有1件任務(A-K)分配到四個工作站(1-4),任務按次序如下。每件任務所花時間如下

任務

時間

A

45

B

11

C

9

D

50

E

15

F

12

G

12

H

12

I

12

J

8

K

9

這裡給出求解模型

model:
 !裝配平衡模型;
sets:
 !任務集合,有一個完成時間屬性T;
 TASK/A B C D E F G H I J K/:T;
 !人物之間的優先關係集合;
 PRED(TASK,TASK)/A,B B,C C,F C,G F,J G,J J,K
     D,E E,H E,I H,J I,J/;
 !工作站集合;
 STATION/1..4/;
 TXS(TASK,STATION):X;
 !X是派生集TXS的一個屬性。如果X(I,K)=I,則表示第I個任務指派給第K個工作站完成;
endsets
data:
 !任務A B C D E F G H I J K的完成時間估計如下;
enddata
 !當任務超過15個時,模型求解將變的很慢:
 !每一個作業必須指派到一個工作站中;
@for(TASK(I):@SUM(STATION(K):X(I,K))=1);
 !對於每一個存在有限關係的作業來說,前者對應的工作站I必須小於後者對應的工作站J;
@for(PRED(I,J):@sum(STATION(K):K*X(J,K)-K*X(I,K))>=0);
 !對於每一個工作站來說,其花費時間不應大於裝配線週期;
@for(STATION(K):
  @SUM(TXS(I,K):T(I)*X(I,K))<+CYCTIME);
 !目標函式時最小化轉配線週期;
min=CYCTIME;
 !指定X(I,J)為0/1變數;
@for(TXS:@BIN(X));
end

2.旅行售貨員問題,又稱貨郎擔問題

有一個銷售員,從城市1出發,要遍訪城市2,3,。。。,n個一次,最後返回城市1.已知從城市i到j的旅費為Cij,問他該按怎樣的次序訪問這些城市,是得總旅費最少?可以用多中方方法把TSP表示成整數規劃模型。把該問題的每一個解看做時一個巡迴。

在上述意義下,引入0-1整數變數
 

經過若干證明,這裡就不在闡述了,我們可以把TSP轉化為一個混合整數規劃問題

 

 這裡我們可以利用這個問題來求解一個具體問題

 問題1  現需要一臺機器上加工n個零件,這些零件可以按照任意先後順序在機器上進行加工。我們希望加工完成所有零件的總時間最小。由於加工工藝的要求,加工零件j時機器不許處在相應的狀態Sj(如爐溫)。設起始未加工任何零件時機器處於狀態S0,且當所有零件加工完成後需回覆到S0狀態。已知從狀態Si調整到Sj需要時間Cij。零件j本身加工時間為Pj。為方便起見,引入一個徐零件0,其中加工時間為0,要求狀態為S0。則{0,1,2,。。。,n}的一個圈置轉換pi就表示對所有零件的一個加工順序,則完成所有加工所需時間為

這裡給出一個解決該模型的一個簡單的程式碼,就是套用上面的模型

!旅行售貨員問題;
model:
sets:
  city/1..5/:u;
  link(city,city):dist,x;
endsets
  [email protected](city);
data:
  [email protected](1);!隨即產生,這裡可以改為你要解決的問題的資料;
enddata
 !目標函式;
[email protected](link:dist*x);
@for(city(K):
  @sum(city(I)|I#ne#K:x(I,K))=1;
  @sum(city(J)|J#ne#K:x(K,J))=1;
);

!保證不出圈子;
@for(city(I)|I#gt#1:
  @for(city(J)|J#gt#1 #and# I#ne#j:
     u(I)-u(J)+n*x(I,J)<=n-1);
);
!定義X為0/1變數;
@for(link:@bin(x));
end


3.最短路問題

給定N個點Pi組成集合{Pi},由集合中任一點Pi到另一點Pj的距離用Cij表示,如果Pi到Pj沒有弧連線,則規定Cij=正無窮大,有規定Cii=0,指定一個終點PN,要求從Pi到PN的最短路線。這裡我們用動態規劃的方法來做。

 

 又LINGO我們可以很方便的求解上述的模型

!最短路問題;
model:
data:
  n=10;
enddata
sets:
  cities/1..n/:F;
  roads(cities,cities)/
	1,2 1,3
	2,4 2,5 2,6
	3,4 3,5 3,6
	4,7 4,8
	5,7 5,8 5,9
	6,8 6,9
	7,10
	8,10
	9,10
/:D,P;
endsets
data:
D=
	6 5                 !該矩陣即為傳說中的權重矩陣
	3 6 9
	7 5 11
	9 1
	8 7 5
	4 10
	5
	7
	9;
enddata
F(n)=0;
@for(cities(i)|i#lt#n:
  F(i)[email protected](roads(i,j):D(i,j)+F(j));
);
!顯然,如果P(i,j)=1,則點i到點n的最短路徑的第一步是i——j,否則就不是
由此,我們就可方便的確定出最短路徑;
@for(roads(i,j):
	P(i,j)[email protected](F(i)#eq#D(i,j)+F(j),1,0)
);
end

4.分配問題或稱指派問題

這是給n個人分配n項工作以或得摸個最高效果的問題。第i個人完成第j項工作需要的平均時間為Cij。要求給每個人分配一項工作,並要求分配完這些工作,以使完成全部任務的總時間最小。該問題可以表示如下
 

 這個模型可以用LINGO很方便的求解

model:
  !7個工人,7個工作的分配問題;
sets:
	workers/w1..w7/;
	jobs/j1..j7/;
	links(workers,jobs):cost,volume;
endsets
  !目標函式;
	[email protected](links:cost*volume);
  !每個人只能有一份工作;
	@for(workers(I):
		@sum(jobs(J):volume(I,J))=1;
	);
data:
	cost=6 2 6 7 4 2 5
	     4 9 5 3 8 5 8
	     5 2 1 9 7 4 3
	     7 6 7 3 9 2 7
	     2 3 9 5 7 2 6
	     5 5 2 2 8 11 4
	     9 2 3 12 4 5 10;
enddata
end 	

5.二次分配問題

這個問題與上面的分配問題 ,大致相同。同樣要引入0-1變數,而且和上述問題有同樣的約束 。但是本問題又比約束問題要複雜。我們得到價格係數Cijkl,其解釋是:在i(S上網一個元素)分配給j(T的一個元素)的同時把k(s的一個元素)分配給l(T的一個元素)所應承擔的費用。顯然只有當xij=1且xkl=1時,才承擔這種費用。這時我們的模型要變成這樣

 為了理解這個模型,我們在這裡加入這個例子。首先認為S是一個工廠的集合,T是n個城市的集合。本問題就是要在每一個城市設定一個工廠,並要使工廠之間的總得通訊費用最少。通訊費用取決於:(1)每對工廠之間通訊的次數tik;(2)每對工廠所在兩個城市之間的距離djl。所以就有cijkl=tik*djl(各位大仙湊活的看啊。。。)。因此總費用可以用上述的目標函式來表示。

這裡給出一個很經典的題目,也是我遇到的第一道建模問題。想當年不知道lingo的好處,硬是憑著對C++的執拗,用了一堆疊啊,連結串列向量什麼的用窮舉給退出來啊,當時多麼的自豪,哈哈哈

例:有四名同學到一家公司去參加三個階段的面試:公司要求每個同學必須先找祕書初試,然後到部門主管去複製,最後到經理處去面試,並且不允許插隊。由於四名同學的專業背景不同,所以沒人在三個階段的面試時間也不一樣,如下表。這四名同學約定他們全部面試完成以後一起離開公司,問他們最快用多長時間完成面試?

 

這裡給出求解的程式碼

!三階段面試模型;
model:
sets:
	students;!學生集三階段面試模型;
	phases;!階段集;
	sp(students,phases):t,x;
	ss(students,students)|&1 #lt# &2:y;
endsets
data:
	students=s1..s4;
	phases=p1..p3;
	t=
		13 15 20
		10 20 18
		20 16 10
		8  10 15;
enddata
	[email protected](students);!學生數;
	[email protected](phases);!階段數
	
	!單個學生面試時間先後順序的約束;
	@for(sp(I,J)|J#LT#np:
		x(I,J)+t(I,J)<=x(I,J+1)
	);
	!學生間的面試先後次序保持不變的約束;
	@for(ss(I,K):
		@for(phases(J):
		x(I,J)+t(I,J)-x(K,J)<=200*y(I,K);
		x(K,J)+t(K,J)-x(I,J)<=200*(1-y(I,K));
		)
	);
	min=TMAX;
	@for(students(I):
		x(I,3)+t(I,3)<=TMAX
	);
	!把Y定義0-1變數;
	!把Y定義0-1變數;
	@for(ss:@bin(y));
end

 以後如果遇到相應的更好的模型是,我會有選擇的加上的。

相關推薦

LINGO——例項

1. 裝配線平衡模型 一個裝配線含有一系列的工作站,在最終產品的加工過程中每個工作站執行一種或者是幾種特定的任務。裝配線週期是指所有工作站完成分配給他們各自任務所花費時間的最大值。平衡裝配線的目標是為每個工作站分配加工任務,儘可能使每個工作站執行相同數量的任務,其最終標準是

Spring極學習例項化Bean的方法有兩種

其實例項化一個Bean並沒有那麼複雜,不就是將new Bean()的過程放到Spring這裡來實現了嗎? 其實的確如此,當然了,之前的設計模式中的例項化Bean的方式Spring也得支援支援吧。 一、最直觀例項化(反射模式) xml配置 <bean id="car1

C++學習入門——函數

image clu square src 函數接口 值類型 使用 mes 技術分享 C++函數分兩種:有返回值的和沒返回值的 1.有返回值的函數 調用函數流程 如圖,sqrt(6.25)為函數調用,

Linux系統運維常見面試答題系列9題

connect 切換 -a ip) 整理 程序 strong ack 自己 1. 寫一個sed命令,修改/tmp/input.txt文件的內容,要求:(1) 刪除所有空行;(2) 一行中,如果包含”11111″,則在”11111″前面插入”AAA”,在”11111″後面插入

如何“謹慎”使用“數據驅動”的風控模型——監控

pro sha nag -o 異常 靈活 目的 去除 決策體系 之前小編介紹了謹慎使用“數據驅動”的風控模型,需要“高質量的數據 + 審慎嚴謹的決策模型 + 實時全面的監控分析”動態閉環。動態閉環能夠“動態”起來,需要最後一個步驟“監控”把關,全面、細致的分析、評估決策效果

跟著文檔Vue——組件基礎

ont err -s fontsize itl IE alert -i -a <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <me

java基礎python--------列表,元組

 列表:相當於java中的list用法 下標用法與python中的字串相似也可以用-1等負數來表示 也可以使用*重複用法 可以使用in關鍵字用法 也可以求長度:len(list) for迴圈可以遍歷表內元素 列表的方法: 賦值與java中相似,python中可以用切片的方式給

從零開始演算法插入排序

從零開始學演算法(三)插入排序 插入排序 演算法介紹 演算法原理 演算法簡單記憶說明 演算法複雜度和穩定性 程式碼實現 插入排序 程式碼是Javascript語言寫的(幾乎是虛擬碼) 演算

計算機圖形實驗——中點畫圓演算法實現及其原始碼

1.中點畫圓演算法簡介:(以第一象限內靠近Y軸的1/8圓為例) 由於圓的對稱性,只需要考慮的圓上的點。舉例: 引入建構函式:。 分別表示點在圓外,圓上,圓內。 如圖3-8所示:.M是P1和P2中點。 當F(M)<0時,說明M在圓內,進而得知P1離圓弧更近;否則P

學生資訊管理系統總結——優化

enter,esc鍵設定 確定按鈕屬性default------→true 取消按鈕屬性cancel------→true 窗體中心位置展現 首先將窗體介面通過滑鼠拖拽,達到介面大小適中 接著檢視屬性中的height,width屬性數值,將該數值填入下面程式碼中 from中新增以

Linux之《荒島餘生》記憶體

記憶體問題,腦瓜疼腦瓜疼。腦瓜疼的意思,就是腦袋運算空間太小,撐的疼。本篇是《荒島餘生》系列第三篇,讓人腦瓜疼的記憶體篇。其餘參見: Linux之《荒島餘生》(一)準備篇 Linux之《荒島餘生》(二)CPU篇 小公司請求量小,但喜歡濫用記憶體,開一堆執行緒,大把大把往jvm塞物件,最終問題是記憶體溢位

機器學習極入門教程

這是機器學習入門教程系列的第三部分,點選這裡跳轉到第一部分,點選這裡跳轉到第二部分。 part6 通過前面的學習,我們掌握了用已有資料對目標進行預測的方法。在使用模型的時候,有些人或許會好奇,模型究竟是怎樣的?這裡我們通過一個獨特的視角——部分依賴圖(Partial De

小白Python------迴圈

一、while迴圈 <1> while迴圈的格式 while 條件: 條件滿足時,做的事情1 條件滿足時,做的事情2 條件滿足時,做的事情3 … demo: i = 0 while i < 5: print(“當前是第%d次執行迴圈” % (i + 1)) print(

資料庫視訊——總結

** 前言 從接觸到學習資料庫也有一段時間了,不同階段對資料庫的認識和理解也是不一樣的。對於較早知道的知識,通過看資料庫視訊更加深入的理解了;對於現在剛知道的知識,通過看資料庫視訊拓寬了瞭解的知識面。本篇博文僅對資料庫中涉及到的知識點進行總結

Docker入門實踐筆記文章搞懂Docker下安裝Redis,以及Redis與SpringBoot整合

@Configuration public class RedisConfig { ​ /** * 注入 RedisConnectionFactory */ @Autowired RedisConnectionFactory redisConnectionFacto

大學生程式設計:選擇自學還是培訓?

什麼人適合自學程式設計? 1.堅強的毅力,自學程式設計一個很大的特點自己監督自己,沒有外來的管控,自制力差的很難的很難堅持到最後,有多少人買了本書開始學習程式設計,學了沒有多久就把書扔的遠遠的,等下次再看見已經是幾個月或者半年之後的事情了,所以意志力不強的或者自制力差的不適合。  

演算法快筆記:選擇排序的原理與實現

1. 原理介紹 選擇排序是個簡單的排序,思路主要通過多次遍歷待排序的集合,每次彈出最大/小值並放入新的集合,直到原始集合為空。舉個例子: 假設要對A=[1,2,5,9,3]按照升序的方式進行排序,步驟與結果如下 從A中找出最大值,將其pop,並放入B中,執行後的結果如下:

一起Netty之 SimpleChannelInboundHandler

 其實Netty的知識點還是很零碎的,比如這個SimpleChannelInboundHandler這個類,在《Netty in Action》該書中的原版的Hello world的demo的客戶端就是使用的SimpleChannelInboundHandler來作為處理

學習筆記| AS入門 佈局

在我們之前的學習過程中,總是需要和.xml佈局檔案接觸,那佈局到底是什麼呢?佈局是指頁面內容該如何排布,比如控制元件和父容器的位置關係以及控制元件與控制元件之間的位置關係是怎樣的。其實除了最常見的LinearLayout 線性佈局、RelativeLayout

跟我一起python,python基本資料型別和函式

三元運算: 三元運算(三目運算),是對簡單的條件語句的縮寫。 # 書寫格式 result = 值1 if 條件 else 值2 # 如果條件成立,那麼將 “值1” 賦值給result變數,否則,將“值2”賦值給result變數 if a == 1: