単純アルゴリズムで線形計画を解く
32614 ワード
「アルゴリズム導論」第七部分第29章は線形計画の単純性アルゴリズムについての解説があります.
ここにmingxinglai同志の学習ブログを添付します.コードにはバグがあり、正確に最適解を解除できませんでした.リンク:http://blog.csdn.net/lalor/article/details/7314134
また、線形計画の解決については、MATLABやLINGO、LINGOの方が専門的で、多パラメータにも適しています.
cygwinでコンパイルすることができます.g++を使う必要があります.そうでなければcan't find streamもgcc-lstdc++.中国語の文字セットを使わないとcygwinによく表示されません.他の集積開発環境でコンパイルして実行したほうがいいです.
原文のリンク:http://read.pudn.com/downloads107/sourcecode/windows/system/439107/%E5%8D%95%E7%BA%AF%E6%80%A7%E7%AE%97%E6%B3%95.cpp__.http
ここにmingxinglai同志の学習ブログを添付します.コードにはバグがあり、正確に最適解を解除できませんでした.リンク:http://blog.csdn.net/lalor/article/details/7314134
また、線形計画の解決については、MATLABやLINGO、LINGOの方が専門的で、多パラメータにも適しています.
cygwinでコンパイルすることができます.g++を使う必要があります.そうでなければcan't find streamもgcc-lstdc++.中国語の文字セットを使わないとcygwinによく表示されません.他の集積開発環境でコンパイルして実行したほうがいいです.
原文のリンク:http://read.pudn.com/downloads107/sourcecode/windows/system/439107/%E5%8D%95%E7%BA%AF%E6%80%A7%E7%AE%97%E6%B3%95.cpp__.http
1 // Visual C++
2 #include<iostream>
3 #include<cmath>
4 using namespace std;
5 #define M 10000
6 //
7 float kernel[11][31];//
8 int m=0,n=0,t=0;//m:
9 //n:
10 //t: :-1 ,1
11 //
12 void input()
13 {
14 //
15 cout<<"---------- -----------"<<endl;
16 cout<<" :"<<endl<<endl;
17 cout<<" m: "<<" m= ";
18 cin>>m;
19 cout<<endl<<" n:"<<" n= ";
20 cin>>n;
21 int i,j;
22 //
23 for (i=0;i<=n+1;i++)
24 for (j=0;j<=m+n+n;j++)
25 kernel [i][j]=0;
26 //
27 cout<<endl<<" (1 <=,-1 >=):"<<endl<<endl<<" ";
28 for (i=1;i<=m;i++)
29 cout<<" x"<<i;
30 cout<<" "<<" "<<endl;
31 for (i=1;i<=n;i++)
32 {
33 cout<<" "<<i<<" ";
34 for (j=1;j<=m+2;j++)
35 cin>>kernel [i][j];
36 }
37
38 for (i=1;i<=n;i++)
39 {
40 kernel [i][0]=kernel [i][m+2];
41 kernel [i][m+2]=0;
42 }
43 //
44 cout<<endl<<endl<<" ( :1; :-1):"<<endl<<endl<<" ";
45 for(i=1;i<=m;i++)
46 cout<<"x"<<i<<" ";
47 cout<<" "<<endl<<" ";
48 cout<<" : ";
49 for (i=1;i<=m;i++)
50 cin>>kernel [0][i];
51 cin>>t;
52 //
53 if(t==-1)
54 for(i=1;i<=m;i++)
55 kernel [0][i]=(-1)*kernel [0][i];
56 for(i=1;i<=n;i++)
57 {
58 kernel [i][m+i]=kernel [i][m+1];
59 if(i!=1)
60 kernel [i][m+1]=0;
61 }
62 }
63
64 //
65 void comput()
66 {
67 int i,j,flag,temp1,temp2,h,k=0,temp3[10];
68 float a,b[11],temp,temp4[11],temp5[11],f=0,aa,d,c;
69 //
70 for(i=1;i<=n;i++)
71 temp3[i]=0;
72 for(i=0;i<11;i++)
73 { temp4[i]=0;
74 temp5[i]=0;
75 }
76 for(i=1;i<=n;i++)
77 {
78 if(kernel [i][m+i]==-1)
79 {
80 kernel [i][m+n+i]=1;
81 kernel [0][m+n+i]=M;
82 temp3[i]=m+n+i;
83 }
84 else
85 temp3[i]=m+i;
86 }
87 for(i=1;i<=n;i++)
88 temp4[i]=kernel [0][temp3[i]];
89
90 //
91 do{
92 for(i=1;i<=m+n+n;i++)
93 {
94 a=0;
95 for(j=1;j<=n;j++)
96 a+=kernel [j][i]*temp4[j];
97 kernel [n+1][i]=kernel [0][i]-a;
98 }
99 for(i=1;i<=m+n+n;i++)
100 {
101 if(kernel [n+1][i]>=0) flag=1;
102 else
103 {
104 flag=-1;
105 break;
106 }
107 }
108 if(flag==1)
109 { for(i=1;i<=n;i++)
110 {
111 if(temp3[i]<=m+n) temp1=1;
112 else
113 {
114 temp1=-1;
115 break;
116 }
117 }
118 //
119 cout<<endl<<endl;
120 cout<<"---------- -----------"<<endl<<endl;
121 if(temp1==1)
122 {
123 cout<<" !"<<endl<<endl<<" :"<<endl<<endl<<" ";
124 for(i=1;i<=n;i++)
125 temp5[temp3[i]]=kernel [i][0];
126 for(i=1;i<=m;i++)
127 f+=t*kernel [0][i]*temp5[i];
128
129 for(i=1;i<=m;i++)
130 {
131 cout<<"x"<<i<<" = "<<temp5[i];
132 if(i!=m)
133 cout<<", ";
134 }
135 cout<<" ;"<<endl<<endl<<" f= "<<f<<endl<<endl;
136 return ;
137 }
138 else
139 {
140 cout<<" "<<endl<<endl;
141 return ;
142 }
143 }
144 if(flag==-1)
145 {
146 temp=100000;
147 for(i=1;i<=m+n+n;i++)
148 if(kernel [n+1][i]<temp)
149 {
150 temp=kernel [n+1][i];
151 h=i;
152 }
153
154 for(i=1;i<=n;i++)
155 {
156 if(kernel [i][h]<=0) temp2=1;
157 else {
158 temp2=-1;
159 break;
160 }
161 }
162 }
163 if(temp2==1)
164 {
165 cout<<" ";
166 return ;
167 }
168 if(temp2==-1)
169 {
170 c=100000;
171 for(i=1;i<=n;i++)
172 {
173 if(kernel [i][h]!=0) b[i]=kernel [i][0]/kernel [i][h];
174 if(kernel [i][h]==0) b[i]=100000;
175 if(b[i]<0) b[i]=100000;
176 if(b[i]<c)
177 {
178 c=b[i];
179 k=i;
180 }
181 }
182 temp3[k]=h;
183 temp4[k]=kernel [0][h];
184 d=kernel [k][h];
185 for(i=0;i<=m+n+n;i++)
186 kernel [k][i]=kernel [k][i]/d;
187 for(i=1;i<=n;i++)
188 { if(i==k)
189 continue;
190 aa=kernel [i][h];
191 for(j=0;j<=m+n+n;j++)
192 kernel [i][j]=kernel [i][j]-aa*kernel [k][j];
193 }
194 }
195
196 }
197 while(1);
198 return ;
199 }
200
201 //
202 int main()
203 { cout<<"------------------- ----------------------"<<endl<<endl;
204 input();
205 comput();
206 return 1;
207 }