最優解演算法
A. C語言最優解演算法
#include<stdio.h>
int result[100][6];
int data[100000][2];
int main()
{
int i,j,T,f,temp,rlen=0,dlen,swap;
scanf("%d",&T);
while(T-->0)
{
for(dlen=0;1;dlen++)
{
scanf("%d %d",&data[dlen][0],&data[dlen][1]);
if(0==data[dlen][0] && 0==data[dlen][1])
break;
}
scanf("%d",&f);
for(i=0;i<dlen-1;i++)
{
for(j=0;j<dlen-i-1;j++)
{
swap=0;
if(0==f)
{
if(data[j][0]>data[j+1][0] || (data[j][0]==data[j+1][0] && data[j][1]>data[j+1][1]))
{
swap=1;
}
}
else if(1==f)
{
if(data[j][1]>data[j+1][1] || (data[j][1]==data[j+1][1] && data[j][0]>data[j+1][0]))
{
swap=1;
}
}
if(1==swap)
{
temp=data[j][0];
data[j][0]=data[j+1][0];
data[j+1][0]=temp;
temp=data[j][1];
data[j][1]=data[j+1][1];
data[j+1][1]=temp;
}
}
}
if(dlen>=3)
{
for(i=0;i<3;i++)
{
result[rlen][2*i]=data[i][0];
result[rlen][2*i+1]=data[i][1];
}
rlen++;
}
}
for(i=0;i<rlen;i++)
{
printf("Case #%d:\n",i+1);
for(j=0;j<3;j++)
printf("%d %d\n",result[i][2*j],result[i][2*j+1]);
}
return 0;
}
B. 【C語言演算法】求最優解
#include<stdio.h>
voidmain()
{
doubleV;
printf_s("請輸入V: ");
scanf_s("%lf",&V);
intm,n,p;
intM,N,P;
doubledelta=10000.0;
for(m=0;m<=16;m++)
{
for(n=0;n<=256;n++)
{
for(p=1;p<=4096;p++)
{
doubled=m*n/(double)p-V;
if(d<0)
d=-d;
if(d<delta)
{
delta=d;
M=m;
N=n;
P=p;
}
}
}
}
printf_s("最優解:M=%d,N=%d,P=%d ",M,N,P);
}
C. 請問數錢的貪婪演算法怎樣確保得到最優解
貪婪演算法:總是作出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,它所做出的僅是在某種意義上的局部最優解。
(註:貪婪演算法不是對所有問題都能得到整體最優解,但對范圍相當廣泛的許多問題它能產生整體最優解。但其解必然是最優解的很好近似解。
基本思路:——從問題的某一個初始解出發逐步逼近給定的目標,以盡可能快的地求得更好的解。當達到某演算法中的某一步不能再繼續前進時,演算法停止
實現該演算法的過程:
從問題的某一初始解出發;
while 能朝給定總目標前進一步 do
求出可行解的一個解元素;
由所有解元素組合成問題的一個可行解;
基本要素:
1、 貪婪選擇性質:所求問題的整體最優解可以通過一系列局部最優的選擇,即貪婪選擇來達到。(與動態規劃的主要區別)
採用自頂向下,以迭代的方式作出相繼的貪婪選擇,每作一次貪婪選擇就將所求問題簡化為一個規模更小的子問題。
對於一個具體問題,要確定它是否具有貪婪選擇的性質,我們必須證明每一步所作的貪婪選擇最終導致問題的最優解。通常可以首先證明問題的一個整體最優解,是從貪婪選擇開始的,而且作了貪婪選擇後,原問題簡化為一個規模更小的類似子問題。然後,用數學歸納法證明,通過每一步作貪婪選擇,最終可得到問題的一個整體最優解。
2、最優子結構性質:包含子問題的最優解
1、 設有n個活動的安排,其中每個活動都要求使用同一資源,如演講會場,而在同一時間只允許一個活動使用這一資源。每個活動都有使用的起始時間和結束時間。問:如何安排可以使這間會場的使用率最高。
活動 起始時間 結束時間
1 1 4
2 3 5
3 0 6
4 5 7
5 3 8
6 5 9
7 6 10
8 8 11
9 8 12
10 2 13
11 12 14
演算法:一開始選擇活動1,然後依次檢查活動一i是否與當前已選擇的所有活動相容,若相容則活動加入到已選擇的活動集合中,否則不選擇活動i,而繼續檢查下一活動的相容性。即:活動i的開始時間不早於最近加入的活動j的結束時間。
Prodere plan;
Begin
n:=length[e];
a {1};
j:=1;
for i:=2 to n do
if s[i]>=f[j] then
begin a a∪{i};
j:=i;
end
end;
例1 [找零錢] 一個小孩買了價值少於1美元的糖,並將1美元的錢交給售貨員。售貨員希望用數目最少的硬幣找給小孩。假設提供了數目不限的面值為2 5美分、1 0美分、5美分、及1美分的硬幣。售貨員分步驟組成要找的零錢數,每次加入一個硬幣。選擇硬幣時所採用的貪婪准則如下:每一次選擇應使零錢數盡量增大。為保證解法的可行性(即:所給的零錢等於要找的零錢數),所選擇的硬幣不應使零錢總數超過最終所需的數目。
假設需要找給小孩6 7美分,首先入選的是兩枚2 5美分的硬幣,第三枚入選的不能是2 5美分的硬幣,否則硬幣的選擇將不可行(零錢總數超過6 7美分),第三枚應選擇1 0美分的硬幣,然後是5美分的,最後加入兩個1美分的硬幣。
貪婪演算法有種直覺的傾向,在找零錢時,直覺告訴我們應使找出的硬幣數目最少(至少是接近最少的數目)。可以證明採用上述貪婪演算法找零錢時所用的硬幣數目的確最少(見練習1)。
D. Matlab神經網路原理中可以用於尋找最優解的演算法有哪些
若果對你有幫助,請點贊。
神經網路的結構(例如2輸入3隱節點1輸出)建好後,一般就要求神經網路里的權值和閾值。現在一般求解權值和閾值,都是採用梯度下降之類的搜索演算法(梯度下降法、牛頓法、列文伯格-馬跨特法、狗腿法等等),這些演算法會先初始化一個解,在這個解的基礎上,確定一個搜索方向和一個移動步長(各種法算確定方向和步長的方法不同,也就使各種演算法適用於解決不同的問題),使初始解根據這個方向和步長移動後,能使目標函數的輸出(在神經網路中就是預測誤差)下降。 然後將它更新為新的解,再繼續尋找下一步的移動方向的步長,這樣不斷的迭代下去,目標函數(神經網路中的預測誤差)也不斷下降,最終就能找到一個解,使得目標函數(預測誤差)比較小。
而在尋解過程中,步長太大,就會搜索得不仔細,可能跨過了優秀的解,而步長太小,又會使尋解過程進行得太慢。因此,步長設置適當非常重要。
學習率對原步長(在梯度下降法中就是梯度的長度)作調整,如果學習率lr = 0.1,那麼梯度下降法中每次調整的步長就是0.1*梯度,
而在matlab神經網路工具箱里的lr,代表的是初始學習率。因為matlab工具箱為了在尋解不同階段更智能的選擇合適的步長,使用的是可變學習率,它會根據上一次解的調整對目標函數帶來的效果來對學習率作調整,再根據學習率決定步長。
機制如下:
if newE2/E2 > maxE_inc %若果誤差上升大於閾值
lr = lr * lr_dec; %則降低學習率
else
if newE2 < E2 %若果誤差減少
lr = lr * lr_inc;%則增加學習率
end
詳細的可以看《神經網路之家》nnetinfo里的《[重要]寫自己的BP神經網路(traingd)》一文,裡面是matlab神經網路工具箱梯度下降法的簡化代碼
E. cplex求最優解和演算法求解,哪個更好二者有什麼區別嗎
需要根據你的問題特性,演算法求解還涉及到你用的具體演算法,可以用現在已有的演算法,也可以自己寫演算法,這些都會影響到求解的效果,不能簡單一句cplex和演算法比較哪個優劣。
而且根據規劃的不同,使用的軟體以及方法也會有差別。
cplex可以求導最優解,但大規模的話可能時間會長。
F. 局部最優解既然不是整體最優解,那貪心演算法有什麼用途啊
一個演算法並不能說它沒有用,只不過在此方面沒有用而已,但在彼方面會有用。所以要掌握更多的演算法,以備以後的使用。
G. 神經網路演算法可以求最優解嘛
神經網路可以做優化問題,但不一定能找到最優解。
邏輯性的思維是指根據邏輯規則進行推理的過程;它先將信息化成概念,並用符號表示,然後,根據符號運算按串列模式進行邏輯推理;這一過程可以寫成串列的指令,讓計算機執行。
直觀性的思維是將分布式存儲的信息綜合起來,忽然間產生的想法或解決問題的辦法。這種思維方式的根本之點在於以下兩點:
1、信息是通過神經元上的興奮模式分布存儲在網路上。
2、信息處理是通過神經元之間同時相互作用的動態過程來完成的。
神經網路:
思維學普遍認為,人類大腦的思維分為抽象(邏輯)思維、形象(直觀)思維和靈感(頓悟)思維三種基本方式。
人工神經網路就是模擬人思維的第二種方式。這是一個非線性動力學系統,其特色在於信息的分布式存儲和並行協同處理。雖然單個神經元的結構極其簡單,功能有限,但大量神經元構成的網路系統所能實現的行為卻是極其豐富多彩的。
H. 由一個演算法在任何一組可行解中求出的最優解被稱為是近似解嗎
遺傳演算法還有另一個收斂的判斷標准,就是目前解不大可能再改善了。判斷方法可以是解有好多輪都不改變了。
或者乾脆人為設定一個足夠大的迭代次數。