最优解算法
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. 由一个算法在任何一组可行解中求出的最优解被称为是近似解吗
遗传算法还有另一个收敛的判断标准,就是目前解不大可能再改善了。判断方法可以是解有好多轮都不改变了。
或者干脆人为设定一个足够大的迭代次数。