1. 程式人生 > >用單純形法解決整數規劃問題

用單純形法解決整數規劃問題

現實生活中,比如機器的臺數,參與工作的人數,可調動的車輛數,這些資料都是整數。因此對於變數中包含整數、或者完全是整數的規劃問題,我們稱之為整數規劃。在解決整數規劃常用的演算法便是單純形法。

課題名稱:任務的分配

設有甲、乙、丙、丁四個人,各有能力去完成A、B、C、D、E五項任務中的任一項,由於四個人的能力和經驗不同,所需完成各項任務的時間如表1所示.由於任務數多於人數,要求考慮如下問題:

(1)       任務E必須完成,其他四項中可任選三項完成;

(2)       要求有一個人完成兩項任務,其他人各完成一項;

(3)       要求任務A可由甲或丙完成,任務C可由丙或丁完成,任務E可由甲、乙或丁完成,且規定四個人中丙或丁能夠完成兩項任務,其他人完成一項任務。

試分別確定最優的分配方案,使得完成任務的總時間最少。

表1   每個人完成各項任務的能力

專案

人員

A

B

C

D

E

25

29

31

42

37

39

38

26

20

33

34

27

28

40

32

24

42

36

23

45

    由於任務數大於人數,所以需要有一個虛擬的人,設為戊。因為工作E必須完成,故設戊完成E的時間為M(M為非常大的數),即戊不能做工作E,其餘的假想時間為0,建立的效率矩陣如表2:

表2   每個人完成各項任務的能力

專案

人員

A

B

C

D

E

25

29

31

42

37

39

38

26

20

33

34

27

28

40

32

24

42

36

23

45

0

0

0

0

M

令第 i 個人表示甲、乙、丙、丁、戊,第 j 個任務分別表示ABCD、E項任務,cij 表示第 i 個人完成第 j 個任務的時間(d)。設:

Z為完成任務的總時間(d)。則該問題的數學模型為:

為輸入程式方便,令M=1000.

方法一:Matlab求解

Matlab程式:

c=[25 29 31 42 37;39 38 26 20 33;34 27 28 40 32;24 42 36 23 45;0 0 0 0 1000];
n=size(c,1);  
c=c(:);
a=zeros(2*n,n^2);
for i=1:n
    a(i,(i-1)*n+1:n*i)=1;
    a(n+i,i:n:n^2)=1;
end
b=ones(2*n,1);
[x,y]=linprog(c,[],[],a,b,zeros(n^2,1),ones(n^2,1));
X=reshape(x,n,n);
X_min=round((X)),y

Matlab執行結果:

Optimization terminated.
X_min =
     0     1     0     0     0
     0     0     0     1     0
     0     0     0     0     1
     1     0     0     0     0
     0     0     1     0     0
y =105.0000

方案:甲——B ,乙——D ,丙——E ,丁——A ,  總時間為105(d).

方法二:lingo求解

Lingo程式:

model:
sets:
row/1..5/;
arrange/1..5/;
link(row,arrange):c,x;
endsets	
data:
c=25,29,31,42,37,39,38,26,20,33,34,27,28,40,32,24,42,36,23,45,0,0,0,0,1000;
enddata
[OBJ][email protected](link(i,j):c(i,j)*x(i,j));
x(1,1)+x(1,2)+x(1,3)+x(1,4)+x(1,5)=1;
x(2,1)+x(2,2)+x(2,3)+x(2,4)+x(2,5)=1;
x(3,1)+x(3,2)+x(3,3)+x(3,4)+x(3,5)=1;
x(4,1)+x(4,2)+x(4,3)+x(4,4)+x(4,5)=1;
x(5,1)+x(5,2)+x(5,3)+x(5,4)+x(5,5)=1;
x(1,1)+x(2,1)+x(3,1)+x(4,1)+x(5,1)=1;
x(1,2)+x(2,2)+x(3,2)+x(4,2)+x(5,2)=1;
x(1,3)+x(2,3)+x(3,3)+x(4,3)+x(5,3)=1;
x(1,4)+x(2,4)+x(3,4)+x(4,4)+x(5,4)=1;
x(1,5)+x(2,5)+x(3,5)+x(4,5)+x(5,5)=1;
@for(link(i,j):x(i,j)>=0;);
end

Lingo執行結果:

Global optimal solution found.
  Objective value:                              136.0000
  Infeasibilities:                              0.000000
  Total solver iterations:                             9
  Elapsed runtime seconds:                          0.04
               Variable           Value        Reduced Cost
               C( 1, 1)        25.00000            0.000000
               C( 1, 2)        29.00000            0.000000
               C( 1, 3)        1000.000            0.000000
               C( 1, 4)        42.00000            0.000000
               C( 1, 5)        37.00000            0.000000
               C( 2, 1)        1000.000            0.000000
               C( 2, 2)        38.00000            0.000000
               C( 2, 3)        1000.000            0.000000
               C( 2, 4)        20.00000            0.000000
               C( 2, 5)        33.00000            0.000000
               C( 3, 1)        34.00000            0.000000
               C( 3, 2)        27.00000            0.000000
               C( 3, 3)        28.00000            0.000000
               C( 3, 4)        40.00000            0.000000
               C( 3, 5)        1000.000            0.000000
               C( 4, 1)        1000.000            0.000000
               C( 4, 2)        42.00000            0.000000
               C( 4, 3)        36.00000            0.000000
               C( 4, 4)        23.00000            0.000000
               C( 4, 5)        45.00000            0.000000
               C( 5, 1)        34.00000            0.000000
               C( 5, 2)        27.00000            0.000000
               C( 5, 3)        28.00000            0.000000
               C( 5, 4)        23.00000            0.000000
               C( 5, 5)        45.00000            0.000000
               X( 1, 1)        1.000000            0.000000
               X( 1, 2)        0.000000            11.00000
               X( 1, 3)        0.000000            981.0000
               X( 1, 4)        0.000000            28.00000
               X( 1, 5)        0.000000            10.00000
               X( 2, 1)        0.000000            969.0000
               X( 2, 2)        0.000000            14.00000
               X( 2, 3)        0.000000            975.0000
               X( 2, 4)        0.000000            0.000000
               X( 2, 5)        1.000000            0.000000
               X( 3, 1)        0.000000            0.000000
               X( 3, 2)        0.000000            0.000000
               X( 3, 3)        1.000000            0.000000
               X( 3, 4)        0.000000            17.00000
               X( 3, 5)        0.000000            964.0000
               X( 4, 1)        0.000000            966.0000
               X( 4, 2)        0.000000            15.00000
               X( 4, 3)        0.000000            8.000000
               X( 4, 4)        1.000000            0.000000
               X( 4, 5)        0.000000            9.000000
               X( 5, 1)        0.000000            0.000000
               X( 5, 2)        1.000000            0.000000
               X( 5, 3)        0.000000            0.000000
               X( 5, 4)        0.000000            0.000000
               X( 5, 5)        0.000000            9.000000

lingo所得的方案與matlab一致。甲——B ,乙——D ,丙——E ,丁——A ,  總時間為105(d).

lingo的執行結果怎麼解讀的問題,我已經在上一篇“非線性規劃”的文章中說了,不再贅述,不懂的同學可以過去看一看,以後用lingo解決的問題還會有,不會每次都講解怎麼看執行結果哦,希望見諒,下面是“非線性規劃”文章的連結。

    整數規劃問題是線性規劃問題的一種特殊情況,本例題為典型的非標準形式的指派問題,根據題目的不同要求,相應地新增虛擬人或任務以及修改效率矩陣。另外,在轉換成程式語言時,引進的M可以任意取定一個較大的數,方便計算的進行。

相關推薦

單純解決整數規劃問題

現實生活中,比如機器的臺數,參與工作的人數,可調動的車輛數,這些資料都是整數。因此對於變數中包含整數、或者完全是整數的規劃問題,我們稱之為整數規劃。在解決整數規劃常用的演算法便是單純形法。 課題名稱:任務的分配 設有甲、乙、丙、丁四個人,各有能力去完成A、B、C、

線性規劃中的單純與內點(原理、步驟以及matlab實現)(三)

應用 最大化 round 並不是 兩個 生產 陰影 3.3 ima 在本系列的第三篇博客中,筆者討論對偶單純形法的相關理論和應用 2.3 Dual Simplex Method(對偶單純形法) Contents   2.3.1 對偶問題產生的原因   2.3.2 對偶問題的

線性規劃與單純

標準型 最大化 \(\sum\limits_{j=1}^{n}c_jx_j\) 滿足約束 \(\sum\limits_{j=1}^{n}a_{ij}x_j\le b_i\) \(i=1,2,...,m\) ​ \(x_j\ge 0\) \(j=1,2,...,m\)

bzoj3118: Orz the MST(線性規劃+單純

傳送門 不難發現,對於每一條樹邊肯定要減小它的權值,對於每一條非樹邊要增加它的權值 對於每一條非樹邊\(j\),他肯定與某些樹邊構成了一個環,那麼它的邊權必須大於等於這個環上的所有邊 設其中一條邊為\(i\),變化量為\(x\),那麼就要滿足\(w_i-x_i\leq w_j+x_j\),即\(x_i+

蒙特卡洛非線性整數規劃

code function [f,g]=mengte(x); f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)-8*x(1)-2*x(2)-3*x(3)... -x(4)-2*x(5); g(1)=sum(x)-400; g(2)=x(1)+2*x

MATLAB 單純演算法

線性規劃 單純形法演算法 MATLAB實現 例如:  問題一:假設產生Q1、Q2、Q3的量分別為X1、X2、X3,那麼 約束條件: P1量<1500,即 2X1+3X2+0X3 ≤1500 P2量<800, 即 0X1+2X2+4X3 ≤800 P

uoj#179 線性規劃 單純の模板

這是一道模板題。 本題中你需要求解一個標準型線性規劃: 有n個實數變數x1,x2,⋯,xn和m條約束,其中第i條約束形如aij*xj≤bi ,j∈(1,n),i∈(1,m) 此外這n個變數需要滿足非負性限制,即xj≥0。 在滿足

【BZOJ1061】[Noi2008]志願者招募【單純

雙倍經驗題,BZOJ3265。 先用對偶原則轉換成求對偶問題的解,這樣直接轉化成了標準型,然後跑Simplex就好了。 下面是對樣例的一個計算過程。 /* Footprints In The

單純演算法實現--java版

一般線性規劃問題具有線性方程組的變數數大於方程個數,這時會有不定的解。當決策變數個數n和約束條件個數m較大時,單純形法是求解線性規劃問題的通用方法。 對於單純形法的數學運算,那是理學院學生應該關注的問題,如果有不懂的,大家可以自行百度,我這裡只關注用程式實現單純形法; 本文

單純求解最函式極值問題 matlab程式碼

最近整理以前的程式碼,將以前老師上課的作業程式碼重新整理,分享出來,作業的內容是編寫單純形法,對測試函式進行尋優(極大值或者極小值)。 首先介紹一下單純形法:將上課的ppt轉化為圖片。ppt藍色背景,眼睛快看瞎了 按照ppt的

線性規劃的單純

單純形法1.將問題化為標準形式2 求出初始基可行解,列出單純形表3 進行最優化檢驗,若當前表中所有檢驗數γj<=0(目標max時),則表中的基可行解就是問題的最優解,停算,否則繼續4 從一個基可行解轉換到另一個目標函式值更大的基可行解,列出新的單純形表(1)確定換入基的

單純 -- 求解線性規劃

目前,運用最廣的線性規劃方法就是著名的單純形方法。這種方法是G.B.Dantzig在1947年提出的。幾十年的實踐證明,單純形方法的確是一種使用方便、行之有效的重要演算法。如今,它已經成為線性規劃的中心內容。 單純形法的基本思路是有選擇地取(而不是列舉所有的)

【BZOJ】【P3265】【志願者招募加強版】【題解】【單純

讀了一天算導,成功yy出單純形~~ Code: #include<bits/stdc++.h> using namespace std; const int maxn=10010; co

以前學運籌學寫的作業,單純(純C實現)

#include <stdio.h> #define N 5 #define M 3 int max(int x, int y) {          if(x>y)                    return(x);          else

【高階演算法】單純求解線性規劃問題(C++實現)

1 單純形法 (1) 單純形法是解線性規劃問題的一個重要方法。 其原理的基本框架為: 第一步:將LP線性規劃變標準型,確定一個初始可行解(頂點)。 第二步:對初始基可行解最優性判別,若最優,停止;否則轉下一步。 第三步:從初始基可行解向相鄰的

運籌系列1:線性規劃單純python程式碼

1. 模型 常見的線性規劃模型如下: max z=cxz=cx s.t. Ax=bAx=b 2. 求解步驟 假設B是基變數集合,通過矩陣的線性變換,基變數可由非基變量表示: x′i=ci+Σj∉Bmi,jx′j,(i∈B)xi′=ci+Σj∉Bm

[ch04-02] 梯度下降解決線性迴歸問題

系列部落格,原文在筆者所維護的github上:https://aka.ms/beginnerAI, 點選star加星不要吝嗇,星越多筆者越努力。 4.2 梯度下降法 有了上一節的最小二乘法做基準,我們這次用梯度下降法求解w和b,從而可以比較二者的結果。 4.2.1 數學原理 在下面的公式中,我們規定x是樣本特

譚浩強 c程序設計 8.17遞歸將一個整數n轉換成字符串。例如,輸入486,應輸出字符串"486"。n的位數不確定,可以是任意位數的整數

tco xsl bof hcl mku owb kit gym code 8.17用遞歸法將一個整數n轉換成字符串。例如,輸入486,應輸出字符串"486"。n的位數不確定,可以是任意位數的整數。 #include <stdio.h>char str1[20]

scala寫算-小根堆解決topK

app unit roo ast atm mark 構建 操作 mnt topK問題是指從大量數據中獲取最大(或最小)的k個數,比如從全校學生中尋找成績最高的500名學生等等. 本問題可采用小根堆解決.思路是先把源數據中的前k個數放入堆中,然後構建堆,使其保持堆序(可以簡單

Java中數值較大的double型別轉換為字串時會科學計數不使用千分位顯示的解決辦法

java.text.NumberFormat nf = java.text.NumberFormat.getInstance(); // 不使用千分位,即展示為11672283.234,而不是11,672,283.234 nf.setGroupingUsed(false); // 設